轮廓的质心总是其几何中心吗?(OpenCV、Python)

轮廓的质心总是其几何中心吗?(OpenCV、Python),python,opencv,Python,Opencv,我正在使用OpenCV+Python,希望找到以下轮廓的几何中心: OpenCV文档建议使用以下方法查找轮廓的质心: import numpy as np import cv2 as cv img = cv.imread('star.jpg',0) ret,thresh = cv.threshold(img,127,255,0) im2,contours,hierarchy = cv.findContours(thresh, 1, 2) cnt = contours[0] M = cv.mom

我正在使用OpenCV+Python,希望找到以下轮廓的几何中心:

OpenCV文档建议使用以下方法查找轮廓的质心:

import numpy as np
import cv2 as cv
img = cv.imread('star.jpg',0)
ret,thresh = cv.threshold(img,127,255,0)
im2,contours,hierarchy = cv.findContours(thresh, 1, 2)
cnt = contours[0]
M = cv.moments(cnt)
print( M )

#Centroid
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])
如果我是对的,根据这个公式,质心被计算为轮廓所有点的平均值(或平均值?)。 然而,例如,如果在轮廓上部检测到的点少于轮廓下部检测到的点,则质心将略高于(完全检测到的)轮廓的实际几何中心

我说得对吗

如果是这样,那么计算轮廓极值点的平均值是否更好,以找到轮廓的几何中心,并以这种方式完全不依赖于是否均匀检测到轮廓点

我说得对吗

不可以。OpenCV函数
moments()
使用中提到的。格林定理确实是找到形状质心的正确方法。格林定理特别将某些形状的积分与形状边界的积分联系起来。因此,有多少个点定义边界根本不重要


我特别说质心,因为你可以将单通道图像数组传递到
矩()
,也可以计算矩,而不仅仅是点数组。然而,对于图像阵列,如果阵列只是二进制的,那么质心就是质心。对于一组点(从轮廓中),没有阵列可以显示内部的像素值,因此结果仍然是质心。

这里有官方文件:感谢您的回复。我不敢肯定你是对的。首先,格林定理适用于闭合曲线(即使w可能闭合一条曲线并从整个结果中减去额外部分),因此点数确实很重要。其次,想象一下,在我上传的图像中,轮廓的一个小的连续部分丢失了,那么Green定理现在是如何将这个轮廓所包围的确切区域?这些条件不存在。正如你所说,格林定理(以及一般的矩)只存在于闭合曲线和形状。如果你去掉其中一条边,它就不再是一条闭合的曲线,所以获得一个力矩是没有任何意义的<代码>力矩()始终假定为闭合曲线。还是不行,分数多少并不重要。这是一个积分。不管你的积分是10分还是1分,答案都是一样的。哈哈,好的,我知道了。即使我的问题是,当你回答(预设闭合曲线的)条数时,点数是否重要。