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

该文介绍了一种车标识别系统,包括车牌定位和车标定位两部分。首先通过车牌定位估计车标区域,然后使用SOBEL边缘检测和形态学处理精确车标边界。接着,运用SIFT算子提取车标特征向量,并通过欧式距离匹配模板库进行识别。程序实现了对四种车型的匹配,并展示识别结果。
摘要由CSDN通过智能技术生成

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

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值