本文主要是介绍图像分割工作总结(六)opencv的轮廓矩,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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的轮廓矩的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!