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

时间:2018-04-19 01:20:20

标签: python-3.x numpy opencv3.0 centroid

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

binary image]

    _, 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']) 

所以我只是简单地添加了np.array contours,并在moments中使用了openCV。 它看起来效果很好......但我不确定self.cxself.cy是否真的是白色区域的破坏者。

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

1 个答案:

答案 0 :(得分:1)

如果您不确定自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获得的值相匹配。所以我猜你一直在做这件事!