智能车图像处理4-环岛辅助判断条件

前言

这篇文章主要讲述环岛判断一些辅助条件的算法实现。

一、函数主体

/*
环岛辅助条件用于决定是否进入环岛判断函数
下面的辅助条件主要有两个方面:
(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));
}
//求两数之差绝对值结束

总结

代码运行成功,就可以获取到环岛判断的重要条件,左右线的差别情况。

你可能感兴趣的:(图像处理,人工智能,算法)