Hough變換檢測圓

2021-07-23 07:23:33 字數 2394 閱讀 7839

原理:

我們要從一副影象中檢測出半徑以知的圓形來。這個問題比前乙個還要直觀。我們可以取和影象平面一樣的引數平面,以影象上每乙個前景點為圓心,以已知的半徑在引數平面上畫圓,並把結果進行累加。最後找出引數平面上的峰值點,這個位置就對應了影象上的圓心。在這個問題裡,影象平面上的每一點對應到引數平面上的乙個圓。

把上面的問題改一下,假如我們不知道半徑的值,而要找出影象上的圓來。這樣,乙個辦法是把引數平面擴大稱為三維空間。就是說,引數空間變為x--y--r三維,對應圓的圓心和半徑。影象平面上的每一點就對應於引數空間中每個半徑下的乙個圓,這實際上是乙個圓錐。最後當然還是找引數空間中的峰值點。不過,這個方法顯然需要大量的記憶體,執行速度也會是很大問題。

有什麼更好的方法麼?我們前面假定的影象都是黑白影象(2值影象),實際上這些2值影象多是彩色或灰度影象通過邊緣提取來的。我們前面提到過,影象邊緣除了位置資訊,還有方向資訊也很重要,這裡就用上了。根據圓的性質,圓的半徑一定在垂直於圓的切線的直線上,也就是說,在圓上任意一點的法線上。這樣,解決上面的問題,我們仍採用2維的引數空間,對於影象上的每一前景點,加上它的方向資訊,都可以確定出一條直線,圓的圓心就在這條直線上。這樣一來,問題就會簡單了許多。

**:

// 載入原圖  

iplimage *psrcimage = cvloadimage("c:\\users\\徐圖之\\desktop\\33.bmp", -1);

iplimage *pgrayimage = cvcreateimage(cvgetsize(psrcimage), ipl_depth_8u, 1);

cvcvtcolor(psrcimage, pgrayimage, cv_bgr2gray);

//cvsmooth(pgrayimage, pgrayimage);

// 圓檢測(灰度圖)

cvmemstorage *pcvmstorage = cvcreatememstorage();

double fmincirclegap = pgrayimage->height / 40;

cvseq *pcvseqcircles = cvhoughcircles(pgrayimage, pcvmstorage, cv_hough_gradient, 1.8, fmincirclegap);

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

// 繪製直線

iplimage *pcolorimage = cvcreateimage(cvgetsize(pgrayimage), ipl_depth_8u, 3);

cvcvtcolor(pgrayimage, pcolorimage, cv_gray2bgr);

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

cvnamedwindow("pstrwindowssrctitle", cv_window_autosize);

cvshowimage("pstrwindowssrctitle", pgrayimage);

cvnamedwindow("name", cv_window_autosize);

cvshowimage("name", pcolorimage);

cvwaitkey(0);

cvreleasememstorage(&pcvmstorage);

cvdestroywindow("pstrwindowssrctitle");

cvdestroywindow("pstrwindowslinename");

cvreleaseimage(&pgrayimage);

cvreleaseimage(&pcolorimage);

cvhoughcircles這個函式的函式原形如下:

cvapi(cvseq*) cvhoughcircles(

cvarr* image, void* circle_storage,

int method,

double dp,

double min_dist,

double param1 cv_default(100),

double param2 cv_default(100),

int min_radius cv_default(0),

int max_radius cv_default(0)

);可以看出cvhoughcircles與上一章的cvhoughlines2函式比較類似,因此講下部分引數的意思就可以了:

第二個引數表示hough變換方式,目前只能用cv_hough_gradient。

第三個引數表示尋找圓弧圓心的累計解析度,通常設定成1就可以了,如果檢測不出來,可以設定大一點

第四個引數表示兩個不同圓之間的最小距離,由於是按圓心來計算距離的,因此對同心圓的檢測就無能為力了。

注意,圓檢測函式可以使用灰度圖。

Hough變換檢測直線和圓

1 直線是如何表示的?對於平面中的一條直線,在直角座標系中,常見的有點斜式,兩點式兩種表示方法。然而在hough變換中,考慮的是另外一種表示方式 使用極座標 r,theta 來表示一條直線。其中r為該直線到原點的距離,theta為該直線的垂線與x軸的夾角。如下圖所示。2 如果座標系中有多個點,又怎樣...

hough變換直線檢測 霍夫圓變換

霍夫圓變換的基本原理和霍夫線變換的原理類似,直線檢測中對應極座標點被三維的圓心點 x,y 以及半徑r即 x,y,r 所代替。對於圓來說,圓心點和半徑就可以確定乙個圓。三維空間中曲線相交於一點的邊緣點集越多,那麼它們經過的共同圓上的畫素點越多,那麼它們經過的共同圓上的畫素點就許多,設定相應的閾值相應的...

Hough 變換檢測直線

hough 變換檢測直線的基本原理是 對x y 座標系下的每一點 x,y 對應極座標下為 rho x cos theta y sin theta 1 因此,對x y平面內的每一點,對應到極座標系則為一條直線,如果直角座標系下的點共線,則在極座標的直線會相交於一點。因此,求得極座標下相交最多的點,rh...