【问题标题】:Why drawcontours in OpenCV doesn´t fill contours in the edge of the image?为什么 OpenCV 中的 drawcontours 不会填充图像边缘的轮廓?
【发布时间】:2013-11-17 12:14:21
【问题描述】:

编辑:我通过向图像添加 2 位帧,然后使用我的代码,最后裁剪图像以删除多余的帧来绕过这个问题。这是一个丑陋的解决方案,但它有效!


我遇到了一个问题,我不确定这是一个错误还是我缺乏经验。我将尝试尽可能清楚地总结它:

  1. 我得到一个二进制图像,其中包含我要分析的彩色图像的轮廓(白色像素是我的算法检测到的轮廓的周边,其余的是黑色)。图像非常复杂,因为我要检测的对象完全填充了图像(没有“背景”)。

  2. 我对该图像使用 findcontours:

    contours, hierarchy = cv2.findContours(image,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_NONE)
    
  3. 然后“for”循环检测面积小于“X”像素和hierarchy[0][x][3] >= 0的轮廓(让我们将新数组称为“contours_2”)

  4. 我在新图像中绘制“contours_2”:

    cv2.drawContours(image=image2, contours=contours_2, contourIdx=-1, color=(255,255,255), thickness=-1)
    

问题在于 drawcontours 可以很好地绘制所有轮廓,但它不会“填充”图像边界中的轮廓(即在图像边缘有一个边界的轮廓)。我尝试将图像的边框像素(如框架)设置为 True,但它不起作用,因为 findcontours 自动将这些像素设置为零(在函数描述中)。

在上一个循环中使用cv2.contourArea 可以很好地检测这些轮廓并返回正常值,因此无法知道drawcontours 何时会忽略轮廓以及何时正确填充轮廓。 cv2.isContourConvex 根本不起作用,因为将每个轮廓都返回为 false。

我可以在绘制轮廓之前使用 cv2.convexHull 绘制那些“边缘”轮廓,但我只需要在边缘上使用它(因为它会使轮廓变形,我想尽可能避免这种情况)。问题是......我无法检测哪些轮廓在图像的边缘,哪些不是,并且可以使用 drawcontours。

所以我想问一下为什么 drawContour 会这样,以及是否有某种方法可以让它填充边缘的轮廓。或者,另一种解决方案是找到如何检测图像边界中的轮廓(这样我可以在需要时应用凸包)。

【问题讨论】:

    标签: python opencv


    【解决方案1】:

    如果您只有 1 个轮廓并且您使用 contourIdx=-1 它会认为轮廓中的每个点都是一个单独的轮廓。您需要将单个轮廓包装为列表(即contours=[contours_2],如果contours_2 中只有一个轮廓)

    【讨论】:

    • 哇,这个答案解决了我很长时间的搜索问题。我不明白为什么thickness=cv2.FILLED 似乎对每个人都有效,但对我来说,它只是画了一个轮廓。原因确实是我已经隔离了我的轮廓并且只有一个。谢谢!
    【解决方案2】:

    我在边缘填充轮廓没有问题,除了边缘出现一条小白线。

    import cv2
    import numpy as np
    
    rows=512
    cols=512
    
    # Create image with new colour for replacement
    img= np.zeros((rows,cols,3), np.uint8)
    img[:,:]= (0,0,0)
    
    #img=cv2.copyMakeBorder(img,1,1,1,1, cv2.BORDER_CONSTANT, value=[0,0,0])
    
    # Draw rectangle
    img = cv2.rectangle(img,(400,0),(512,100),(255,255,255),-1)
    
    imggray=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    
    
    # Find Contour
    _, contours, hierarchy = cv2.findContours( imggray.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
    cv2.drawContours(img, contours, 0, (0,0,255), -1)
    
    cv2.imshow('image',img)
    cv2.waitKey(0)
    

    【讨论】:

      【解决方案3】:

      改变

      cv2.drawContours(image=image2, contours=contours_2, contourIdx=-1, color=(255,255,255), thickness=-1)
      

      cv2.drawContours(image=image2, contours=contours_2, contourIdx=-1, color=(255,255,255), thickness=2)
      

      【讨论】:

      • 他要填充轮廓,而不是画粗线2
      猜你喜欢
      • 2017-12-27
      • 2020-05-23
      • 1970-01-01
      • 2013-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      相关资源
      最近更新 更多