為了方便以後檢視,將基本筆記收藏到這裡!
原博文:
其實檢測圓形和檢測直線的原理差別不大,只不過直線是在二維空間,因為y=kx+b,只有k和b兩個自由度。而圓形的一般性方程表示為(x-a)²+(y-b)²=r²。那麼就有三個自由度圓心座標a,b,和半徑r。這就意味著需要更多的計算量,而opencv中提供的cvhoughcircle()函式裡面可以設定半徑r的取值範圍,相當於有乙個先驗設定,在每乙個r來說,在二維空間內尋找a和b就可以了,能夠減少計算量。
具體步驟如下:
1.對輸入影象進行邊緣檢測,獲取邊界點,即前景點。
2.假如影象中存在圓形,那麼其輪廓必定屬於前景點(此時請忽略邊緣提取的準確性)。
3.同霍夫變換檢測直線一樣,將圓形的一般性方程換一種方式表示,進行座標變換。由x-y座標系轉換到a-b座標系。寫成如下形式(a-x)²+(b-y)²=r²。那麼x-y座標系中圓形邊界上的一點對應到a-b座標系中即為乙個圓。
4.那x-y座標系中乙個圓形邊界上有很多個點,對應到a-b座標系中就會有很多個圓。由於原影象中這些點都在同乙個圓形上,那麼轉換後a,b必定也滿足a-b座標系下的所有圓形的方程式。直觀表現為這許多點對應的圓都會相交於乙個點,那麼這個交點就可能是圓心(a, b)。
5.統計區域性交點處圓的個數,取每乙個區域性最大值,就可以獲得原影象中對應的圓形的圓心座標(a,b)。一旦在某乙個r下面檢測到圓,那麼r的值也就隨之確定。
以下面的為例,呼叫opencv中的cvhoughcircles()進行圓形的檢測,左邊為原圖,右邊為檢測結果,圓形都被圈出。
**:
#include"cv.h"
#include"highgui.h"
#includeusing namespace cv;
void main()
cvnamedwindow("img", 1);
cvshowimage("img", srcimg);
cvwaitkey(-1);
cvreleaseimage(&srcimg);
cvdestroyallwindows();
}
OpenCV 霍夫變換圓檢測
在直角座標系下,圓的方程表示為 其中,r是圓的半徑,a,b 是圓心座標。那麼換一種表達方式 因為在直角座標系下,圓上的所有點都滿足圓的方程,所以直角座標系下的乙個圓對應到abr座標系下就是乙個點。直角座標系下經過乙個點的所有圓在abr座標系下就是一條三維曲線。那麼,直角座標系下圓上的所有點在abr座...
opencv之霍夫變換圓檢測
霍夫變換就是將平面影象轉換到霍夫空間 極座標 進行特徵計算 圓的幾何標準方程 x a 2 y b 2 r 2 x a 2 y b 2 r 2 x a 2 y b 2 r2圓的極座標方程 x a rco s x a rcos theta x a rc os y b rs in y b rsin the...
OpenCV 霍夫線變換 霍夫圓變換
關於霍夫變換在官方文件opencv249裡的描述如下 api如下 void houghlines inputarray image,outputarray lines,double rho,double theta,int threshold,double srn 0,double stn 0 vo...