这是一张经过处理后的红灯的图像,我们需要找到其中的红灯,可以看到是两个圆,用霍夫圆之后发现其中调参非常麻烦,于是写了一个根据轮廓来分析圆的算法。
算法思想:findContours()找到图像的轮廓,使用minEnclosingCircle()找到轮廓的最小包围矩形,计算轮廓上的每个点到圆心的距离和半径的差值,进行累加(简单来说就是求轮廓中每个点到圆心距离和半径的方差),当累加和小于某个值时,我们认为它是一个圆。
核心函数:
//对轮廓进行分析
float calculateCircularity(vector<Point> contours)
{
Point2f center;
float radius = 0;
minEnclosingCircle((Mat)contours, center, radius);
float fsum = 0;
float fcompare = 0;
for (int i = 0; i < contours.size(); i++)
{
Point2f ptmp = contours[i];
//计算距离
float fdistance = sqrt(((float)ptmp.x - center.x)*((float)ptmp.x - center.x) + ((float)ptmp.y - center.y)*((float)ptmp.y - center.y));
//累加距离到圆心的差值
float fdiff = abs(