对斑马线的识别分为3补: 1.计算斑马线黑色色块的宽度。
2.计算一行中斑马线黑色色块的个数。
3.计算一共有几行的斑马线。
步骤:如果黑色色块的宽度为4~8,则认为这一个色块有效,色块个数+1.色块宽度计算方法:从左向右扫描到第一个黑色边缘从此点开始计数,向左扫描第一个白色点并记录,最后用黑色点坐标减去百色点坐标就得到黑色块的宽度了。
接下来重复步骤扫描其他色块,每扫描到一个我们认为有效的色块(即黑色色块的宽度为4~8),色块个数加一,直到把这一行的色块个数都扫完,再去扫上一行。如果有大于等于4行的满足个数的黑色块,则认为找到了斑马线。
接下来上代码:
//判断斑马线函数
void banmaxian(int start_point, int end_point)
{
//变量标志位
int banmaxian_kuandu;//斑马线宽度
int banmaxian_hangshu;//斑马线行数
int banmaxian_geshu;//斑马线个数(块)
//从下往上扫描
for (int y = end_point; y >= start_point; y--)
{
banmaxian_kuandu=0;
banmaxian_hangshu=0;
banmaxian_geshu=0;
//从右往左扫描
for (int x =170; x >=30; x--)
{
int baidian_heng=0;
//扫描到黑色,就进判断
if (mt9v03x_image1[y][x] == 0)
{
for(int a=x;x<x+15;x++)//从黑色点向左侧扫描
{
//找到白色点
if(mt9v03x_image1[y][a] == 255)
{
//记录白色点的位置,跳出循环
baidian_heng=a;
break;
}
}//斑马线宽度等于黑白点的差
banmaxian_kuandu=x-baidian_heng;
}
else
{ //斑马线的宽度在4~8之间认为它成立为斑马线黑色块
if (banmaxian_kuandu >= 4 && banmaxian_kuandu <= 8)
{
//斑马线黑色块++
banmaxian_geshu++;
//斑马线色块宽度清零,进行下一个黑色块的扫描计算
banmaxian_kuandu = 0;
}
else
{
//如果不满足对黑色块的认为要求就直接清零,去计算下一个黑色块
banmaxian_kuandu = 0;
}
}
}
//如果色块的个数在6~9之间则认为这一行的斑马线满足要求,在去扫下一行
if (banmaxian_geshu >= 6 && banmaxian_geshu <= 9){banmaxian_hangshu++;}
}
//如果有大于等于4行的有效斑马线
if(banmaxian_hangshu>=4)
{
//斑马线标准位置1
banmaxian_biaozhiwei=1;
}
else{banmaxian_biaozhiwei=0;}
}