0

'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]或其他数字时,仍然有一个区域。我对这个问题一无所知,只有一个轮廓。

为什么会出现这么多值?是发现thresh的问题吗?需要你的帮助?

4

1 回答 1

1

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

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

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

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

于 2013-03-06T01:29:03.827 回答