霍夫直線檢測及opencv的實現分析

2021-07-02 19:25:39 字數 3045 閱讀 6942

1. houghlines的演算法思想 

2. houghlines實現需要考慮的要素 

3. houghlines的opencv實現,**分析 

4. houghlines的效率分析,改進 

1. houghlines的演算法思想 

檢測直線,houghlines標準演算法,不考慮線段,不檢測線段端點。 

在直角座標系和極座標系的對應關係,點、直線在兩個座標系中是對偶關係。 

即直角座標系中的點是極座標系中的線,直角座標系中的線是極座標系中的點。 

反過來,也成立。 

影象可知看做直角座標系,檢測影象中的直線,可以轉化為統計檢測極座標系中的點(r,theta)。 

2. houghlines實現需要考慮的因素 

hough空間(離散極座標)的表示 

原因: 

影象中直線的表示,由斜率和截距表示,而極座標中用(r, theta)表示. 

r = cos(theta)*x + sin(theta)*y 

對於點(x0, y0) , 在極座標中就是一條直線(很多對(r,theta)點): 

r = cos(theta)*x0 + sin(theta)*y0 

r,theta就是一對hough空間的變數表示。 

旋轉的theta不容易表示,若將r,theta看成直角座標空間。 

乙個點(x0, y0), 就是乙個正弦曲線。 

直角座標系中的一點

對應於r-theta空間的一條正弦曲線 

多個點在(r,theta)平面上就是多條正弦曲線,而多條正弦曲線會相交,交點就是直角座標系中的直線。 

直角座標系中的一條直線上的三個點

對應於r-theta空間中三條曲線,並交於一點

接下來,就是要考慮 將r,theta離散化,形成離散化的hough空間,類似於乙個mat矩陣/影象,用於統計交點的個數。 

opencv取rtho,theta引數作為離散度量,空間解析度。 

則hough空間的大小為: 

numangle = cvround(cv_pi / theta); 

numrho = cvround(((width + height) * 2 + 1) / rho); // 有冗餘,在r上留有一定的空白 

3. **分析 

rho: 霍夫空間的r粒度大小 

theta: 旋轉角度的粒度 

threshold:直線上有多少個點的閾值 

lines:輸出lines結果 

linesmax:lines的最大個數 

static

void

icvhoughlinesstandard( const cvmat* img, float rho, float theta,

int threshold, cvseq *lines, int linesmax )

// stage 1. fill accumulator

for( i = 0; i < height; i++ )

for( j = 0; j < width; j++ )

}// stage 2. find local maximums // 霍夫空間,區域性最大點,採用四鄰域判斷,比較。(也可以使8鄰域或者更大的方式), 如果不判斷區域性最大值,同時選用次大值與最大值,就可能會是兩個相鄰的直線,但實際上是一條直線。選用最大值,也是去除離散的近似計算帶來的誤差,或合併近似曲線。

for( r = 0; r < numrho; r++ )

for( n = 0; n < numangle; n++ )

// stage 3. sort the detected lines by accumulator value // 由點的個數排序,依次找出哪些最有可能是直線

icvhoughsortdescent32s( sort_buf, total, accum );

// stage 4. store the first min(total,linesmax) lines to the output buffer

linesmax = min(linesmax, total);

scale = 1./(numrho+2);

for( i = 0; i < linesmax; i++ ) // 依據霍夫空間解析度,計算直線的實際r,theta引數

}

4. 效率分析 

houghlines的計算效率比較低o(n*n*m),耗時較長,而且沒有檢測出直線的端點。 

改進 統計概論霍夫直線檢測houghlinesp是乙個改進,不僅執行效率較高,而且能檢測到直線的兩個端點。 

思想: 

先隨機檢測出一部分直線,然後將直線上點的排查掉,再進行其他直線的檢測 

1. 首先僅統計影象中非零點的個數,對於已經確認是某條直線上的點就不再變換了。 

2. 對所以有非零點逐個變換到霍夫空間 

a. 並累加到霍夫統計表(影象)中,並統計最大值 

b. 最大值與閾值比較,小於閾值,則繼續下乙個點的變換 

c. 若大於閾值,則有乙個新的直線段要產生了 

d. 計算直線上線段的端點、長度,如果符合條件,則儲存此線段,並mark這個線段上的點不參與其他線段檢測的變換 

opencv 霍夫變換 直線檢測

用來做直線檢測 前提條件是邊緣檢測已經完成,一般用canny來做。cv houghlinesp inputarray src,輸入影象,必須8 bit的灰度影象 outputarray lines,輸出的極座標來表示直線 double rho,生成極座標時候的畫素掃瞄步長,一般是1 double t...

OpenCV 霍夫變換直線檢測

霍夫直線檢測的基本原理在於利用點與線的對偶性。在直角座標系下,一條直線的方程可以用點斜式表示 但是這種表達方式無法表示斜率無窮大的情況 直線垂直於x軸 因此,轉化到極座標系下 可以變換為 其中,因此,在直角座標系下的乙個點 也就是說,直角座標系下的乙個點對應極座標系下的一條曲線。反過來也是成立的。霍...

opencv之霍夫變換直線檢測

霍夫變換之直線檢測 x cos x cos theta x cos y sin y sin theta y sin 2 x2 y2 2 x 2 y 2 2 x2 y2 tan y x x 0 tan theta y x x 0 tan y x x 0 檢測原理 兩點確定一條直線,通過一點可以確定無數...