霍夫变换的原理
基本内容
百度百科中这一段叙述的非常好!这里就不多说了,简而言之:
将待检测画面上的无数小线段都延伸为直线,直线必然会通过某点,如果某点被通过的次数非常多,那说明相同方向的小线段非常多,多到形成一个足够通过检测的直线(线段)。
同理,将笛卡尔坐标系转换为极坐标系,就可以求得一点
(r0,θ0)
来确定一条直线,而通过该点的直线多得超过某个阈值,就说明画面上存在一条足够长的直线(线段)可以被检测到。
代码
关于对毛星云先生《Opencv3编程入门》这本书,这一章节的代码部分提出一点修改建议。
1、在Opencv3中,头文件包括 opencv2/opencv.hpp 即可。
2、在Opencv3中,Canny()函数的输入图像必须是单通道图像,因此,在该书p273页示例程序中,读取srcImage时应读入灰度图像,在进行Canny边缘检测后不需要转换颜色模型。
#include<opencv2/opencv.hpp>
#include<vector>
using namespace cv;
using namespace std;
int main(){
Mat scrImage = imread("C:/Users/eva72/Documents/VS2013_Projects/Projects/StudyOpenCV/EE.jpg");
Mat midImage;
cvtColor(scrImage, midImage, CV_RGB2GRAY);
Canny(midImage, midImage, 50, 150);
vector<Vec2f> lines;
HoughLines(midImage, lines, 1, CV_PI / 360, 150);
for (int i = 0; i < lines.size(); i++){
float rho = lines[i][0]; float theta = lines[i][1];
//根据求得的极坐标划线
Point x, y;
x.x = (int)(rho / cos(theta));
x.y = 0;
y.x = 0;
y.y = (int)(rho / sin(theta));
line(scrImage, x, y, Scalar(55, 100, 195));
}
imshow("效果", scrImage);
waitKey(6000);
return 0;
}
如有错误之处还请指正。