最近要用qt做一个车牌识别系统,灰度化和二值化图片还好说,但是怎么定位车牌的位置啊?用matlab?opencv?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最近要用qt做一个车牌识别系统,灰度化和二值化图片还好说,但是怎么定位车牌的位置啊?用matlab?opencv?相关的知识,希望对你有一定的参考价值。
车牌位置最简单的可以利用车牌固定的长宽比作为切入点进行定位,qt、opencv、和matlab都是工具,matlab和opencv都可以实现,里面都有大量函数可以供我们调用,编程也不算太困难。qt我不熟悉。 参考技术A 有智能算法,有非智能算法 参考技术B 这些跟qt没有半毛钱关系追问那如果直接用qt呢?这样会不会很难?怎么写啊
参考技术C 可以去找一些车牌识别的文章看看,这不是几句话就能说清楚的车牌识别基于matlab GUI模板匹配车牌识别门禁系统含Matlab源码 1091期
一、简介
基于matlab GUI车牌库识别:
该设计主要研究基于MATLAB软件的汽车号牌设别系统设计,系统主要包括图像采集、图像预处理、车牌定位、字符分割、字符识别五大核心部分。系统的图像预处理模块是将图像经过图像灰度化、图像增强、边缘提取、二值化等操作,转换成便于车牌定位的二值化图像;利用车牌的边缘、形状等特征,再结合Roberts 算子边缘检测、数字图像、形态学等技术对车牌进行定位;字符的分割采用的方法是将二值化后的车牌部分进行寻找连续有文字的块,若长度大于设定的阈值则切割,从而完成字符的分割;字符识别运用模板匹配算法完成。以上每个功能模块用MATLAB软件实现,最后识别出车牌,在研究设计的同时对其中出现的问题进行具体分析、处理,并寻求更优的方法。
二、源代码
function varargout = main(varargin)
% clc;clear;close all;
%% GUI初始化
% 开始初始化代码 - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @main_OpeningFcn, ...
'gui_OutputFcn', @main_OutputFcn, ...
'gui_LayoutFcn', [] , ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
% 结束初始化代码
pause(1);
% 执行之前主要是可见的。
function main_OpeningFcn(hObject, eventdata, handles, varargin)
set(handles.process,'enable','on')
% 此函数没有输出参数,见 OutputFcn.
% main的选择默认的命令行输出
handles.output = hObject;
% 更新handles 结构
guidata(hObject, handles);
backgroundImage =importdata('TIM图片20180108105930.jpg');
axes(handles.axes24);
image(backgroundImage);
axis off
% UIWAIT 等待用户响应 (see UIRESUME)
% uiwait(handles.figure1);
% --- 这个函数的输出返回到命令行。
function varargout = main_OutputFcn(hObject, eventdata, handles)
tic
% 获得缺省命令行输出的把手结构
varargout{1} = handles.output;
% --- 执行按钮在pushbutton1。
function pushbutton1_Callback(hObject, eventdata, handles)
[filename pathname]=uigetfile({'*.jpg';'*.bmp'}, 'File Selector'); %打开需要识别的车牌图片
I = imread([pathname '\\' filename]);
handles.I = I;
% 更新处理结构
guidata(hObject, handles);
axes(handles.axes1);
imshow(I);title('原始图片')
set(handles.process,'enable','on')
% --- 执行过程中按下按钮。
%% 开始车牌图像处理
function process_Callback(hObject, eventdata, handles)
I = handles.I;
I1=rgb2gray(I); %rgb2gray转换成灰度图,减小处理工作量,方便二值化处理
guidata(hObject, handles);
axes(handles.axes2);
imshow(I1);title('灰度图');
axes(handles.axes3);
imhist(I1);title('灰度图直方图'); %提取灰度图中的直方图信息
%继续
pause(2);
I2=edge(I1,'roberts',0.15,'both');
guidata(hObject, handles);
axes(handles.axes2);
imshow(I2);title('robert算子边缘检测'); %依据边缘上的像素一阶导数较大,二阶倒数在边缘检测出值为0来边缘检测,选用roberts算子,间距0.15,水平垂直两个方向
pause(2);
se=[1;1;1];
I3=imerode(I2,se);
guidata(hObject, handles);
axes(handles.axes3);
imshow(I3);title('腐蚀后图像'); %构建一个维度矩阵,进行图像腐蚀以实现图像增强
%继续
pause(2);
se=strel('rectangle',[10,25]);%生成一个矩阵
I4=imclose(I3,se);%闭运算
guidata(hObject, handles);
axes(handles.axes2);
imshow(I4);title('平滑图像的轮廓'); %构建10*25的长方形结构体图,通过闭运算平滑轮廓修补缝隙
%继续
pause(2);
I5=bwareaopen(I4,2000);%小于2000的对象都被删除 %移除不必要的小对象
guidata(hObject, handles);
axes(handles.axes2);
imshow(I5);title('从对象中移除小对象');
%继续
pause(2);
alg_flag=3;
alg_flag=get(handles.edit3,'string');
alg_flag=str2double(alg_flag);
if alg_flag==1
[PY2,PY1,PX2,PX1]=chepai_fenge(I5);%调用分割车牌 %对车牌矩阵中非零值进行搜索,根据阈值判定车牌在图片中的X、Y位置
elseif alg_flag==2
PY1=jytexingff(I5)-2;
PY2=texingy2(I5)+15;
PX1=texingx(I5);
PX2=texingx2(I5);
else
PY1=jyxiangsuPY1(I5)-2;
PY2=jyxiangsuPY2(I5)+15;
PX1=jyxiangsuPX1(I5);
PX2=jyxiangsuPX2(I5);
end
global threshold;
[PY2,PY1,PX2,PX1,threshold]=chepai_xiuzheng(PY2,PY1,PX2,PX1);%调用车牌校正 %根据车牌的位置面积大小进行车牌校正
IY=I(PY1:PY2,:,:);
Plate=I5(PY1:PY2,PX1:PX2);%使用caitu_tiqu %将车牌从图片中提取出来
global dw;
dw=Plate;
PX1=PX1-1;%对车牌区域的校正
PX2=PX2+1;
dw=I(PY1:PY2-8,PX1:PX2,:);
axes(handles.axes2);
imshow(dw),title('车牌区域的校正');
pause(2);
t=tic;
guidata(hObject, handles);
axes(handles.axes2);
imshow(IY),title('水平方向合理区域'); %将车牌在图片中的水平位置,前面已经将车牌提取,因此这里可以去掉
axes(handles.axes3);
imshow(dw),title('定位剪切后的彩色车牌图像');
pause(2);
imwrite(dw,'New number plate.jpg'); %保存定位剪切后的彩色车牌图像
% [filename,filepath]=uigetfile('New number plate.jpg','输入一个定位裁剪后的车牌图像');%打开定位剪切后的彩色车牌图像
% jpg=strcat(filepath,filename);
a=imread('New number plate.jpg');
b=rgb2gray(a); %对定位后的车牌灰度化
figure(3),subplot(3,2,1),imshow(b),title('车牌灰度图像');
g_max=double(max(max(b)));
g_min=double(min(min(b)));
T=round(g_max-(g_max-g_min)/2); %二值化灰度车牌
[m,n]=size(b);
d=(double(b)>=T); % d:二值图像
figure(3),subplot(3,2,2),imshow(d),title('车牌二值图像');
figure(3),subplot(3,2,3),imshow(d),title('均值滤波前');
pause(1);
h=fspecial('average',3); %均值滤波器
d=im2bw(round(filter2(h,d)));
figure(3),subplot(3,2,4),imshow(d),title('均值滤波后'); %均值滤波去噪,可以从前后图中看出去除了大部分噪声
se=eye(2); % eye(n) returns the n-by-n identity matrix 单位矩阵
%字符面积与车牌面积之比在(0.235,0.365)之间
[m,n]=size(d); %如果大于0.365则对图像进行腐蚀,如果小于0.235则对图像进行膨胀
if bwarea(d)/m/n>=0.365%计算面积
d=imerode(d,se);%imerode 实现图像腐蚀 d为待处理图像,se是结构元素对象
elseif bwarea(d)/m/n<=0.235
d=imdilate(d,se);%imdilate 图像膨胀
end
figure(3),subplot(3,2,5),imshow(d),title('膨胀或腐蚀处理后'); %根据车牌面积与总面积的比判定膨胀或腐蚀处理,腐蚀:消除小物体,膨胀:填充小空洞,车牌增强
pause(2);
% 寻找连续有文字的块,若长度大于某阈值,则认为该块有两个字符组成,需要分割
d=zifufenge(d);
[m,n]=size(d);
guidata(hObject, handles);
axes(handles.axes3);imshow(d);
k1=1;k2=1;s=sum(d);j=1;
while j~=n
while s(j)==0
j=j+1;
end
k1=j;
while s(j)~=0 && j<=n-1
j=j+1;
end
k2=j-1;
if k2-k1>=round(n/6.5) %一共7个字符,故这里取6.5
[val,num]=min(sum(d(:,[k1+5:k2-5]))); % 调整K1,K2的值,求和取最小值,确定最小区域
d(:,k1+num+5)=0 % 分割 % 将两个字符中间的干扰赋零,消除干扰,进行下一次分割
end
end
三、运行结果
四、备注
版本:2014a
以上是关于最近要用qt做一个车牌识别系统,灰度化和二值化图片还好说,但是怎么定位车牌的位置啊?用matlab?opencv?的主要内容,如果未能解决你的问题,请参考以下文章