概念
对于亮度不均匀的目标(如光斑,光条纹),灰度重心法可按目标光强分布求出光强权重质心坐标作为跟踪点,也叫密度质心算法。
将灰度值分布中的质心记作光条纹的中心
对于M * N大小的图像f,像素的灰度值凡是超过阈值T的均参与重心处理,于是重心坐标为:
灰度重心法公式
型心法
只可用于二值图像
灰度重心法version 1
灰度重心法version 2
使用Visual Studio 2019测试
根据灰度重心法version 1找光斑中心
代码:
#define T 20 //根据实际情况设定固定阈值
Point grayCenter(Mat& img)
{
Mat img_gray;
cvtColor(img, img_gray, COLOR_BGR2GRAY, 0);
Point Center; //中心点
int i, j;
double sumval = 0;
MatIterator_<uchar> it, end;
//获取图像各点灰度值总和
for (it = img_gray.begin<uchar>(), end = img_gray.end<uchar>(); it != end; it++)
{
((*it) > T) ? sumval += (*it) : NULL; //小于阈值,取0
}
Center.x = Center.y = 0;
double x = 0, y = 0;
for (int i = 0; i < img_gray.cols; i++)
{
for (int j = 0; j < img_gray.rows; j++)
{
double s = img_gray.at<uchar>(j, i); //取当前点灰度值
if (s < T)
s = 0;
x += i * s / sumval;
y += j * s / sumval;
}
}
Center.x = cvRound(x);
Center.y = cvRound(y);
cout << "rows=" << img_gray.rows << " cols=" << img_gray.cols << endl;
cout << "x=" << x << " y=" << y << endl;
return Center;
}
运行结果:
成功找到光斑中心(绿点)
在树莓派上测试
同样,在树莓派上
cmake .
make
执行! 成功!