霍夫直线检测 opencv

  本次实验是检测图像中的直线,用到了HoughLines()和HoughLinesP()函数,其中HoughLinesP()称为累计概率霍夫变换,实验结果显示累计概率霍夫变换要比标准霍夫变换的效果好。具体的参数介绍书中网上都有,可参照此博客https://www.cnblogs.com/skyfsm/p/6881686.html 

 1 #include<opencv2/opencv.hpp>
 2 #include<opencv2/imgproc/imgproc.hpp>
 3 #include<iostream>
 4 using namespace cv;
 5 using namespace std;
 6 
 7 Mat midImage, dstImage;  // 临时变量和目标图的定义
 8 void HoughLines_p();   
 9 int main()
10 {
11       //载入原图
12     Mat src = imread("D:/bei1.jpg");
13     namedWindow("原图", CV_WINDOW_AUTOSIZE);
14     imshow("原图", src);
15     //先进行边缘检测 在进行灰度变换
16     Canny(src, midImage, 50, 150, 3);
17     imwrite("D:/learn-opencv/can.jpg", midImage);
18     cvtColor(midImage, dstImage, CV_GRAY2BGR);
19 
20     //进行霍夫线变换
21     vector<Vec2f>lines;  //定义一个矢量结构lines用于存放得到的线段矢量集合
22     HoughLines(midImage, lines, 1, CV_PI / 180, 165, 0, 0);
23 
24     //依次在图中做出每条线段
25     for (size_t i = 0; i < lines.size(); i++)
26     {
27         float r = lines[i][0];
28         float theta = lines[i][1];
29 
30         Point pt1, pt2;
31         double a = cos(theta), b = sin(theta);
32         double x0 = a * r, y0 = b * r;
33         pt1.x = cvRound(x0 + 1000 * (-b));
34         pt1.y = cvRound(y0 + 1000 * (a));
35         pt2.x = cvRound(x0 - 1000 * (-b));
36         pt2.y = cvRound(y0 - 1000 * (a));
37 
38         line(dstImage, pt1, pt2, Scalar(55, 100, 195), 1, LINE_AA);
39     }
40 
41     //HoughLines_p();累积概率【霍夫变换】
42     imshow("边缘检测后的图", midImage);
43     imshow("显示效果图", dstImage);
44     imwrite("D:/learn-opencv/dstImage.jpg", dstImage);
45     waitKey(0);
46     return(0);
47     
48 }
49 
50 //累积概率【霍夫变换】
51 void HoughLines_p()
52 {
53     vector<Vec4i>lines;
54     HoughLinesP(midImage, lines, 1, CV_PI / 180, 80, 50, 10);
55 
56     for (size_t i = 0; i < lines.size(); i++)
57     {
58         Vec4i l = lines[i];
59         line(dstImage, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(186, 88, 255), 1, LINE_AA);
60     }
61 }

显示效果:

1.原图

2.canny边缘检测效果图

3.标准霍夫变换图

4.累计概率霍夫变换图

原文地址:https://www.cnblogs.com/carlber/p/9685146.html