本次實驗是檢測圖像中的直線,用到了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.累計概率霍夫變換圖