'1.png只有一个轮廓'
img = cv2.imread('1.png')
retval,dst = cv2.threshold(img,120,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(dst,cv2.RETR_EXTERANL,cv2.CHAIN_APPROX_SIMPLE)
print cv2.contourArea(contours[0],False)
图像只有一个轮廓,然后轮廓是一个列表。当我将contours[0]
更改为contours[3]
或其他数字时,仍然会有一个区域。我对这个问题没有任何想法,只有一个轮廓。
为什么出现这么多价值观?这是发现打谷的问题?需要你的帮助?
答案 0 :(得分:1)
问题在于OpenCV认为轮廓是您认为轮廓的一部分。换句话说,OpenCV将您的轮廓分割成碎片。您可以通过添加各个轮廓的区域来获得整个区域,但这种方法并不可靠。
你可以尝试的是Image Morphology。使用它,你可以“增长”轮廓,使它们重叠更多,这意味着OpenCV将它们识别为单个轮廓的机会会更大。
但是,这种方法会导致精度下降。因此,如果您需要一个确切的区域,您将不得不依赖其他方法。对于复杂的几何形状,这不是一项简单的任务。
我用过的另一个“快速而肮脏”的解决方案是创建一个新的单通道Mat(Mat::zeros
),绘制颜色值为255(drawContours
)的轮廓,并总结内容(在c ++中这是cv::sum
,对于你我认为它是cv2.sum
),然后将结果除以255.这将得到像素的区域,并且比对各个轮廓的面积求和更可靠,因为它会解释它们之间的重叠。