霍夫直线变换主要用于直线特征的检测,其主要思想如下
1.将图形中的点从空域坐标(x,y)转化为极坐标 x=ρcosθ,y=ρsinθ,R2=(ρcosθ)2+(ρsinθ)2
2.对极坐标进行变换,转化为θ与R的关系
R2=R2cos2θ+R2sin2θ
R=Rcos2θ+Rsin2θ
R=xcosθ+ysinθ,将xy看成定值,该公式表达R与θ的关系,可以在坐标系中用曲线表示,横坐标为θ,纵坐标为R
3.检测多个R-θ曲线的交点
为什么找交点?
以上图为例,如果右边两个区线相交,表示不同的点(x1,y1),(x2,y2)具有相同的θ和R,也就是说我们检测的这两个点在极坐标表示中是处于同一条直线上的,对于要检测的直线,如果它上面的点画出的曲线都可以相交于一点,那么说明他是一条直线
示例代码
#include<iostream> #include<opencv2/opencv.hpp> using namespace std; using namespace cv; int main(int argc, char** argv) { Mat src, src_gray, dst; src = imread("1.jpg"); if (!src.data) { printf("load img error "); return -1; } char INPUT_TITLE[] = "Input img"; char OUTPUT_TITLE[] = "hough-line-detection"; namedWindow(INPUT_TITLE, CV_WINDOW_AUTOSIZE); namedWindow(OUTPUT_TITLE, CV_WINDOW_AUTOSIZE); imshow(INPUT_TITLE, src); Canny(src, src_gray, 100, 200); cvtColor(src_gray, dst, CV_GRAY2BGR); imshow("edge_image", src_gray); vector<Vec4f> plines; HoughLinesP(src_gray, plines, 1, CV_PI / 180.0, 10, 0, 20); 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, 3, LINE_AA); } imshow(OUTPUT_TITLE, dst); waitKey(0); return 0; }
先进行灰度转化,然后将检测结果颜色设为红色,以向量形式存放
HoughLinesP就是opencv中的霍夫直线变换api前两个是输入输出,1表示极坐标生成时扫描像素的步长,∏/180是横坐标取点的频率,第一个10表示最少重合点个数,第二个10表示两点间隔最大距离
结果如图