cv2.contourArea没有得到正确的区域

时间:2013-03-06 01:18:47

标签: area

'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]或其他数字时,仍然会有一个区域。我对这个问题没有任何想法,只有一个轮廓。

为什么出现这么多价值观?这是发现打谷的问题?需要你的帮助?

1 个答案:

答案 0 :(得分:1)

问题在于OpenCV认为轮廓是您认为轮廓的一部分。换句话说,OpenCV将您的轮廓分割成碎片。您可以通过添加各个轮廓的区域来获得整个区域,但这种方法并不可靠。

你可以尝试的是Image Morphology。使用它,你可以“增长”轮廓,使它们重叠更多,这意味着OpenCV将它们识别为单个轮廓的机会会更大。

但是,这种方法会导致精度下降。因此,如果您需要一个确切的区域,您将不得不依赖其他方法。对于复杂的几何形状,这不是一项简单的任务。

我用过的另一个“快速而肮脏”的解决方案是创建一个新的单通道Mat(Mat::zeros),绘制颜色值为255(drawContours)的轮廓,并总结内容(在c ++中这是cv::sum,对于你我认为它是cv2.sum),然后将结果除以255.这将得到像素的区域,并且比对各个轮廓的面积求和更可靠,因为它会解释它们之间的重叠。