注意
下面的解释属于Bradski和Kaehler 的“ 学习OpenCV ”一书。
对于Hough 变换,我们将在极地系统中表达线条。因此,线性方程可以写为:
排列术语:r=xcosθ+ysinθ
意思是每一对的 (rθ,θ)表示通过每一排的 (x0,y0)
我们只需考虑这样的情况: r>0 和 0<θ<2π.
三个曲线在一个点(0.925,9.6)相交,这些坐标是参数 ( θ,r) 或其中(x0,y0), (x1,y1) 和 (x2,y2) lay.
OpenCV实现了两种Hough线变换:
一个。标准Hough变换
湾 概率霍夫线变换
加载图像应用标准Hough Line变换或概率线变换。在两个窗口中显示原始图像和检测到的线:
//#include "opencv2/imgcodecs.hpp"
//#include "opencv2/highgui.hpp"
//#include "opencv2/imgproc.hpp"
#include
#include
#include
using namespace cv;
using namespace std;
Mat src, cdst, dst;
int main(int argc, char** argv) {
src = imread("C:/usr/opencv-test/Testpictures/sight.jpg");
if (!src.data) {
printf("could not load image...\n");
return -1;
}
char INPUT_TITLE[] = "input image";
namedWindow(INPUT_TITLE, CV_WINDOW_AUTOSIZE);
//imshow(INPUT_TITLE, src);
Canny(src, dst, 50, 200, 3);
cvtColor(dst, cdst, COLOR_GRAY2BGR);
vector lines;
HoughLinesP(dst, lines, 1, CV_PI / 180.0, 10, 0, 0);
for (size_t i = 0; i < lines.size(); i++)
{
Vec4f l = lines[i];
line(cdst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 0, 255), 3, LINE_AA);
}
imshow(INPUT_TITLE, src);
imshow("detected lines", cdst);
waitKey(0);
return 0;
}
Canny(src,dst,50,200,3);
首先,你应用变换:
vector lines;
HoughLines(dst, lines, 1, CV_PI/180, 10, 0, 0 );
具有以下参数:
然后通过绘制线条显示结果。
for( size_t i = 0; i < lines.size(); i++ )
{
Vec4i l = lines[i];
line( cdst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 3, LINE_AA);
}
效果图如下: