浅谈智能车摄像头组斜入十字处理方法

     好久没有发文章了,也应小伙伴们的要求写这一篇十字处理方法,希望能够对大家有所帮助。

     全国大学生智能车竞赛摄像头组中的难点其中之一我认为就是十字路况的一个处理方法,进入十字的情况多种多样,有从直道进入十字的情况这种情况是在十字中最容易处理的情况,通常直接向上搜索边界就可以得到很好的结果,最难处理的情况是斜入十字的情况,这个情况不知道困扰过多少人,至少我是被这个问题困扰了两届比赛,最后经过观察图像和研究最终还是找到了一个比较好的解决方案。
 

浅谈智能车摄像头组斜入十字处理方法_第1张图片


就比如这种情况,正常应该是往左走但是我们要怎么去识别出来这种情况呢?
我的解决方案分为以下几个部分:
1.      首先左边右边进行搜索从下至上依次搜索一遍,这时候会得到一个边界,但是得到的边界肯定是不准确的,不能通过它直接求取中线然后计算偏差,否则实际效果会让你觉得很迷。

浅谈智能车摄像头组斜入十字处理方法_第2张图片

正常搜索会出问题的区域

 
2.      上面第一步得到的边界时不准确的,那么接下来我要在第二步搜索中更正上一次出现的错误,如何去做呢?我的方法是从下向上纵向搜索,不在是横向搜索。纵向搜索的好处在于可以通过边界的像素分布看出当前搜索的边界属于左边界还是右边界,通过区分左右边界后可以很容易的找到十字缺口处的拐点。

 
浅谈智能车摄像头组斜入十字处理方法_第3张图片
斜入十字图像


拐点1

浅谈智能车摄像头组斜入十字处理方法_第4张图片
拐点2

3.      找到两拐点后接下来就没有什么难点了,接下来我的处理方法是从新计算两个拐点之间的中线,简单来说就是一个拟合直线的过程,这样就可以得到一个很好地中线。
       在采用了这种算法之后在十字路口基本就再也没有出错的时候了,但是建议选择广角镜头这样能够看到近处更大的范围,有助于十字搜索判断。上述方法即是本人采用的十字处理方案,这里只是一种情况,其他情况类似,通过自己的实验很容易把条件约束起来,因为每个人遇到的情况都有所不同,但是方法可以类似,希望这种方法能够帮助你解决斜入十字的问题。


附加一段左右边界判断程序
//////////////////////以下区分出左右边缘///////////////////////////
    uint8 xnum=num-1;
    uint8 bian_num=0;                                    //记录有效左右边缘点数
    for (int i=0;i<=xnum;i++)
    {
        uint8 x=bian[0][i];                                    //将该像素点的x坐标赋值给x
        uint8 y=bian[1][i];                                    //将像素点的y坐标赋值给y
        //以下为从左往右扫描 扫到第一个左边  要记住
        uint8 xy1=img[x][y+1];
        uint8 x1y=img[x+1][y];
        uint8 xy_1=img[x][y-1];
        uint8 x_1y=img[x-1][y];
        if (xy1==255&&x1y==255&&xy_1==0&&x_1y==0)
        {
            bianyuan[0][bian_num]=x;
            bianyuan[1][bian_num]=y;
            bianyuan[2][bian_num]=1;                                    //第三项为1 认为是左边界
            bian_num=bian_num+1;
        }
        else if (xy1==0&&x1y==255&&xy_1==255&&x_1y==0)
        {
            bianyuan[0][bian_num]=x;
            bianyuan[1][bian_num]=y;
            bianyuan[2][bian_num]=2;                                    //第三项为2 认为是右边界
            bian_num=bian_num+1;
        }
    }


你可能感兴趣的:(图像处理,软件编程)