1. 程式人生 > >opencv--imgproc模組·Hough 檢測圓

opencv--imgproc模組·Hough 檢測圓

官網:http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.html#hough-circle

前言

Hough變換也是在影象處理、計算機視覺領域應用很廣泛的技術。

經常是用Hough來檢測直線,今天想學習下Hough檢測圓。

用官網的程式碼,自己在網上找了幅有圓的圖片,卻檢測出不來

然後重新找了一幅圖片,就可以,如下圖所示(dp =2 , minDist =Image.rows/8)

整個程式碼中,最重要的就是HoughCircles()函式,

來看它的定義:

void HoughCircles( InputArray image, OutputArray circles,
       int method, double dp, double minDist,
       double param1=100, double param2=100,
       int minRadius=0, int maxRadius=0 );

//dp,用來檢測圓心的累加器影象的解析度與輸入影象之比的倒數,例如如果dp= 1時,累加器和輸入影象具有相同的解析度。如果dp=2,累加器便只有輸入影象一半的解析度

//minDist 檢測到的圓的圓心之間的最小距離,即讓我們的演算法能明顯區分的兩個不同圓之間的最小距離。如果這個引數設定過大,某些圓就不能被檢測出來。

如上圖,按照官網上設定為Image.rows/8 , 該影象 Image.rows = 279, 即  minDist = 34點多

當引數 minDist 設定為20時,結果如下,的確把上面沒有檢測到的圓檢測出來了

當改變引數為dp = 3,minDist仍然為Image.rows/8時,

回到最初遇到的那個問題

為什麼那個建築物的圓沒檢測出來呢?,原因在這裡

 //採用高斯濾波去除噪聲
   GaussianBlur(tmp,tmp,Size(9,9),2,2);

特意顯示了下濾波後的效果圖,如下圖,圖片變得很模糊,

於是不執行這一行,即不進行降噪處理,發現可以檢測出來了!說明降噪處理要因圖而異,並不是所有都需要!

至於為什麼只檢測出一個圓,博主@ 淺墨_毛星雲描述:當有許多同心圓或者是近似的同心圓時,霍夫梯度法(CV_HOUGH_GRADIENT)的傾向是保留最大的一個圓 。