sobel算子在智能小车巡线中的运用

来源:互联网 发布:178软件源地址 编辑:程序博客网 时间:2024/06/08 08:23

sobel的数学公式表达

(1)离散表达


(2)矩阵表达


(3)梯度的近似表达(滤波后的灰度值)


背景,在巡线中经常有一些轨迹鉴别的问题存在。如果不想随大流用普通的灰度传感器,又或者路面比较复杂的情况下。可以使用摄像头采集画面,对每一帧进行边界的识别(个人建议因为在巡线小车这样小巧的物体上不能放置电脑,所以采用51单片机或者stm32单片机的小伙伴们可以各帧采样或者隔合适帧采集,毕竟单片机的运算慢。)那么根据上面的公式我们可以得到轨迹的路线。其实还有其他的算法,不过呢,相比sobel算子,其他的算子计算量大,或者对于噪点的处理不佳。比较对于小车来说,先滤波什么的是不存在的,精度没这么高。


在得到轨迹线了之后就要循迹了,那么怎么循迹呢?最简单的是pd算法循迹,pd算法是pid算法除去了积分过程,只留下普通项与微分项。根据论文2,舵机的延时偏转就相当于一个积分过程。

pd算法

舵机PWM占空比=KP*偏心距+KD*偏心距变化率


舵机PWM占空比=KP*偏心距+KD*偏心距变化率+KA ∗V2/R

R为轨道半径;l:为前瞻;h为前瞻离轨道距离如图所示



如果想程序更好自动化水平高,那么可以考虑这样的特殊情况



程序

下面是给出静态图片的sobel轨迹识别的程序(matlab)

%%%%%%%边缘识别与画出中心线%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%imag = imread('D:\广东工业大学机器人学院\数字图像处理\1.jpg');  %读取关键帧,写上你的文件名imag = rgb2gray(imag);        %转化为灰度图subplot(1,4,1);imshow(imag);title('原图');[high,width] = size(imag);   % 获得图像的高度和宽度U = double(imag);uSobel = imag;%%%%%%%sobel边缘检测%%%%%%%for i = 2:high - 1   %忽略边缘行以防溢出for j = 2:width - 1Gx = (U(i+1,j-1) + 2*U(i+1,j) + U(i+1,j+1)) - (U(i-1,j-1) + 2*U(i-1,j) + U(i-1,j+1));Gy = (U(i-1,j+1) + 2*U(i,j+1) + U(i+1,j+1)) - (U(i-1,j-1) + 2*U(i,j-1) + U(i+1,j-1));uSobel(i,j) = abs(Gx) + abs(Gy);endendsubplot(1,4,2);imshow(im2uint8(uSobel));title('边缘检测后');  %画出边缘检测后的图像%%%%%%%二值化%%%%%%%for i = 2:high - 1for j = 2:width - 1if uSobel(i,j)<150    %阈值可调uSobel(i,j)=0;elseif  uSobel(i,j)>=150   %阈值可调uSobel(i,j)=255;endendendsubplot(1,4,3);imshow(im2uint8(uSobel));title('threshold');%%%%%%%画出中心线%%%%%%%for i = 2:high - 1k=0;K=[];u=[];for j = 2:width - 1if  uSobel(i,j)>=200k=k+1;K(k)=uSobel(i,j);u(k)=j;endendp=length(u);if p>0;P=ceil((u(1)+u(p))/2);uSobel(i,P)=255;endendsubplot(1,4,4);imshow(im2uint8(uSobel));title('center line');

效果如图:



参考文献

【1】蒋旭 . 两点算法求智能车赛道曲率 . 新技术新工艺 . 2014 . 32-33

【2】 第九届“飞思卡尔”杯全国大学生智能汽车竞赛技术报告 北京邮电大学 

【3】冈萨雷斯 数字图像处理 第二版 463-470


原创粉丝点击