關於霍夫找圓演算法cvHoughCircles的引數

查志強發表於2016-04-08

【原文:http://b217dgy.blog.51cto.com/5704306/1320360

霍夫圓變換的函式為:

HoughCircles


利用 Hough 變換在灰度影象中找圓

CvSeq* cvHoughCircles( CvArr* image, void* circle_storage, int method, double dp, double min_dist, double param1=100, double param2=100, int min_radius=0, int max_radius=0 );
image
輸入 8-位元、單通道灰度影象.
circle_storage
檢測到的圓儲存倉. 可以是記憶體儲存倉 (此種情況下,一個線段序列在儲存倉中被建立,並且由函式返回)或者是包含圓引數的特殊型別的具有單行/單列的CV_32FC3型矩陣(CvMat*). 矩陣頭為函式所修改,使得它的 cols/rows 將包含一組檢測到的圓。如果 circle_storage 是矩陣,而實際圓的數目超過矩陣尺寸,那麼最大可能數目的圓被返回

. 每個圓由三個浮點數表示:圓心座標(x,y)和半徑.

method
Hough 變換方式,目前只支援CV_HOUGH_GRADIENT, which is basically 21HT, described in [Yuen03].
dp
累加器影象的解析度。這個引數允許建立一個比輸入影象解析度低的累加器。(這樣做是因為有理由認為影象中存在的圓會自然降低到與影象寬高相同數量的範疇)。如果dp設定為1,則解析度是相同的;如果設定為更大的值(比如2),累加器的解析度受此影響會變小(此情況下為一半)。dp的值不能比1小。

Resolution of the accumulator used to detect centers of the circles. For example, if it is 1, the accumulator will have the same resolution as the input image, if it is 2 - accumulator will have twice smaller width and height, etc.

min_dist
該引數是讓演算法能明顯區分的兩個不同圓之間的最小距離。

Minimum distance between centers of the detected circles. If the parameter is too small, multiple neighbor circles may be falsely detected in addition to a true one. If it is too large, some circles may be missed.

param1
用於Canny的邊緣閥值上限,下限被置為上限的一半。

The first method-specific parameter. In case of CV_HOUGH_GRADIENT it is the higher threshold of the two passed to Canny edge detector (the lower one will be twice smaller).

param2
累加器的閥值。

The second method-specific parameter. In case of CV_HOUGH_GRADIENT it is accumulator threshold at the center detection stage. The smaller it is, the more false circles may be detected. Circles, corresponding to the larger accumulator values, will be returned first.

min_radius
最小圓半徑。

Minimal radius of the circles to search for.

max_radius
最大圓半徑。

Maximal radius of the circles to search for. By default the maximal radius is set to max(image_width, image_height).

The function cvHoughCircles finds circles in grayscale image using some modification of Hough transform.

-------------------------------------------------------------------------------------------------


我的目標是在一直全是圓的圖中找出所有圓,並用紅色表圈出。

//霍夫變換尋找圓


img、img1、img2函式外定義。


void CdialogCVDlg::OnBnClickedBtnhoughcircles()

{

// TODO: Add your control notification handler code here

// TODO: Add your control notification handler code here

cvNamedWindow("a",1);

cvNamedWindow("b",1);

cvNamedWindow("c",1);

img = cvLoadImage("D:\ii.jpg",1); //原圖


img1 = cvCreateImage (cvGetSize(img), IPL_DEPTH_8U, 1);//處理的影象必須是八位單通道的

if (img->nChannels == 1)

{

img1 = cvCloneImage (img);

}

else

{

cvCvtColor (img, img1, CV_RGB2GRAY); //轉為單通道

}


CvMemStorage* storage=cvCreateMemStorage(0);

CvSeq* circle = 0;


//cvSmooth( img1, img1, CV_GAUSSIAN, 5, 5 ); //看了很多事例,要降噪處理,但測試的結果是

//找圓會有一定偏差,說明用這個要因圖而異,噪聲高的圖才要用

circle = cvHoughCircles( //cvHoughCircles函式需要估計每一個畫素梯度的方向,

//因此會在內部自動呼叫cvSobel,而二值邊緣影象的處理是比較難的

img1,

storage,

CV_HOUGH_GRADIENT,

1, //累加器影象的解析度,增大則解析度變小

18, //很重要的一個引數,告訴兩個圓之間的距離的最小距離,如果已知一副影象,可以先行計

//算出符合自己需要的兩個圓之間的最小距離。

100, //canny演算法的閾值上限,下限為一半(即100以上為邊緣點,50以下拋棄,中間視是否相連而

//定)

25, //決定成圓的多寡 ,一個圓上的畫素超過這個閾值,則成圓,否則丟棄

32,//最小圓半徑,這個可以通過圖片確定你需要的圓的區間範圍

45 //最大圓半徑

);


img2 = cvCreateImage (cvGetSize(img), IPL_DEPTH_8U, 3); //用一個三通道的圖片來顯示紅色的

//圓圈

cvCvtColor (img1, img2, CV_GRAY2RGB); //轉為3通道


for( int i = 0; i < circle->total; i++ )

{

float* p = ( float* )cvGetSeqElem( circle, i );

//霍夫圓變換

CvPoint pt = cvPoint( cvRound( p[0] ), cvRound( p[1] ) ); //圓心座標(p(0),p(1))

cvCircle(

img2,

pt, //確定圓心

cvRound( p[2] ), //確定半徑

CV_RGB( 255, 0, 0 ),

3

); //畫圓函式

}

cvShowImage( "a", img );

cvShowImage("b",img1);

cvShowImage("c",img2);

}


//原圖:


115751450.jpg



//效果圖

115845490.jpg


相關文章