(22)霍夫圓檢測

2021-08-21 12:01:48 字數 1332 閱讀 2718

/*

*霍夫圓檢測

霍夫變換進行圓檢測

幾何中圓心座標和半徑表徵乙個圓,

從平面座標到極座標轉換三個引數c(x0, y0, r), 固定r,在0-360度空間的時候只有x0, y0這兩個變數,就是a跟b,

其中x0, y0是圓心,那麼在圓心處有最大值,霍夫空間累計最大值在圓心處

假設平面座標的任意乙個圓上的點,轉換到極座標中,c(x0, y0, r)處有最大值

api cv::houghcircles

因為霍夫圓檢測對雜訊比較敏感,所以首先要對影象做中值濾波。椒鹽雜訊一般是極大值或者極小值一般就去除掉了

基於效率考慮(因為理論上在那個四維空間裡面找實在是太慢了),opencv中實現的霍夫變換圓檢測是基於影象梯度的實現,分為兩步:

1. 檢測邊緣,發現可能的圓心

2. 基於第一步的基礎上從候選圓心開始計算最佳圓半徑大小

houghcircles(

inputarray image, // 輸入影象 ,必須是8位的單通道灰度影象

outputarray circles, // 輸出結果,發現的圓資訊,也是向量陣列vector

int method, // 方法 - hough_gradient 我們通過梯度來尋找

double mindist, // 10 最短距離-這兩個圓心相距多短可以認為是兩個圓,因為有的圓是同心圓,它中心在乙個位置,半徑不一樣

//可以分辨是兩個圓的,否則認為是同心圓- src_gray.rows/8

double param1, // canny edge detection low threshold,霍夫圓檢測包括兩步,乙個是canny的梯度, 通過canny求影象的梯度,在這

//邊緣基礎上去做圓心候選,然後去做圓的檢測,這個是canny變換的低閾值

double param2, // 中心點累加器閾值 – 候選圓心 中心點累加器你選個30, 50差不多了,有乙個弧度長度,超過這個30,50個畫素屬於同乙個

//圓心的話,那麼就有乙個小弧度了應該基本上可以認為是圓了

int minradius, // 最小半徑 圓的半徑,你這個範圍越大計算越慢,因為在尋找,從小到大在那做

int maxradius//最大半徑

)*/#include #include using namespace std;

using namespace cv;

void canny_demo(int, void*);

int main()

imshow("output", dst);

waitkey(0);

return 0;

}

22 霍夫圓變換

houghcricles inputarray image,輸入影象,必須是8為的單通道灰度資訊 outputarray circles,輸出結果,發現的圓資訊 乙個向量陣列vector int methon,方法 hough gradient double dp,dp 1,原圖上尋找為1,在原圖寬...

霍夫檢測圓 霍夫梯度法

承接上篇博文,在基本搞懂霍夫檢測直線是怎麼進化到檢測圓後,開始 痴心妄想 自己寫 了!雖說最後的效果不是很好,但是重要的是在碼 過程中發現和解決的一些問題 不一定有共性,但兄弟萌可以避免下這些bug 上篇博文已經闡述了我們是如何從三維計數 轉到霍夫梯度法的,該演算法主要分為兩步,先找圓心疑似點,再對...

霍夫線 圓檢測技術

原理 霍夫線檢測 標準與多尺度霍夫變換 void houghlines inputarray image,outputarray lines,double rho,double theta,int threshold,double srn 0,double stn 0 引數 image 8位單通道二...