- 霍夫檢測-直線
前提條件 – 邊緣檢測已經完成,霍夫變換解決平面空間到極坐標空間轉換。
從霍夫空間曲線圖來看,取不同的像素點都匯聚在一個點,這表明這些個像素點都屬於同一條直線。(xi,yi).對於任意一條直線上的所有點來說變換到極坐標中,從[0~360]空間,可以得到r的大小屬於同一條直線上點在極坐標空(r, θ)必然在一個點上有最強的信號出現(如上圖),根據此反算到平面坐標中就可以得到直線上各點的像素坐標。從而得到直線。
下圖第一張為原圖,第二張為提取邊緣,第三張為直線檢測並繪制。
- 霍夫檢測-圓
極坐標變換原理:
從平面坐標到極坐標轉換三個參數C(x0,y0,r)其中(x0,y0)是圓心假設平面坐標的任意一個圓上的點,轉換到極坐標中:C(x0,y0,r)處有最大值,霍夫變換正是利用這個原理實現圓的檢測。
霍夫圓檢測對噪聲比較敏感,所以首先要對圖像做中值濾波。
相關函數如下:
1 //標准的霍夫變換HoughLines從平面坐標轉換到霍夫空間, 2 //最終輸出是表示極坐標空間霍夫變換直線概率,要自己反變換到平面空間,一般不用; 3 HoughLinesP(int1,out1,)最終輸出是直線的兩個點(x1,y1,x2,y2). 4 5 霍夫直線檢測HoughLinesP(out1,plinel,1,CV_PI/180.0,10,0,0); 6 // out1為要檢測的灰度圖像,plinel 為輸出的直線的兩點,類型為vector<Vec4f>plinel; 7 // 1為生成極坐標時候的像素掃描步長,CV_PI/180.0生成極坐標時候的角度步長,一般取值CV_PI/180,10為閾值, 8 //只有獲得足夠交點的極坐標點才被看成是直線,最小直線長度0最大間隔0; 9 for (size_t i=0;i<plinel.size();i++) 10 { 11 Vec4f hline = plinel[i]; 12 line(out2, Point(hline[0], hline[1]), 13 Point(hline[2], hline[3]), 14 colorf3, 3, 8); 15 } 16 17 霍夫圓檢測HoughCircles(out2, pcircle, CV_HOUGH_GRADIENT,1, 10, 100, 30,80,100); 18 //out2為要檢測的灰度圖像,pcircle 為輸出的圓心及半徑,類型為vector<Vec3f>pcircle; 19 //10 最短距離-可以分辨是兩個圓的,否則認為是同心圓,30為中心點累加器閾值用於確定圓心80為最小半徑100最大半徑, 20 Mat dst = Mat(in1_image.size(), in1_image.type()); 21 for (size_t i=0;i< pcircle.size();i++) 22 { 23 Vec3f cc = pcircle[i]; 24 circle(dst,Point(cc[0], cc[0]), cc[2], colorf3,2,LINE_AA); 25 circle(dst, Point(cc[0], cc[0]), 3, colorf, 2, LINE_AA); 26 }