【问题标题】:OpenCV cv2.moments returns all moments to zeroOpenCV cv2.moments 将所有矩归零
【发布时间】:2022-05-15 23:48:00
【问题描述】:

由于某种我无法理解的原因,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}

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

【问题讨论】:

    标签: python opencv computer-vision geometry


    【解决方案1】:

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

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

    因此,由于轮廓是开放的,因此没有区域以它为界,换句话说,轮廓所包围的区域为零。

    为了找到这个,我们可以使用cv2.contourArea预先计算轮廓内的区域,如果该区域为零,则轮廓是开放的,不需要继续。

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

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

    【讨论】:

    • opencv中是否有检查轮廓是否简单的功能? cv2.contourArea 被认为是不确定的,如果轮廓有自相交。
    • 我在答案中添加了一种检查自我交叉点的方法
    【解决方案2】:

    当你打开轮廓时,我会离开解决方案。

    解决方案

    1. 将轮廓更改为二进制掩码。
    2. 使用二进制掩码计算矩。

    键码

    mask = np.zeros(image.shape[:2], np.uint8)
    cv2.fillPoly(mask, pts =[np.asarray(contour)], color=(1))
    M = cv2.moments(mask,binaryImage = True)
    

    【讨论】:

    • 或者只是通过将第一个顶点附加到列表末尾来关闭轮廓。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 2019-09-30
    • 2012-07-10
    • 1970-01-01
    • 2020-03-14
    相关资源
    最近更新 更多