我正在使用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'])
如果我是对的,根据这个公式,质心计算为轮廓的所有点的平均值(或平均值?)。 但是,如果例如在轮廓的上部检测到的点比在轮廓的下部检测到的点少,那么质心将比(完全检测到的)轮廓的实际几何中心略高。
我是对的吗?
如果是这样,那么最好是计算轮廓的极值点的平均值以找到轮廓的几何中心,这样就完全不依赖于是否均匀地检测到轮廓的点? / p>
答案 0 :(得分:0)
我是对的吗?
没有。 OpenCV函数moments()
使用Green's theorem中提到的OpenCV moments()
docs。格林定理确实是找到形状质心的正确方法。格林定理专门将关于某些形状的积分与关于形状边界的积分联系起来。因此,根本不确定有多少点定义边界。
我特意说中心,因为您可以将单通道图像阵列传递到moments()
以计算矩,而不仅仅是点阵。但是对于图像阵列,如果数组只是二进制,则质心是质心。并且通过一系列点(来自您的轮廓),没有数组可以告诉内部的像素值,因此结果同样仍然是质心。