基于SIFT算子的车标识别算法matlab仿真

发布时间 2023-08-25 20:36:27作者: fpga和matlab

1.软件版本
matlab2017b

2.系统概述
本系统分为定位部分(包括车牌的定位和车标的定位)和车标特征向量提取和识别部分。本文车标的定位是根据车牌和车标的先验知识,提出一种由粗到精的车标定位方法。首先通过成熟的车牌定位方法对车牌进行定位,再根据车牌与车标的相对位置可以估计出车标的大概区域;接着利用 SOBLE 边缘检测算子对车标估计区域同时进行垂直边缘的检测和水平边缘的检测,分割车标区域与背景区域;接着再利用数学形态学进行腐蚀膨胀处理得到车标的精确区域。车标特征向量的提取利用 SIFT 算子进行提取。SIFT 算子的主要优点是信息量丰富,独特性好,适合在海量数据中进行快速、准确的匹配。通过 SIFT 算子对车标进行特征提取和特征向量的生成,最后通过欧式距离判断待匹配的车标向量与模板库的车标向量的相似性,最终达到识别出车标的作用。

3.部分程序

clc;
clear;
close all;
warning off;
addpath 'func\'

%导入车标,进行模式识别
%转换为灰度图
I1 = rgb2gray(imread('type/1.jpg'));
I2 = rgb2gray(imread('type/2.jpg'));
I3 = rgb2gray(imread('type/3.jpg'));
I4 = rgb2gray(imread('type/4.jpg'));



Img2= imread('images\20.jpg');
%配准线连接数量间隔设置
for kk = 1:4
if kk == 1
Img1 = I1;
end
if kk == 2
Img1 = I2;
end
if kk == 3
Img1 = I3;
end
if kk == 4
Img1 = I4;
end
%将图片大小进行统一
Img2 = imresize(Img2,[480,640]);
%%
%车牌的定位
[R,C,K] = size(Img2);
Img3 = zeros(R,C);
for i = 1:R
for j = 1:C
%候选区域的确定
if (Img2(i,j,1)<20) & (Img2(i,j,2)<20) & (Img2(i,j,3)>100)
Img3(i,j) = 1;
end
end
end
%%
%车标的初步定位
BW0 = bwareaopen(Img3,400);
[rows,cols] = size(BW0);
[L,n] = bwlabel(BW0);
for i=1 : n
[r,c]=find(L==i);
a1(i)=max(r);
a2(i)=min(r);
b1(i)=max(c);
b2(i)=min(c);

w(i)=b1(i)-b2(i);
h(i)=a1(i)-a2(i);
square = w(i)*h(i);
if square > 1000
Yc = (a1(i) + a2(i))/2;
Xc = (b1(i) + b2(i))/2;
end
end
Xc2 = Xc;
Yc2 = Yc-75;
xl = Yc2-40;
xr = Yc2+40;
yl = Xc2-50;
yr = Xc2+50;

CB = Img2(xl:Yc2+40,Xc2-50:Xc2+50,:);



figure(1);
imshow(Img2);
hold on
plot([b2:b1],a1*ones(size([b2:b1])),'r','linewidth',2);
hold on
plot([b2:b1],a2*ones(size([b2:b1])),'r','linewidth',2);
hold on
plot(b1*ones(size([a2:a1])),[a2:a1],'r','linewidth',2);
hold on
plot(b2*ones(size([a2:a1])),[a2:a1],'r','linewidth',2);
hold on
plot([yl:yr],xl*ones(size([yl:yr])),'g','linewidth',2);
hold on
plot([yl:yr],xr*ones(size([yl:yr])),'g','linewidth',2);
hold on
plot(yr*ones(size([xl:xr])),[xl:xr],'g','linewidth',2);
hold on
plot(yl*ones(size([xl:xr])),[xl:xr],'g','linewidth',2);
hold on
title('车标初步定位');

im1 = Img1;
im2 = rgb2gray(CB);

%基于SIFT的定位
gray1=(im1);
gray2=(im2);

[des1,loc1]=func_sift(gray1);
[des2,loc2]=func_sift(gray2);

figure(2);
func_drawPoints(im1,loc1,im2,loc2);

Num=2;Thresh=0.85;
match=func_BidirectionalMatch(des1,des2,Num,Thresh);
clear des1 des2
if isempty(match) == 0
loc1=loc1(match(:,1),:);
loc2=loc2(match(:,2),:);
figure(3);
func_linePoints(im1,loc1,im2,loc2);
Lens(kk) = length(match);
else
Lens(kk) = 0;
end

pause(1);
end

[V,I] = max(Lens);
if I == 1
figure;
imshow(Img2);
title('科鲁兹车','fontsize',16);
end
if I == 2
figure;
imshow(Img2);
title('别克车','fontsize',16);
end
if I == 3
figure;
imshow(Img2);
title('凯迪拉克车','fontsize',16);
end
if I == 4
figure;
imshow(Img2);
title('大众车','fontsize',16);
end

4.仿真结论

 

 

 

 

 

 [1]耿庆田, 于繁华, 王宇婷,等. 基于SIFT的车标识别算法[J]. 吉林大学学报:理学版, 2018, 56(3):6.