十字在摄像头眼中(未经过逆透视的条件下)并不是一个标准的十字,这样也是我们判断十字拐点的依据。
大概就是这么个样子,这个图像可以把摄像头扫描出来的线弄到一个数组里在投到TFT屏幕上就能看出来了,但是鉴于你手里边没有车,你看看我画的就行,特点就是,这几个角都是最突出的,而且由于之前的扫线函数加入了屏幕限制,所以
十字扫线出来的东西在数组里大概就是这么一个样子,边上的两条实线,就是屏幕限制的值。
//找右下拐点函数
int find_rightdown_point(int start_point, int end_point)
{
int j;
for (j = start_point; j <= end_point; j++)
{
//找右边突变(下拐点)
if (abs(rightline[j+2] - rightline[j +1])<= 3 && abs(rightline[j+1] - rightline[j]) <= 3 && (rightline[j-1] - rightline[j]>3 )
&& right_flag[j+2] == 1 && right_flag[j +1] == 1 && right_flag[j] == 1&& right_flag[j-1] == 0)//此三点找到,[j-1]应该为未扫到线
{
right_turn_down[0] = j ;//用一维数组两个值来记录拐点坐标,为y=j,x=rightline[j]
right_turn_down[1] = rightline[j];
youxia_guai=1;
break;
}
else{youxia_guai=0;}
}
return j;
}
//找左下拐点函数
int find_leftdown_point(int start_point, int end_point)
{
int j;
//找十字左下拐点
for (j = start_point; j <= end_point; j++)
{
//找左边突变(下拐点)
if (abs(leftline[j ] - leftline[j +1]) <= 3 && abs(leftline[j+1] - leftline[j +2]) <= 3 && (leftline[j] - leftline[j-1] >4)
&& left_flag[j +1] == 1 && left_flag[j +2] == 1 && left_flag[j] == 1&&left_flag[j-1] == 0)
{
left_turn_down[0] = j;//同上
left_turn_down[1] = leftline[j];
zuoxia_guai=1;
break;
}
else{zuoxia_guai=0;}
}
return j;
}
//找左上拐点函数
int find_leftup_point(int start_point, int end_point)
{
int j;
for (j = start_point; j <= end_point; j++)
{
//如果出现了连续的行数超过45行判定为长直道,此时不存在拐点
if (zuo_lianxv >= 45){zuoshang_guai=0;break;}
//左上拐点
if ((leftline[j ] - leftline[j +1]) > 4 && abs(leftline[j] - leftline[j - 1]) <= 3 && abs(leftline[j -1] - leftline[j-2]) <= 3
&& left_flag[j - 2] == 1 && left_flag[j] == 1 && left_flag[j-1] == 1&&left_flag[j+1] == 0)
{
left_turn_up[0] = j;
left_turn_up[1] = leftline[j];
zuoshang_guai=1;
break;
}
else{zuoshang_guai=0;}
}
return j;
}
//找右上拐点
int find_rightup_point(int start_point, int end_point)
{
int j;
for (j = start_point; j <= end_point; j++)
{
//如果出现了连续的行数超过45行判定为长直道,此时不存在拐点
if (you_lianxv >= 45) {youshang_guai=0; break;}
//右上拐点
if ((rightline[j+1] - rightline[j]) > 4 && abs(rightline[j] - rightline[j - 1]) <= 3 && abs(rightline[j -1] - rightline[j-2]) <= 3
&& right_flag[j - 1] == 1 && right_flag[j] == 1 && right_flag[j-2] == 1&& right_flag[j + 1] == 0)
{
right_turn_up[0] = j;
right_turn_up[1] = rightline[j];
youshang_guai=1;
break;
}
else{youshang_guai=0;}
}
return j;
}
标志位我都是用拼音写的,1就是找到了,0就没找到。返回值就是返回一个找到拐点的纵坐标,我后边斜入十字时候用的,先不用管。就用右下讲。
以Y轴为准一行一行扫描,如果找到了就把点记入进一维数组,标志位置1并且跳出循环,这个一维数组就2个元素,[0]为拐点纵坐标所在行数,[1]为拐点对应纵坐标上的X值,后边有用。如果第一次没找到,那么就else,标志位置0,再去下一行找,因为他是个for循环嘛。