- 霍夫直线变换
- 直线的方程表示可以由斜率和截距表示
- 用参数空间(k,b)也是可以表示一条直线的
- 但是存在k-->∞的情况,因此提出霍夫变换
- 用参数(r,θ)霍夫空间,可以直接表示直线
- 在霍夫空间中, 每一个点(r,θ)表示一条直线
- 笛卡尔坐标系中, 以一定点(x0,y0)做的所有的线,在极坐标系中显示为一正弦曲线, 显然改变定点,即移动该曲线,
- 极坐标中正弦曲线有m个交点, 即笛卡尔坐标系中m个共线的点
- 直线检测实现
- 显然我们可以把所有的像素点都利用hough变换转换到极坐标系中
- 如果图片有几条直线, 那必然有很多像素点是共线的, 反映在极坐标中就是有几个点的颜色是非常深的
- 提取这几个点,反变换到笛卡尔坐标系, 即找到直线
- API
- 标准霍夫变换: HoughLines从平面坐标转换到霍夫空间,返回(θ, r)
-
cv::HoughLines(
InputArray src, // 输入图像,必须8-bit的灰度图像
OutputArray lines, // 输出的极坐标来表示直线
double rho, // 生成极坐标时候的像素扫描步长
double theta, //生成极坐标时候的角度步长,一般取值CV_PI/180
int threshold, // 阈值,只有获得足够交点的极坐标点才被看成是直线
double srn=0;// 是否应用多尺度的霍夫变换,如果不是设置0表示经典霍夫变换
double stn=0;//是否应用多尺度的霍夫变换,如果不是设置0表示经典霍夫变换
double min_theta=0; // 表示角度扫描范围 0 ~180之间, 默认即可
double max_theta=CV_PI
) // 一般情况是有经验的开发者使用,需要自己反变换到平面空间
-
- 霍夫变换直线HoughLinesP,返回直线的两个点(x0,y0, x1,y1);
-
HoughLinesP(
InputArray src, // 输入图像,必须8-bit的灰度图像
OutputArray lines, // 输出的极坐标来表示直线
double rho, // 生成极坐标时候的像素扫描步长,一般为1
double theta, //生成极坐标时候的角度步长,一般取值CV_PI/180
int threshold, // 阈值,只有获得足够交点的极坐标点才被看成是直线
double minLineLength=0;// 最小直线长度
double maxLineGap=0;// 最大间隔
)
-
-
步骤:
-
先边缘检测
-
再hough检测
-
- 标准霍夫变换: HoughLines从平面坐标转换到霍夫空间,返回(θ, r)
- 直线的方程表示可以由斜率和截距表示
#include "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>
#include <string>
using namespace std;
using namespace cv;
int main(int argc, char ** argv)
{
Mat src, dst;
src = imread("C:\\Users\\xujin\\Desktop\\test1.JPG");
if (!src.data)
{
cout << "no image";
return -1;
}
namedWindow("src_imgae", WINDOW_AUTOSIZE);
namedWindow("src_gray_imgae", WINDOW_AUTOSIZE);
namedWindow("dst_imgae", WINDOW_AUTOSIZE);
imshow("src_image", src);
Mat src_gray;
Canny(src, src_gray, 100, 200);
imshow("src_gray_image", src_gray);
cvtColor(src_gray, dst, CV_GRAY2BGR);
vector<Vec4f>plines;
HoughLinesP(src_gray, plines, 1, CV_PI / 180.0, 10, 0, 5);
Scalar color = Scalar(0, 0, 255);
for (size_t i = 0; i < plines.size(); i++)
{
Vec4f hline = plines[i];
line(dst, Point(hline[0], hline[1]), Point(hline[2], hline[3]), color, 1, LINE_AA);
}
imshow("dst_image", dst);
waitKey(0);
return 0;
}