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

十字在摄像头眼中(未经过逆透视的条件下)并不是一个标准的十字,这样也是我们判断十字拐点的依据。

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

 十字扫线出来的东西在数组里大概就是这么一个样子,边上的两条实线,就是屏幕限制的值。

//找右下拐点函数
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就没找到。返回值就是返回一个找到拐点的纵坐标,我后边斜入十字时候用的,先不用管。就用右下讲。

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

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-chu_kuang-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值