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

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算子在智能小车巡线中的运用_第1张图片


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

sobel算子在智能小车巡线中的运用_第2张图片



程序

下面是给出静态图片的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 - 1
Gx = (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);
end
end
subplot(1,4,2);imshow(im2uint8(uSobel));title('边缘检测后');  %画出边缘检测后的图像
%%%%%%%二值化%%%%%%%
for i = 2:high - 1
for j = 2:width - 1
if uSobel(i,j)<150    %阈值可调
uSobel(i,j)=0;
elseif  uSobel(i,j)>=150   %阈值可调
uSobel(i,j)=255;
end
end
end
subplot(1,4,3);imshow(im2uint8(uSobel));title('threshold');
%%%%%%%画出中心线%%%%%%%
for i = 2:high - 1
k=0;K=[];u=[];
for j = 2:width - 1
if  uSobel(i,j)>=200
k=k+1;
K(k)=uSobel(i,j);
u(k)=j;
end
end
p=length(u);
if p>0;
P=ceil((u(1)+u(p))/2);
uSobel(i,P)=255;
end
end
subplot(1,4,4);imshow(im2uint8(uSobel));title('center line');

效果如图:

sobel算子在智能小车巡线中的运用_第3张图片


参考文献

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

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

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


你可能感兴趣的:(图像处理,巡线小车)