# 寻找圆形

### 步骤

1.将图像灰度化以及二值化，将简单背景去除
2.中值滤波去除椒盐噪声
3.从左上角开始对每一列进行扫描，找到第一个非0像素点，记录下其位置并扫描下一列
4.根据找出的每两个像素点之间横坐标x的距离，将三个区域分割开
5.对每一个区域进行斜率统计，这里的斜率统计是说，在每个区域内，从左到右依次计算相邻两个点之间的斜率，并相加起来得到总和与平均值
6.对比每个区域的总和与平均值就能找到圆形区域了

### 代码

//判断各个图像块的斜率
int temp_k = 0;
float x1 = 0, x2 = 0, y1 = 0, y2 = 0, k = 0, k_sum = 0, k_time = 0, k_div = 0, k_zero = 0;
if (first_obj.size() > 20 && temp_k == 0)
{
for (int i = 0;i < first_obj.size() - 1;i++)
{
x1 = first_obj[i].x;
y1 = first_obj[i].y;
x2 = first_obj[i + 1].x;
y2 = first_obj[i + 1].y;
k = (y2 - y1) / (x2 - x1);
if (abs(k) < 3)
{
k_sum = k + k_sum;
++k_time;
}
if (k == 0)
{
++k_zero;
}
}
k_div = k_sum / k_time;
k_zero = k_zero / k_time;
cout << "k_div " << abs(k_div) << endl;
cout << "k_sum " << abs(k_sum) << endl;
cout << "k_zero " << k_zero << endl;
if (abs(k_div) < div4k && abs(k_sum) < sum4k && k_zero < zero4k)
{
temp_k = 1;
Point2i P;
int temp_i = (int)(first_obj.size() / 2);
P = first_obj[temp_i];
int R = (int)((first_obj[first_obj.size() - 1].x - first_obj[0].x) / 2);
P.y = P.y + R;
cout << "print " << R << endl;
circle(show_frame, P, R, Scalar(155, 255, 255), 3, 8);
if(P.x>=get1&&P.x<=get2) sendCoorFire(R, mySerialPort);
}
else
{
k_time = 0;
k_div = 0;
k_sum = 0;
k_zero = 0;
}
}

kevin的github点这里

• 广告
• 抄袭
• 版权
• 政治
• 色情
• 无意义
• 其他

120