前言
这篇文章主要讲述环岛判断一些辅助条件的算法实现。
一、函数主体
/*
环岛辅助条件用于决定是否进入环岛判断函数
下面的辅助条件主要有两个方面:
(1)环岛所在边在赛道上必须有两个断点 比如0-20连续 20-23空缺
24-30连续 31-35空缺 36-40连续 这两个空缺处就是环岛的入口和出口
(2)对于环岛来说 存在入口和出口的边的偏方差(我自己定义的函数,可以
直接类比方差)很大 而另一边则几乎是一条直线,偏房差很小
下面的代码主要就是在于寻找环岛的双端点和计算偏方差的比值
*/
void huandaofuzhu()
{
truepianfangflag = 0;
truepianfangflagforleft = 0;
if (turepodaoflag == 0 && (countpodao == 0 || countpodao > 1) && rukuflag == 0)
{
/*
环岛双断点在此处寻找但并没有直接应用,具体使用请跳转至环岛函数查看
*/
fingdoubleright(); //第一防止误判双断点
fingdoubleleft();
if (pianfangleft == 0 && pianfangright >= 39)
{
truepianfangflag = 1; //第二防止误判偏离平方
}
if (pianfangleft <= 10 && pianfangright >= 30 && pianfangright <= 60)
{
truepianfangflag = 1; //第二防止误判偏离平方
}
if (pianfangleft <= 30 && pianfangright >= 80 && pianfangright <= 180)
{
truepianfangflag = 1; //第二防止误判偏离平方
}
if (pianfangleft <= 4 && pianfangright >= 45)
{
truepianfangflag = 1; //第二防止误判偏离平方
}
if (pianfangleft <= 6 && pianfangright >= 60)
{
truepianfangflag = 1; //第二防止误判偏离平方
}
if (pianfangleft <= 40 && pianfangright >= 180 && pianfangright<= 280)
{
truepianfangflag = 1; //第二防止误判偏离平方
}
if (pianfangleft <= 20 && pianfangright >= 180 )
{
truepianfangflag = 1; //第二防止误判偏离平方
}
if (pianfangleft <= 60 && pianfangleft>=40&& pianfangright <= 110 && pianfangright >= 90)
{
truepianfangflag = 1; //第二防止误判偏离平方
}
/*
下面这些判断条件是我不断地跑赛道得出来的,大家使用的时候
需要根据自己摄像头的实际情况去调整。
*/
if (pianfangleft >= 60 && pianfangright <= 15 ) truepianfangflagforleft = 1; //第二防止误判偏离平方
if (pianfangleft >= 105 && pianfangright <= 18 && pianfangleft<=400) truepianfangflagforleft = 1; //第二防止误判偏离平方
if (pianfangleft >= 45 && pianfangright <= 4 && pianfangleft <= 400) truepianfangflagforleft = 1; //第二防止误判偏离平方
if (pianfangleft >= 300 && pianfangright <= 100 && pianfangleft <= 400) truepianfangflagforleft = 1; //第二防止误判偏离平方
}
}
二、辅助函数
//双断点开始
void fingdoubleleft()
{
int i = 0;
leftduan1 = 0;
leftduan2 = 0;
newopenleft = 0;
truedoubleleft = 0;
if (break_hangshu >= 10)
{
for (i = 4; i <= break_hangshu ; i++)
{
if (My_Abs(L_black[i], L_black[i + 1]) > 5)
{
leftduan1 = i + 1;
break;
}
if (i>=12&&L_black[i]==186&& L_black[i+1] != 186)
{
leftduan1 = i + 1;
break;
}
if (i == 28) break;
}
if (leftduan1 != 0)
{
for (i = leftduan1 + 1; i <= break_hangshu ; i++)
{
if (My_Abs(L_black[i], L_black[i + 1]) < 4&& My_Abs(L_black[i+1], L_black[i + 2])<4)
{
newopenleft = (int16)i;
break;
}
}
}
if (newopenleft != 0)
{
for (i = newopenleft; i <= break_hangshu ; i++)
{
if (My_Abs(L_black[i], L_black[i + 1]) > 5 && (i + 1) - leftduan1 >= 5 )
{
leftduan2 = i + 1;
break;
}
}
}
if (leftduan2 != 0 && leftduan2 >= leftduan1 + 5 &&My_Abs(LCenter[newopenleft],L_black[newopenleft])<=50)
{
for (i = leftduan2 + 1; i <= break_hangshu ; i++)
{
if (My_Abs(L_black[i], L_black[i + 1]) < 4&& L_black[i] != 186)
{
truedoubleleft = 1;
break;
}
}
}
}
}
void fingdoubleright()
{
int i = 0;
rightduan1 = 0;
rightduan2 = 0;
newopen = 0;
truedoubleright = 0;
if (break_hangshu >= 10)
{
for (i = 4; i <= break_hangshu ; i++)
{
if (My_Abs(R_black[i], R_black[i + 1]) > 5)
{
rightduan1 = i + 1;
break;
}
if (i>=12&&R_black[i]==0&& R_black[i+1]!=0)
{
rightduan1 = i + 1;
break;
}
if (i == 28) break;
}
if (rightduan1 != 0)
{
for (i = rightduan1 + 1; i <= break_hangshu ; i++)
{
if (My_Abs(R_black[i], R_black[i + 1]) < 4&& My_Abs(R_black[i+1], R_black[i + 2]) < 4)
{
newopen = (int16)i;
break;
}
}
}
if (newopen != 0)
{
for (i = newopen; i <= break_hangshu ; i++)
{
if (My_Abs(R_black[i], R_black[i + 1]) > 5&&(i+1)- rightduan1>=5)
{
rightduan2 = i + 1;
break;
}
}
}
if (rightduan2 != 0&& rightduan2>= rightduan1+5)
{
for (i = rightduan2 + 1; i <= break_hangshu ; i++)
{
if (My_Abs(R_black[i], R_black[i + 1]) < 4&&R_black[i]!=0)
{
truedoubleright = 1;
break;
}
}
}
}
}
//双断点结束
//求两数之差绝对值开始
int My_Abs(int a, int b)
{
if ((a - b) > 0)
return ((int)(a - b));
else return ((int)(b - a));
}
//求两数之差绝对值结束
总结
代码运行成功,就可以获取到环岛判断的重要条件,左右线的差别情况。