[英]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,這意味着它只查找對象的最外層輪廓,而不是孔。 在您的情況下,找到了覆蓋整個圖像且幾乎沒有孔(字母/數字)的白色物體。 你有兩個選擇:
使用“bitwise_not”反轉圖像中的顏色
使用 RETR_LIST 標志收集所有輪廓。 請注意,它還會收集數字內的孔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.