2014-02-20 369 views
3

我目前試圖檢測使用HoughLinesP功能在OpenCV中的圖像中的水平狀的線,使用這些參數:如何使用HoughLinesP檢測OpenCV中的水平線?

HoughLinesP(linMat[i], lines, 1, CV_PI/180, 80, linMat[i].cols*(0.3), 3);

其中linMat[i]是輸入圖像。結果是這樣的

http://postimg.org/image/49b8wzlgz/

雖然這是行,我想是有在水平方向的線,作爲該圖像中所示的黃線(該線手工畫出)

http://postimg.org/image/rh9wlueo7/

我試圖將CV_PI/180參數更改爲較小的值(如CV_PI/45),並嘗試對其他參數使用各種值,但無法生成水平線。

在opencv中使用HoughLinesP函數生成這種黃線的參數應該使用哪些值?

謝謝!

更新

繼建議(感謝所有!)我已經試過像

HoughLinesP(linMat[i], lines, 1, CV_PI/360, 80, 1, 1);

不過即使是非常極端的數值,導致線在靠近垂直方向,因爲這斜率:postimg.org/image/y5w6vm7lx/(請複製粘貼鏈接...)。 我不使用canny等邊緣檢測濾鏡,因爲它無法檢測到較粗的線條,邊緣往往是不連續的線條。

更新2

只是爲了澄清,在結果畫出的線產生如下(HoughLinesP之後)

for all lines

{

line(linMat[i], Point(lines[j][0], lines[j][1]), Point(lines[j][2], lines[j][3]), Scalar(0,0,255), 1, 8);

}

回答

2

嘗試在Canny或任何其他算法的邊緣輸出圖像上應用Hough,而不是在閾值圖像上運行它。

enter image description here

這可以看出,較高的THETA值僅代表水平值。通過消除具有低θ值的值來過濾出在lines中獲得的結果。

+0

如果您將theta設置爲PI,您將得到幾乎只是垂直線的結果。 PI/3似乎也一樣。但PI/6返回所有方向。我還沒有弄清楚細節,爲什麼它以這種方式工作,但修改測試圖片上的theta可以給你方向。 –

1

從我能看到的文檔(link),我認爲功能HoughLinesP將檢測到所有圖像中的行。這些參數僅是影響檢測靈敏度的閾值。

所以,如果你只想要水平線,只需通過分析輸出數組過濾掉其他線。由於輸出矢量的每個項目都是4元素矢量(x_1, y_1, x_2, y_2),因此可以計算線條的斜率並使用它來過濾非水平線條。

2

只需使用方程

double Angle = atan2(y2 - y1, x2 - x1) * 180.0/CV_PI; 

檢查角度用於通過HoughLinesP()檢測出的各線,並考慮其具有角度0°或180°的線

+0

正如我在更新的問題中提到的那樣,無論改變角度多少,結果線總是有垂直斜率。這可能是這種情況下HoughLinesP函數的限制嗎? – Houari

1

只需可以嘗試:

for all lines: 
    if abs(lines[j][1] - lines[j][3]) == 0: 
    # Horizontal line 

此外,如果您的線條傾斜,您可以嘗試:

for all lines: 
    if abs(lines[j][1] - lines[j][3]) < 20: # Tune this parameter 
    # Horizontal line 

我想你明白了!