控制閥值的霍夫變換 檢測線條
阿新 • • 發佈:2018-12-11
該樣例可以通過改變影象上的閥值滑動條,生成不同閥值下的影象! 發現閥值在30多的時候,畫的線條是最多的,最大的閥值200和最小的閥值不一定是畫線條數最多的!
程式碼如下:
#include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> using namespace std; using namespace cv; //-----------------------------------【全域性變數宣告部分】-------------------------------------- // 描述:全域性變數宣告 //----------------------------------------------------------------------------------------------- Mat g_srcImage, g_dstImage,g_midImage;//原始圖、中間圖和效果圖 vector<Vec4i> g_lines;//定義一個向量結構g_lines用於存放得到的線段向量集合 //變數接收的TrackBar位置引數 int g_nthreshold=100; static void on_HoughLines(int, void*);//回撥函式 int main( ) { //載入原始圖和Mat變數定義 Mat g_srcImage = imread("C://1.jpg"); //工程目錄下應該有一張名為1.jpg的素材圖 //顯示原始圖 imshow("【原始圖】", g_srcImage); //建立滾動條 namedWindow("【效果圖】",1); createTrackbar("值", "【效果圖】",&g_nthreshold,200,on_HoughLines); //進行邊緣檢測和轉化為灰度圖 Canny(g_srcImage, g_midImage, 50, 200, 3);//進行一次canny邊緣檢測 cvtColor(g_midImage,g_dstImage, COLOR_GRAY2BGR);//轉化邊緣檢測後的圖為灰度圖 //呼叫一次回撥函式,呼叫一次HoughLinesP函式 on_HoughLines(g_nthreshold,0); HoughLinesP(g_midImage, g_lines, 1, CV_PI/180, 80, 50, 10 ); //顯示效果圖 imshow("【效果圖】", g_dstImage); waitKey(0); return 0; } //-----------------------------------【on_HoughLines( )函式】-------------------------------- // 描述:【頂帽運算/黑帽運算】視窗的回撥函式 //---------------------------------------------------------------------------------------------- static void on_HoughLines(int, void*) { //定義區域性變數儲存全域性變數 Mat dstImage=g_dstImage.clone(); Mat midImage=g_midImage.clone(); //呼叫HoughLinesP函式 vector<Vec4i> mylines; HoughLinesP(midImage, mylines, 1, CV_PI/180, g_nthreshold+1, 50, 10 ); //迴圈遍歷繪製每一條線段 for( size_t i = 0; i < mylines.size(); i++ ) { Vec4i l = mylines[i]; line( dstImage, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(255,0,0), 1, CV_AA); } //顯示影象 imshow("【效果圖】",dstImage); }
測試效果圖: