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的最大個數
static4. 效率分析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引數
}
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 檢測原理 兩點確定一條直線,通過一點可以確定無數...