簡體   English   中英

OpenCV findContours() 只返回一個外部輪廓

[英]OpenCV findContours() just returning one external contour

我試圖隔離驗證碼中的字母,我設法過濾了驗證碼,結果得到了這張黑白圖像:

在此處輸入圖片說明

但是當我嘗試使用 OpenCV 的 findContours 方法分離字母時,它只是發現了一個包裹我整個圖像的外部輪廓,從而產生了這個圖像(圖像外的黑色輪廓)。

在此處輸入圖片說明

我將此代碼與 Python 3 和 OpenCV 3.4.2.17 一起使用:

img = threshold_image(img)
cv2.imwrite("images/threshold.png", img)

image, contours, _ = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

for i, contour in enumerate(contours):
    area = cv2.contourArea(contour)
    cv2.drawContours(img, contours, i, (0, 0, 0), 3)

cv2.imwrite('images/output3.png', img)

我只希望我的最終結果是每個字符外有 5 個輪廓。

要提取的輪廓應為白色,背景為黑色。 我稍微修改了您的代碼,刪除了沒有添加任何值的行。

import cv2
img = cv2.imread('image_to_be_read',0)
backup = img.copy()   #taking backup of the input image
backup = 255-backup    #colour inversion

我使用 RETR_TREE 作為輪廓檢索模式,它檢索所有輪廓並創建完整的家庭層次結構列表。 請在此處找到相同的文檔

_, contours, _ = cv2.findContours(backup, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

在 opencv4 中,finContours 方法已更改。 請用:

contours, _ = cv2.findContours(backup, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)

然后遍歷輪廓並圍繞輪廓繪制矩形

for i, contour in enumerate(contours):
     x, y, w, h = cv2.boundingRect(contour)
     cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 1)

保存圖像

cv2.imwrite('output3.png', img)

我得到的結果看起來像這樣 -

在此處輸入圖片說明

您使用了標志 RETR_EXTERNAL,這意味着它只查找對象的最外層輪廓,而不是孔。 在您的情況下,找到了覆蓋整個圖像且幾乎沒有孔(字母/數字)的白色物體。 你有兩個選擇:

  1. 使用“bitwise_not”反轉圖像中的顏色

  2. 使用 RETR_LIST 標志收集所有輪廓。 請注意,它還會收集數字內的孔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM