opencv的轮廓矩在轮廓匹配中用的比较到,在做图像分割有关工作的时候用到矩来计算闭合区域的形心,现对这个知识点做详细的探究
p+q阶原点矩和中心距:
定义:
计算:
Void cvMoments(const CvArr*arr,CvMoments*moments, int binary = 0)
arr:图像(1-通道或3通道,有COI设置)或者多边形(点的CvSeq或一族点的向量)
moments:返回矩阵态度接口的指针
binary(仅对图像)如果标识为非0,则所有零像素点被当成零,其它的被看成1.
Double cvGetSpatialMoment(&moment, p, q); //得到普通矩
Double cvGetCentralMoment(&moment, p, q); // 得到中心矩
HU矩
利用中心距得到的7个距具有旋转和伸缩不变性,可用以轮廓识别
计算:Void cvGetHuMoment(CvMoments *moment,CvHuMoments *humoment)
在这次工作中,计算封闭区域的形心
CvMoments *moment = (CvMoments*)malloc(sizeof(CvMoments));
cvMoments( src, moment, 1);
m00 = cvGetSpatialMoment( moment, 0, 0 );
if( m00 != 0)
{
m10 = cvGetSpatialMoment( moment, 1, 0 );
m01 = cvGetSpatialMoment( moment, 0, 1 );
center.x = (int) (m10/m00);
center.y = (int) (m01/m00);
}分析:CvMoments CvMoments 结构体如下;
typedef struct CvMoments
{
double m00, m10, m01, m20, m11, m02, m30, m21, m12, m03; /* spatial moments */
double mu20, mu11, mu02, mu30, mu21, mu12, mu03; /* central moments */
double inv_sqrt_m00; /* m00 != 0 ? 1/sqrt(m00) : 0 */
}
最高可得三阶矩,可以用来计算HU距,cvGetSpatialMoment等函数,都是在cvMoments的基础上调用的。
本文深入探讨了OpenCV中轮廓矩的概念及其在图像分割任务中的应用,详细解释了如何使用轮廓矩计算闭合区域的形心,并通过实例展示了计算过程。同时介绍了HU矩的计算方法,以及它们在轮廓识别中的优势。
27万+





