寻找两个(或更多)轮廓的质心

Finding centroid of two(or more) contours

我有 binary images 如下所示。我想获得白色区域的质心。(不是每个轮廓的质心)这张图片有两个独立的轮廓

    _, contour, _ = cv2.findContours(binary_image, cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)

    total_contour = contour[0]
    for ctr in contour[1:]:
            total_contour = np.concatenate((total_contour, ctr), axis =0)

    mmt = cv2.moments(total_contour)
    self.cy = int(mmt['m10']/mmt['m00']) 
    self.cx = int(mmt['m01']/mmt['m00']) 

所以我只是简单地添加了 contoursnp.array,并在 openCV 中使用了 moments。 它看起来运行良好...但我不确定 self.cxself.cy 是否真的是白色 regoins 的 cetroid。

我做的对吗?如果没有,有什么更好的方法吗?

如果您不确定从 openCV 获得的结果,您始终可以自己计算质心。很简单,方法如下:

centroid = [nz.mean() for nz in binary_image.nonzero()]

如果您希望质心采用与从 openCV 获得的相同 x,y 索引格式,请执行以下操作:

import numpy as np
centroid = np.array([nz.mean() for nz in binary_image.nonzero()][2::-1], dtype=int)

我 运行 您在问题中发布的图像上的上述代码行,这是我得到的:

[133  44]

如果它让您感觉更好,那确实与我在 运行 您发布的 openCV 片段时获得的 cxcy 的值相匹配。所以我猜你一直都在做对!