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

Posted fpga和matlab

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了车标识别基于SIFT算子的车标识别算法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














function [des,loc]=func_sift(im)


[row,col]=size(im);

% Convert into PGM imagefile, readable by "keypoints" executable
f=fopen('tmp.pgm','w');
if f==-1
    error('Could not create file tmp.pgm.');
end
fprintf(f, 'P5\\n%d\\n%d\\n255\\n', col, row);
fwrite(f,im','uint8');
fclose(f);

% Call keypoints executable
if isunix
    command = '!./sift ';
else
    command = '!siftWin32 ';
end
command = [command ' <tmp.pgm >tmp.key'];
eval(command);

% Open tmp.key and check its header
g=fopen('tmp.key','r');
if g==-1
    error('Could not open file tmp.key.');
end
[header,cnt]=fscanf(g,'%d %d',[1 2]);
if cnt~=2
    error('Invalid keypoint file beginning.');
end
num=header(1);
len=header(2);
if len~=128
    error('Keypoint descriptor length invalid (should be 128).');
end

% Creates the two output matrices (use known size for efficiency)
loc=double(zeros(num,4));
des=double(zeros(num,128));
for k=1:num
    [vector,cnt]=fscanf(g, '%f %f %f %f', [1 4]);
    if cnt~=4
        error('Invalid keypoint file format');
    end
    loc(k,:)=vector(1,:);
     [descrip, count] = fscanf(g, '%d', [1 len]);
    if (count ~= 128)
        error('Invalid keypoint file value.');
    end
    descrip = descrip / sqrt(sum(descrip.^2));
    des(k, :) = descrip(1, :);
end
fclose(g);
for k=1:size(des,1)
    des(k,:)=des(k,:)/sum(des(k,:));
end
delete tmp.key tmp.pgm

4.仿真结论

 

 

 5.参考文献

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

以上是关于车标识别基于SIFT算子的车标识别算法matlab仿真的主要内容,如果未能解决你的问题,请参考以下文章

你只认识大众汽车的车标怎么能行?赶紧用python采集所有车标学习一下

你只认识大众汽车的车标怎么能行?赶紧用python采集所有车标学习一下

手势识别基于matlab GUI SIFT+SVM算法手势识别含Matlab源码 1789期

交通标志识别基于matlab SIFT交通标志识别含Matlab源码 717期

交通标志识别基于SIFT特征实现交通标志识别matlab源码含GUI

基于改进的多算子融合的图像识别系统设计matlab优化算法十四