【问题标题】:cv2.contourArea didn't get the right areacv2.contourArea 没有得到正确的区域
【发布时间】:2013-02-20 15:34:14
【问题描述】:

'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的问题吗?需要你的帮助吗?

【问题讨论】:

    标签: area


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-07-06
      • 1970-01-01
      • 1970-01-01
      • 2022-06-20
      • 2017-01-03
      • 2020-03-16
      • 2019-07-20
      • 2020-02-04
      相关资源
      最近更新 更多