Intelligent car image processing 4-Auxiliary judgment conditions for roundabouts

foreword

This article mainly describes the algorithm implementation of the roundabout to judge some auxiliary conditions.

1. The main body of the function

/*
环岛辅助条件用于决定是否进入环岛判断函数
下面的辅助条件主要有两个方面:
(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;  //第二防止误判偏离平方


    }
}

2. Auxiliary function

//双断点开始


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));
}
//求两数之差绝对值结束

Summarize

After the code runs successfully, you can obtain the important conditions for the judgment of the roundabout and the difference between the left and right lines.

Guess you like

Origin blog.csdn.net/taiyuezyh/article/details/122773830