为了账号安全,请及时绑定邮箱和手机立即绑定

OpenCV findContours()仅返回一个外部轮廓

OpenCV findContours()仅返回一个外部轮廓

慕斯709654 2021-05-05 09:33:13
我试图隔离验证码中的字母,我设法过滤了验证码,结果得到了这个黑白图像:但是,当我尝试使用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个轮廓。
查看完整描述

2 回答

?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

要提取的轮廓应为白色,背景为黑色。我对您的代码进行了一些修改,消除了未添加任何值的行。


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)

我得到的结果看起来像这样-

//img1.sycdn.imooc.com//609a3ebf0001997001910045.jpg

查看完整回答
反对 回复 2021-05-11
?
湖上湖

TA贡献2003条经验 获得超2个赞

您使用了标志RETR_EXTERNAL,这意味着它仅在寻找对象的最外轮廓,而不在寻找孔。在您的情况下,发现白色物体覆盖了整个图像,几乎没有孔(字母/数字)。您有两种选择:

  1. 用“ bitwise_not”反转图像中的颜色

  2. 使用RETR_LIST标志收集所有轮廓。请注意,它还会在手指内收集孔。


查看完整回答
反对 回复 2021-05-11
  • 2 回答
  • 0 关注
  • 440 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信