理论:
图像的矩
零阶矩
这里的图像是单通道图像, V(i,j)V(i,j)表示图像在 (i,j)(i,j)点上的灰度值。
我们可以发现,当图像为二值图时, M00就是这个图像上白色区域的总和,因此, M00可以用来求二值图像(轮廓,连通域)的面积
一阶矩
当图像为二值图时, V(i,j) 只有0(黑),1(白)两个值。 M10 就是图像上所以白色区域 x坐标值的累加。因此,一阶矩可以用来求二值图像的重心:
##二阶矩
二阶矩可以用来求物体形状的方向:
##代码
Mat image = imread(imagename, 0);//读入灰度图
Mat binary;
//二值,椭圆是黑色的,所以反色下
threshold(image, binary, 200, 255, CV_THRESH_BINARY_INV);
Moments m = moments(binary, true);//moments()函数计算出三阶及一下的矩
Point2d center(m.m10 / m.m00, m.m01 / m.m00);//此为重心
//计算方向
double a = m.m20 / m.m00 - center.xcenter.x;
double b = m.m11 / m.m00 - center.xcenter.y;
double c = m.m02 / m.m00 - center.ycenter.y;
double theta = fastAtan2(2b,(a - c))/2;//此为形状的方向