%***********************************************************************
clear;clc;close all;
%***********************************************************************
PosExaNum = 200;%最低要做1000个
NegExaNum = 500; %最低要做2000个
TotalExaNum = PosExaNum + NegExaNum;
SetImgSzY = 15;
SetImgSzX = 45;
AllExaFeatures = [];%所有样本的特征值矩阵
T = 100; % 100 可改变,由你选择几个特征决定
for i = 1:PosExaNum
I = double(rgb2gray(imread(strcat('F:\车牌图片\裁剪后的车牌\bmp\切割后的车牌bmp\im',strcat(num2str(i),'.bmp')))));
%im = double(rgb2gray(imread(strcat('LprTrain\im',strcat(num2str(i),'.bmp')))));
Im = imresize(I,[SetImgSzY SetImgSzX],'nearest'); %'nearest','bilinear','bicubic',可根据调试情况修改
%可以预处理增加对比度 ????????????????????????????????????????????????????????
%求取微分图像
[Iy,Ix] = diffImage(Im,SetImgSzY,SetImgSzX);
%求取积分图像
intg_imY = ImageToIntg(Iy,SetImgSzX,SetImgSzY);% to integ image
intg_imX = ImageToIntg(Ix,SetImgSzX,SetImgSzY);
%[intg_imY,intg_imX] = size(intg_im);
%tic
yFeatures = GetFeatures(intg_imY,SetImgSzY,SetImgSzX); % 应该在多增加几个类型
xFeatures = GetFeatures(intg_imX,SetImgSzY,SetImgSzX);
%toc
yAllExaFeatures = [AllExaFeatures ,[yFeatures.Value]'];
xAllExaFeatures = [AllExaFeatures ,[xFeatures.Value]'];
end
for i = 1:NegExaNum
I = double(rgb2gray(imread(strcat('F:\车牌图片\背景图片\bmp\im',strcat(num2str(i),'.bmp')))));
%im = double(rgb2gray(imread(strcat('LprTrain\im',strcat(num2str(i),'.bmp')))));
Im = imresize(I,[SetImgSzY SetImgSzX],'nearest'); %'nearest','bilinear','bicubic',可根据调试情况修改
%可以预处理增加对比度 ????????????????????????????????????????????????????????
%求取微分图像
[Iy,Ix] = diffImage(Im,SetImgSzY,SetImgSzX);
%求取积分图像
intg_imY = ImageToIntg(Iy,SetImgSzX,SetImgSzY);% to integ image
intg_imX = ImageToIntg(Ix,SetImgSzX,SetImgSzY);
%[intg_imY,intg_imX] = size(intg_im);
%tic
yFeatures = GetFeatures(intg_imY,SetImgSzY,SetImgSzX);
xFeatures = GetFeatures(intg_imX,SetImgSzY,SetImgSzX);
%toc
yAllExaFeatures = [AllExaFeatures ,[yFeatures.Value]'];
xAllExaFeatures = [AllExaFeatures ,[xFeatures.Value]'];
end
%%%%%%%%%%%%%%%%%%%%%针对Y方向的微分图像%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[Theta,BestFea,P,alfa,H] = adboost(yAllExaFeatures,yFeatures,T);
%获取强分类器,等待样本全了再调试
ResultH = alfa * H > 0.5 * sum(alfa);
TotalError = sum(ResultH ~= AllExaFeatures(end,i));
disp('the training is over, the total error is'),disp(TotalError);
%%%%%%%%%%%%%%%%%%%% 训练结束 %%%%%%%%%%%%%%%%%%%%%%%%%%%
% image figure No. 1
f1h = figure;
% set various properties and display images
set(f1h,'units','normalized');
set(f1h,'position',[0 0 0.5 1]);
set(f1h,'numbertitle','off');
titleName='adaboost algom. test and application';
set(f1h,'name',titleName);
t = 1 : 100 ;
plot(t,minError,'r+:');
title('adaboost train error test ','Fontsize',16);
xlabel('the altetive time');
ylabel('Errrors rate');
% legend('error on train file','error on test file');
grid on;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%调试时在找没用的变量
clear ResultH;
clear TotalError;
clear H;
%**********************************************************************
%以下为测试部分
%***********************************************************************
%选择一副图片
[filename pathname] = uigetfile({'*.jpg';'*.bmp';'*.gif'},'选择图片');
%路径名+全名
str = [pathname filename];
%读取图片
im = rgb2gray(imread(str));
imshow(im); hold on
[Y,X] = size(im);
%对图像进行预处理
%不同尺度,不同位置检测器
k = 1 ; %根据调试情况而定
DetectorScale.y = SetImgSzY;
DetectorScale.x = SetImgSzX;
while (DetectorScale.y < Y & DetectorScale.x < X)
SubImgStPos.y = 1;
while (SubImgStPos.y < Y - DetectorScale.y + 1) %行扫描
SubImgStPos.x = 1;
while (SubImgStPos.x < X - DetectorScale.x +1) %列扫描
%将该部分图像剪切掉
SubIm = imcrop(im,[SubImgStPos.x,SubImgStPos.y,DetectorScale.x-1,DetectorScale.y-1]);
%可以预处理增加对比度????????????????????????????????????????????????
[Iy,Ix] = diffImage(SubIm,SetImgSzY,SetImgSzX);
intg_im = ImageToIntg(Iy,DetectorScaleX,DetectorScaleY);% to integ image
for t = 1:T
yFeatures(t).Value = GetOneFeatureValue(BestFea(t).Type,BestFea(t).StPos,BestFea(t).Scale,intg_im);
h(t) = weakClassify(yFeatures(t).Value,Theta(t),P(t));
end
ResultH = alfa * h' > 0.5 * sum(alfa);
if ResultH == 1
msgbox('this is a Lpr image','image classify');
%把这个矩形标记起来
plot(SubImgStPos.x:(SubImgStPos.x+DetectorScale.x-1),SubImgStPos.y*ones(1,DetectorScale.x),'g');%画上行线
plot(SubImgStPos.x:(SubImgStPos.x+DetectorScale.x-1),(SubImgStPos.y+DetectorScale.y)*ones(1,DetectorScale.x),'g');
plot(SubImgStPos.x*ones(1,DetectorScale.y+1),SubImgStPos.y:(SubImgStPos.y+DetectorScale.y),'g');%画前列线
plot((SubImgStPos.x+DetectorScale.x)*ones(1,DetectorScale.y+1),SubImgStPos.y:(SubImgStPos.y+DetectorScale.y),'g');
imwrite(SubIm,'lp.jpg');
elseif ResultH == 0
msgbox('this is a BackGard image','image classify');
end
SubImgStPos.x = SubImgStPos.x + k * DetectorScale.x;% k 根据调试情况而定
end
SubImgStPos.y = SubImgStPos.y + k * DetectorScale.y;
end
DetectorScale.x = 1.25 * DetectorScale.x; %1.25 根据调试情况而定
DetectorScale.y = 1.25 * DetectorScale.y;
end
%%%%%%%%%%%%%%%%%%Y方向的微分图像检测结束%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%针对X方向的微分图像%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%X方向的微分图像检测结束%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%以下求两个被圈矩形的交集%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%定位出车牌%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%