python - 为什么 OpenCV 中的 drawcontours 不填充图像边缘的轮廓?

标签 python opencv

编辑: 我通过向图像添加一个 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 会这样,是否有某种方法可以让它填充边缘的轮廓。或者,另一种解决方案是找到如何检测图像边界中的轮廓(这样我就可以在需要时应用凸包)。

最佳答案

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

关于python - 为什么 OpenCV 中的 drawcontours 不填充图像边缘的轮廓?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19809030/

相关文章:

python - 如何在 tensorflow 中置换转置?

python - 我应该如何使用 Bokeh 和 Pandas 绘制带有分类数据的散点图?

c++ - Zed Camera - 使用 openCV 在 C++ 中获取数据

c++ - 将 vector 的元素转换为用户定义的类型

带有抽象基类的 Python 类型提示

Python 在 Popen 中传递管道 '|' 参数

python - 如何使用 Pandas 测量 XY 点之间的距离

python - 如何使用 imwrite 从一个文件夹中获取图像并使用 Opencv 将它们保存到另一个文件夹?

c++ - 绘制特定颜色的矩形 OpenCV

python - 在opencv python中使用CV_CAP_PROP_POS_FRAMES从视频中获取帧