原文:http://blog.csdn.net/moses1213/article/details/44679603
导师交给的项目,其中一步就是求光斑的重心,网上有很多关于重心的代码,大体是利用cvFindContour函数找出图像的轮廓,然后将图像阈值分割,二值化处理。这样处理后图像的灰度值只有0和1两个值,丢失了很多灰度信息,这样找出来的重心实际上是轮廓几何图形的形心,灰度值的影响并没有反应出来。
下面介绍一下灰度重心法:
对于亮度不均与的目标,灰度重心法可按目标光强分布求出光强权重质心坐标作为跟踪点,也叫密度质心算法。对于衣服M*N大小的图像f,像素的灰度值凡超过阈值T的均参与重心处理,于是重心坐标为:
Xi表示第i行的坐标,Xj表示第j行的坐标,f(i,j)表示第i行第j列的像素值。
- CvPoint grayCenter(IplImage* TheImage)
- {
- //灰度重心法求质心
- CvPoint Center;
- int i, j;
- CvScalar cs = cvSum(TheImage);
- Center.x = Center.y = 0;
- double x = 0;
- double y = 0;
- for(i = 0;i < TheImage->width;i++)
- {
- for(j = 0; j < TheImage->height;j++)
- {
- CvScalar s = cvGet2D(TheImage, j,i);
- x += i*s.val[0]/cs.val[0];
- y += j*s.val[0]/cs.val[0];
- }
- }
- Center.x = cvRound(x);
- Center.y = cvRound(y);
- return Center;
- }