智能车学习笔记——十字拐点寻找

十字在摄像头眼中(未经过逆透视的条件下)并不是一个标准的十字,这样也是我们判断十字拐点的依据。智能车学习笔记——十字拐点寻找_第1张图片

 大概就是这么个样子,这个图像可以把摄像头扫描出来的线弄到一个数组里在投到TFT屏幕上就能看出来了,但是鉴于你手里边没有车,你看看我画的就行,特点就是嘛,这几个角都是最突出的,而且由于之前的扫线函数加入了屏幕限制,所以智能车学习笔记——十字拐点寻找_第2张图片

 十字扫线出来的东西在数组里大概就是这么一个鬼样子,边上的两条实线,就是屏幕限制的值,好像一个是188-1,一个是2吧,记不住了,看上一篇代码你就知道了,接下来直接上代码,我给你讲一个,剩下的你看代码就懂了,都是一个意思。

//找右下拐点函数
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就没找到,正常人应该都能理解。返回值就是返回一个找到拐点的纵坐标,我后边斜入十字时候用的,先不用管。就用右下给你讲吧,我在纸上搞,打字太费劲了。made,今天卡尔曼差点没给我恶心死。

智能车学习笔记——十字拐点寻找_第3张图片

 以Y轴为准一行一行扫描,如果找到了就把点记入进一维数组,标志位置1并且跳出循环,这个一维数组就2个元素,[0]为拐点纵坐标所在行数,[1]为拐点对应纵坐标上的X值,后边有用。如果第一次没找到,那么就else,标志位置0,再去下一行找,因为他是个for循环嘛。

好了,大概就这些了,我感觉我写的比我当时在CSDN上看的都细多了,我以前看都是半蒙半猜,有的那个博客,连他的变量都不给注释,鬼才看得懂啊,没注释就能看懂的那都是对这个程序的逻辑非常了解的了,新手怎么可能看得懂,真是醉了。好好学吧,我亲爱的队友,我当时花时间捋出来的东西现在已经嚼碎了喂你了,早点带飞我,加油。吴大小姐!!!

你可能感兴趣的:(学习)