编辑:我通过向图像添加 2 位帧,然后使用我的代码,最后裁剪图像以删除多余的帧来绕过问题。这是一个丑陋的解决方案,但它有效!
我遇到了一个问题,我不确定这是错误还是我缺乏经验。我将尝试尽可能清楚地总结它:
我得到一个二进制图像,其中包含我要分析的彩色图像的轮廓(白色像素是我的算法检测到的轮廓的周长,其余的是黑色)。图像非常复杂,因为我想要检测的对象完全填充了图像(没有“背景”)。
我使用 findcontours 与该图像:
contours, hierarchy = cv2.findContours(image,cv2.RETR_CCOMP,cv2.CHAIN_APPROX_NONE)
然后“for”循环检测面积小于“X”像素的轮廓和
hierarchy[0][x][3] >= 0
(让我们调用新数组“contours_2”)我在新图像中绘制“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
根本不起作用,因为将每个轮廓都返回为假。
我可以在绘制轮廓之前使用 cv2.convexHull 绘制那些“边缘”轮廓,但我只需要在边缘上使用它(因为它会使轮廓变形,我想尽可能避免这种情况)。问题是......我无法检测哪些轮廓在图像的边缘,哪些不是,并且可以使用drawcontours。
所以我想问一下为什么 drawContour 会这样,以及是否有某种方法可以让它填充边缘的轮廓。或者,另一种解决方案是找到如何检测图像边界中的轮廓(这样我可以在需要时应用凸包)。