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 个轮廓。
您使用了标志 RETR_EXTERNAL,这意味着它只寻找物体的最外层轮廓,而不是孔洞。在您的情况下,找到了覆盖整个图像且几乎没有孔 (letters/digits) 的白色对象。您有两个选择:
使用 "bitwise_not"
反转图像中的颜色
收集带有RETR_LIST标志的所有等高线。请注意,它还会收集数字内部的孔洞。
要提取的轮廓应该是白色的,背景是黑色的。我稍微修改了你的代码,删除了没有增加任何价值的行。
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 作为轮廓检索模式,它检索所有轮廓并创建完整的家族层次结构列表。 Please find the documentation for the same here
_, 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)
我得到的结果是这样的 -
我正在尝试隔离验证码中的字母,我设法过滤了验证码,结果生成了这张黑白图像:
但是当我尝试使用 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 个轮廓。
您使用了标志 RETR_EXTERNAL,这意味着它只寻找物体的最外层轮廓,而不是孔洞。在您的情况下,找到了覆盖整个图像且几乎没有孔 (letters/digits) 的白色对象。您有两个选择:
使用 "bitwise_not"
反转图像中的颜色
收集带有RETR_LIST标志的所有等高线。请注意,它还会收集数字内部的孔洞。
要提取的轮廓应该是白色的,背景是黑色的。我稍微修改了你的代码,删除了没有增加任何价值的行。
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 作为轮廓检索模式,它检索所有轮廓并创建完整的家族层次结构列表。 Please find the documentation for the same here
_, 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)
我得到的结果是这样的 -