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 - 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');
效果如图:
参考文献
【1】蒋旭 . 两点算法求智能车赛道曲率 . 新技术新工艺 . 2014 . 32-33
【2】 第九届“飞思卡尔”杯全国大学生智能汽车竞赛技术报告 北京邮电大学
【3】冈萨雷斯 数字图像处理 第二版 463-470