OpenCV cv2.moments将所有力矩返回为零

2024-06-30 14:58:29 发布

您现在位置:Python中文网/ 问答频道 /正文

由于某些我无法理解的原因,open cv函数cv2.moments返回一个字典,其中包含我提供的轮廓的所有零值。 这里是一个MWE:

contour = [[[271, 67]],
            [[274, 67]],
            [[275, 68]],
            [[278, 68]],
            [[279, 69]],
            [[283, 69]],
            [[284, 70]],
            [[287, 70]],
            [[288, 71]],
            [[291, 71]],
            [[292, 72]],
            [[295, 72]],
            [[292, 72]],
            [[291, 71]],
            [[288, 71]],
            [[287, 70]],
            [[284, 70]],
            [[283, 69]],
            [[279, 69]],
            [[278, 68]],
            [[275, 68]],
            [[274, 67]]
          ]

x=np.asarray(x)
moments = cv2.moments(x)

结果是:

print(moments)

{'m00': 0.0, 'm10': 0.0, 'm01': 0.0, 'm20': 0.0, 'm11': 0.0, 'm02': 0.0, 'm30': 0.0, 'm21': 0.0, 'm12': 0.0, 'm03': 0.0, 'mu20': 0.0, 'mu11': 0.0, 'mu02': 0.0, 'mu30': 0.0, 'mu21': 0.0, 'mu12': 0.0, 'mu03': 0.0, 'nu20': 0.0, 'nu11': 0.0, 'nu02': 0.0, 'nu30': 0.0, 'nu21': 0.0, 'nu12': 0.0, 'nu03': 0.0}

这种行为的意义是什么? 我相信这是因为轮廓是开放的,但我不确定。 是否有一种标准的方法通过检查轮廓是否事先打开或关闭来消除这种行为


Tags: 函数字典np原因opencv2cv轮廓
1条回答
网友
1楼 · 发布于 2024-06-30 14:58:29

我认为得到零的原因是因为轮廓是开放的,正如opencv文档中所述:“轮廓的力矩是以相同的方式定义的,但使用格林公式计算的。”

格林公式:在数学中,格林定理给出了围绕简单闭合曲线C的线积分与以C为界的平面区域D上的二重积分之间的关系。(维基)

因此,因为轮廓是开放的,所以没有被它包围的区域,或者换句话说,被轮廓包围的区域是零

为了找到这一点,我们可以使用cv2.contourArea预先计算轮廓内有界的面积。如果面积为零,轮廓是开放的,不需要继续

为了检查轮廓是否不自交,我不知道使用opencv的简单方法,但可以使用Shapely

  1. Convert the contour from opencv to Shapely
  2. 使用is_simple检查多边形是否自交

相关问题 更多 >