2016-08-22 313 views
1

我想從圖像中檢測矩形矩形(四邊形)通過ConvexHull檢測

我用cv2.findContours()cv2.convexHull()過濾出不規則的多邊形。

之後,我將使用船體長度來確定輪廓是否爲矩形。

hull = cv2.convexHull(contour,returnPoints = True) 
if len(hull) ==4: 
    return True 

然而,有時候,convexHull()將返回長度5陣列。 如果我使用上面的標準,我會錯過這個矩形。

例如, enter image description here

使用cv2.canny() enter image description here

通過採用上述方法後,我會得到船體:

[[[819 184]] 

[[744 183]] 

[[745 145]] 

[[787 145]] 

[[819 146]]] 

enter image description here


這裏是我的問題:給定一個長度爲5的數組(凸包),我怎樣才能確定它是否實際上指的是一個四邊形?謝謝。

============================================== ======================= 更新:

使用索貝爾X和Y方向後,

sobelxy = cv2.Sobel(img_inversion, cv2.CV_8U, 1, 1, ksize=3) 

我: enter image description here

+0

這是一個非常糟糕的解決方案來檢測車牌。你應該尋找更強大的東西。 – Miki

+0

@Miki你有什麼建議嗎? – VICTOR

+0

你可以從[OpenALPR]開始(https://github.com/openalpr/openalpr) – Miki

回答

3

那麼, 這是不正確的方式來提取矩形。由於我們在此討論基礎知識,因此我建議您採用圖像的反轉並在X和Y方向上應用Sobel,然後運行findcontours函數。然後用這個,你將能夠獲得很多矩形,你可以過濾掉。您將必須應用大量檢查來識別其中包含文本的矩形。另外我不明白你爲什麼要強制選擇長度爲5的矩形。你正在限制比例。其次,另一種方法是使用Sobel X和Y圖像,然後應用OpenCV的LineSegmentDetector。一旦你得到所有的線段,你必須將RANSAC應用於(四邊形擬合),所以這裏的條件應該是一組隨機選擇的相交線上的所有角度應該是銳角(粗略),最後用文本濾掉四邊形(爲此使用SWT或其他可靠的技術)。

至於你的查詢,你應該選擇理想的長度4(點)四。

編號:Crop the largest rectangle using OpenCV

此鏈接會給你一個很簡單的方法檢測矩形JIST。

下面的圖片爲您提供了一種反演和索貝爾圖像的演練。圖像反轉消除了從索貝爾獲得的雙重邊界。

對於Inversion,使用波形符號運算符。

enter image description here

還考慮到反轉之前也,其更好的你抑制照明文物。這可以使用同態濾波來完成。或拍攝圖像日誌。

+0

感謝您的回覆。車牌的輪廓是長度5.這就是爲什麼我選擇它的長度爲5. – VICTOR

+0

'findContours'需要一個二進制圖像,所以無論是閾值Sobel量還是沒有意義。 – Miki

+0

經過反演後,我無法獲得與您的'Sobel'相同的圖像。它是否正確使用'sobelxy = cv2.Sobel(img_inversion,cv2.CV_8U,1,1,ksize = 1)'? – VICTOR

0

將矩形擬合到凸多邊形並不那麼容易。

您可以嘗試通過旋轉卡尺(https://en.wikipedia.org/wiki/Rotating_calipers)找到最小面積或最小外圍矩形。

然後通過比較船體和矩形的面積/周長,可以評估「矩形」。

+0

我想執行一個四邊形,但是我的一些近似輪廓從python opencv有> 4個邊。我試着再次運行cv2.approxPolyDP()。 16面多邊形,但它沒有工作。有任何想法嗎? – jtlz2

+0

@ jtlz2:您可以嘗試通過旋轉卡尺來查找最小面積或最小周長矩形 –

+0

這是需要的四邊形而不是矩形。 – jtlz2