代码之家  ›  专栏  ›  技术社区  ›  Gui

opencv findcontours()只返回一个外部轮廓

  •  0
  • Gui  · 技术社区  · 7 年前

    我试图隔离验证码中的字母,我设法过滤了验证码,结果产生了黑白图像:

    但是当我试图用opencv的findcontours方法分离字母时,它发现了一个覆盖我整个图像的外部轮廓,从而产生了这个图像(图像外部的黑色轮廓)。

    我将此代码与python 3和opencv3.4.2.17一起使用:

    img=阈值图像(img)
    cv2.imwrite(“images/threshold.png”,img)
    
    图像,轮廓,=cv2.findcontours(img,cv2.retr_external,cv2.chain_about_none)
    
    对于i,枚举中的轮廓(轮廓):
    面积=cv2.轮廓面积(轮廓)
    cv2.绘制轮廓(img,轮廓,i,(0,0,0),3)
    
    cv2.imwrite('images/output3.png',img)
    < /代码> 
    
    

    我只想我的最终结果是每个字符外的5个轮廓。

    但是当我试图用opencv的findcontours方法分离字母时,发现了一个外部轮廓,它包围了我的整个图像,从而产生了这个图像(图像外部的黑色轮廓)。

    enter image description here

    我将此代码用于python 3和opencv3.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 回复  |  直到 7 年前
        1
  •  2
  •   Amog Chandrashekar    7 年前

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

    导入cv2
    img=cv2.imread('从图像到图像,0)
    backup=img.copy()备份输入图像
    备份=255备份颜色反转
    < /代码> 
    
    

    我使用retr_tree作为轮廓检索模式,它检索所有轮廓并创建完整的族层次列表。请在此处查找相同的文档

    ,outlines,u=cv2.findcontours(backup,cv2.retr_tree,cv2.chain_about_none)
    < /代码> 
    
    

    然后遍历轮廓并围绕轮廓绘制矩形

    for i,contour in enumerate(contours):
    x,y,w,h=cv2.边界矩形(轮廓)
    cv2.矩形(img,(x,y),(x+w,y+h),(0,255,0),1)
    < /代码> 
    
    

    保存图像

    cv2.imwrite('output3.png',img)
    < /代码> 
    
    

    我得到了这样的结果-

    价值。

    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)
    

    然后遍历轮廓并围绕轮廓绘制矩形

    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)
    

    我得到了这样的结果-

    enter image description here

        2
  •  0
  •   Michael Burdinov    7 年前

    您使用了flag retr_external,这意味着它只查找对象的最外轮廓,而不查找孔。在您的例子中,白色物体覆盖了一个有几个孔(字母/数字)的完整图像。您有两个选择:

    1. 用“不按位”反转图像中的颜色

    2. 用RETR U列表标记收集所有轮廓。请注意,它还将收集数字内的孔。