📄 tt1.m
字号:
function tt1(flag)
clc;
%clear;
for i=1:3
if(flag(i)==1)
if(i==1)
im1=imread('result_1.bmp');
end
if(i==2)
im1=imread('result_2.bmp');
end
if(i==3)
im1=imread('result_3.bmp');
end
%figure,imshow(im1);
im2=imread('mid2.bmp');
%figure,imshow(im2);
num=Mth(im2,im1);
if (num>7)
msgbox('禁止鸣笛!','基本信息');
end
im3=imread('youguai.bmp');
%figure,imshow(im3);
num=Mth(im3,im1);
if(num>7)
msgbox('禁止右拐!','基本信息');
end
im5=imread('zuoguai1.bmp');
%figure,imshow(im5);
num=Mth(im1,im5);
if(num>7)
msgbox('禁止左拐!','基本信息');
end
im4=imread('50.bmp');
%figure,imshow(im4);
num=Mth(im4,im1);
if(num>7)
msgbox('减速!限速50km/s','基本信息');
end
im6=imread('限速.bmp');
%figure,imshow(im6);
num=Mth(im6,im1);
if(num>7)
msgbox('减速!限速5km/s','基本信息');
end
end
end
function num = Mth(image1, image2)
%image1 = imread('a.bmp');
%image2 = imread('b.bmp');
% image1 = im2double(image1);
% H = fspecial('gaussian',[3 3],1);
% image1 = conv2(image1,H,'same');
% image1 = imnoise(image1,'salt & pepper', 0.02);
% 调用函数寻找每幅图象的特征点以及特征块.
% im = double(image)
% des 特征描述符
% loc 特征点坐标、角度、尺度
[im1, des1, loc1] = sift(image1);
[im2, des2, loc2] = sift(image2);
fprintf('matching...');
%两个向量(a1,a2,a3,...),(b1,b2,b3,...)的距离,可以用欧基里德距离来计算:d=(a1-b1)^2+(a1-b1)^2+
%(a1-b1)^2+...也可以用d=acos(a1*b1+a2*b2+a3*b3)来计算,由于在MATLAB中后者的运算速度要远远快于前者
%所以这里用后者来计算两个特征向量之间的距离
%匹配时,用图象1里的一个向量和图象2中的所有向量进行匹配(即计算距离),那么有一个最佳匹配和一个次佳。distRatio表示
%次佳和最佳之间的比值,可以用来消除很大一部分的误配,distRatio越大=最后匹配点越多(误差越大),distRatio越小=最后
%匹配点越少(误差越小),
distRatio = 0.75;
%下面进行匹配
des2t = des2'; % 转置
for i = 1 : size(des1,1)
dotprods = des1(i,:) * des2t; % 计算图象1中的一个向量和图象2中所有向量的距离,并进行排序
[vals,indx] = sort(acos(dotprods));
% 如果最小距离小于次小距离的distRatio倍,则认为匹配成功.
if (vals(1) < 0.15) && (vals(1) < distRatio * vals(2))
match1(i) = indx(1); %匹配标记match1(i)>0表示此处匹配
else
match1(i) = 0;
end
end
% 将2幅图象按一左一右放置.
%im3 = appendimages(im1,im2);
%figure('Position', [100 100 size(im3,2) size(im3,1)]);
%colormap('gray');
%imagesc(im3);
%hold on;
%cols1 = size(im1,2);
%j = 1;
%for i = 1: size(des1,1)
%if (match1(i) > 0) %画直线,图象1里的坐标(loc1(i,1),loc1(i,2),对应的图象2坐标(loc2(match1(i),1),loc2(match1(i),2)).
%line([loc1(i,2) loc2(match1(i),2)+cols1], ...
%[loc1(i,1) loc2(match1(i),1)], 'Color', 'w');
% point1(j,:) = loc1(i,:); %point1,point2为匹配点坐标,从loc1和loc2中把匹配点坐标单独拿出来,保存在point1,point2里
%point2(j,:) = loc2(match1(i),:); %方便下面的计算
%j = j + 1;
%end
%end
%hold off;
num = sum(match1 > 0);
fprintf('\nFound %d matches.\n', num);
if num <= 1
fprintf('too few matches found.\n', num);
return;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -