十字补线
补线原理
在判断十字的时候,我们能看到图像中最明显的特征就是十字的四个拐点,而我们在对十字进行补线的时候,显然也可以根据拐点进行处理,将左上拐点与左下拐点连接,右上拐点与右下拐点连接,这样我们就将十字这个特殊元素补成了直道元素。
这就是一个最常规的十字的补线方法,但是在车辆行驶过程中,还会遇到其他情况,如下面两种情况
这两种也是车辆在行驶过程中的常见图像,但是我们要区分这些情况也比较简单,依据拐点的不同,以及下半部分图像的丢线数量就可以做到很好的区分。
拐点的寻找
对于拐点的寻找,我根据拐点的位置不同,将拐点区分为左上拐点,左下拐点,右上拐点和右下拐点。对于不同的拐点我使用不同的寻找拐点的函数来进行寻找(其实可以整合到一个函数中,每次使用规定对应的数组以及步长就好,但我懒)。下面把四个函数摆出来:
byte find_Left_H_point(byte begin, byte end)
{
if (begin < 10) begin = 10;
if (end > 66) end = 66;
if (end > Lose_line - 5) end = (byte)(Lose_line - 5 > 0 ? Lose_line - 5 : 0);
byte num = 68;
for (byte i = begin; i < end; i++)
{
if (((L_black[i - 1] - L_black[i] > number_large_cha) || (L_black[i - 2] - L_black[i] > number_large_cha)) && my_abs(L_black[i + 1], L_black[i]) + my_abs(L_black[i + 2], L_black[i + 1]) < number_lian)
{
//大跳变上拐点
if ((flag_cirle != 2 && flag_cirle != 3 && flag_cirle != 7) && Left_lose[i] > 40) continue;
num = (byte)(i + 1);
break;
}
else if (L_black[i - 5] - L_black[i] > 20 && my_abs(L_black[i + 1], L_black[i]) + my_abs(L_black[i + 2], L_black[i + 1]) < number_lian)
{
byte number_cha = 0;
for (byte j = 1; j <= 6; j++)
{
if (L_black[i - j] - L_black[i - j + 1] > number_little_cha) number_cha++;
}
if (number_cha > 3) num = i;
}
}
return num;
}//寻找左上拐点
byte find_Right_H_point(byte begin, byte end)
{
if (begin < 10) begin = 10;
if (end > 66) end = 66;
if (end > Lose_line - 5) end = (byte)(Lose_line - 5 > 0 ? Lose_line