OpenCV學習 day10 霍夫變換

2022-06-19 20:57:13 字數 3377 閱讀 9790

霍夫變換-直線檢測  hough line transform

對影象上每乙個畫素點x,y,變換到霍夫空間,根據不同的角度θ可以繪製出一條曲線,不同位置的x,y可以繪製出多條曲線,通過這些曲線的交點所對應的r和θ可以還原出直線的位置。

對於任意一條直線上的所有點來說

變換到極座標中,從[0~360]空間,可以得到r的大小

屬於同一條直線上點在極座標空(r, θ)必然在乙個點上有最強的訊號出現,根據此反算到平面座標中就可以得到直線上各點的畫素座標。從而得到直線

θ

'>θ

是直線的法向方向與 x 軸的夾角,r是原點到直線的距離

標準的霍夫變換 cv::houghlines從平面座標轉換到霍夫空間,最終輸出是(θ, rθ)   表示極座標空間,不建議使用

cv::houghlines(

inputarray src,

//輸入影象,必須8-bit的灰度影象

outputarray lines, //

輸出的極座標來表示直線

double rho, //

生成極座標時候的畫素掃瞄步長 一般取1

double theta, //

生成極座標時候的角度步長,一般取值cv_pi/180

int threshold, //

閾值,只有獲得足夠多交點的極座標點才被看成是直線

double srn=0;//

是否應用多尺度的霍夫變換,如果不是設定0表示經典霍夫變換

double min_theta=0; //

表示角度掃瞄範圍 0 ~180之間, 預設即可

double max_theta=cv_pi

)

霍夫變換直線概率cv::houghlinesp最終輸出是直線的兩個點(x0, y0, x1, y1)

cv::houghlinesp(

inputarray src,

//輸入影象,必須8-bit的灰度影象

outputarray lines, //

輸出的極座標來表示直線

double rho, //

生成極座標時候的畫素掃瞄步長

double theta, //

生成極座標時候的角度步長,一般取值cv_pi/180

int threshold, //

閾值,只有獲得足夠多交點的極座標點才被看成是直線

double minlinelength=0;//

最小直線長度

double maxlinegap=0;//

最大間隔

)

**演示:

霍夫變換-圓檢測

其實檢測圓形和檢測直線的原理差別不大,只不過直線是在二維空間,因為y=kx+b,只有k和b兩個自由度。而圓形的一般性方程表示為(x-a)²+(y-b)²=r²。那麼就有三個自由度圓心座標a,b,和半徑r。這就意味著需要更多的計算量,而opencv中提供的cvhoughcircle()函式裡面可以設定半徑r的取值範圍,相當於有乙個先驗設定,在每乙個r來說,在二維空間內尋找a和b就可以了,能夠減少計算量。

使用(a,b,r)來確定乙個圓心為(a,b)半徑為 r 的圓。

經過乙個點可以作出無數個圓,假設某個點平面座標為(xi, yi),使用的引數為(ai, bi, ri)則經過此點的圓的表示式為(xi - ai)2 + (yi - bi)2 = ri2。

對於點(xj, yj),必定存在(aj, bj, rj)使得 近似計算中 ai = aj, bi = bj, ri = rj,即兩個點在同乙個圓上;

同理如果三個點在同乙個圓上,則也必須存在 ai = aj = ak = a, bi=bj=bk = b, ri=rj=rk = r 的情況。此時的這個ai, bi, ri就是我們要找的圓的座標

參考:因為霍夫圓檢測對雜訊比較敏感,所以首先要對影象做中值濾波

基於效率考慮,opencv中實現的霍夫變換圓檢測是基於影象梯度的實現,分為兩步:

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

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

api

houghcircles(

inputarray image,

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

outputarray circles, //

輸出結果,發現的圓資訊

int method, //

方法 - hough_gradient

double dp, //

dp = 1 尺度 dip

double mindist, //

10 最短距離-可以分辨是兩個圓的,否則認為是同心圓- src.rows/8 越小同心圓越多

double param1, //

canny edge detection low threshold

double param2, //

中心點累加器閾值 – 候選圓心 過多少個值確定是圓心

int minradius, //

最小半徑

int maxradius//

最大半徑

)

演示**

寒假學習day10

今天學習了為linearlayout設定分割線。很多介面開發中都會設定一些下劃線,或者分割線,從而使得介面更加整潔美觀,比如下面的酷狗 的註冊頁面 對於這種線,我們通常的做法有兩種 直接在布局中新增乙個view,這個view的作用僅僅是顯示出一條線,也很簡單 android layout width...

opencv學習之霍夫變換

原理部分參見 標準霍夫變換示例 opencv 1.cpp 定義控制台應用程式的入口點。include stdafx.h include include includeusing namespace cv using namespace std int main imshow 邊緣檢測後的圖 midi...

OPENCV學習之霍夫變換

霍夫線變換 效果圖 關於霍夫變換線變換的詳細介紹 以下是 int main waitkey 0 return 0 效果圖怎麼跟邊緣檢測的圖一樣?line dst,pt1,pt2,scalar 0 0,255 1,line aa 修改scalar 中的值顏色怎麼不改變?霍夫圓變換 void hough...