MATLAB图像处理识别商品条形码、图像分割

MATLB图像处理条形码识别

基于数字图像处理解决条形码识别

matlab2018a读取图像,检测识别图中条形码并翻译,显示其产品信息,结合excel信息库、查找指定产品。

主要功能

手机拍照识别
1、读取图片,并设定最优值进行二值化
2、探测图片条形码位置并矫正
2、检测图片中的条形码并分割出来
3、对条形码的条纹宽度测量并根据编码规则译码
4、译码校验、信息提示
5、条码译文在excel库中比对产品信息
6、支持添加新类产品信息
7、支持查找指定产品信息
8、GUI界面人机交互

主要技术

1、canny算子边缘探测
2、基于hougf变化的图像矫正算法
3、图像开运算、闭运算(腐蚀、膨胀、擦除、取反)
4、条形码边缘检测技术和图像分割
5、EAN-13码的译码规则设计
6、结合excel做数据库,存储产品信息并显示和提示
7、GUI界面操作

实际效果

                               产品信息库

MATLAB图像处理识别商品条形码、图像分割_第1张图片
[形态学处理]
MATLAB图像处理识别商品条形码、图像分割_第2张图片
探测边界,分割条形码
MATLAB图像处理识别商品条形码、图像分割_第3张图片

                                              GUI交互界面

MATLAB图像处理识别商品条形码、图像分割_第4张图片

源码小窥

%%%%%%探测矫正%%%%%%%
bw = edge(double(handles.erzhi),‘sobel’,‘horizontal’); %用sobel算子检测水平方向检测边缘
[m,n]=size(bw);
S=round(sqrt(m^2 + n^2));%S可以去到的最大值
ma = 180;
md = S;
r=zeros(md,ma);
c=0;
for i=1:m
for j=1:n
if bw(i,j)==1
for k=1:ma
ru=round(abs(icos(k3.14/180) + jsin(k3.14/180)));
r(ru+1,k)=r(ru+1,k)+1;
end
end
end
end
if c<=90
rot=-c;
else
rot=90-c;
end
i3=edge(handles.erzhi,‘canny’); %canny算子边缘检测
%figure(1);imshow(i3);title(“边缘检测”);
[H, theta, rho]= hough(i3,‘RhoResolution’, 0.5); %%霍夫变化
lines=houghlines(i3,theta,rho,peak); %%霍夫反变化
sum=0;
if length(lines)
for k=1:length(lines)
pic=imrotate(handles.erzhi,rot,‘crop’);
handles.jiaozheng=pic;
guidata(hObject, handles);
axes(handles.axes4)
imshow(handles.jiaozheng)
set(handles.edit6,‘string’,‘矫正完毕’);
%%%%%%%形态学运算处理分割%%%%%%%%%%
se = strel(‘rectangle’,[80 100]);%设置结构元素对象
I2= imdilate(I2,se); %4.膨胀
figure(9),imshow(I2),title(‘3’);
[m,n]=size(I2);
I5=I2;
%列边缘探测%
t=1;
for i=round(0.3*m):5:m-10
for j=1:n-2
if I5(i,j)==0&&I5(i,j+1)==1 %如果探测到左边矩形位置
H0(t)=j;temp=j;
for j=temp:n-2
if I5(i,j)==1&&I5(i,j+1)==0 %如果探测到右边矩形位置
H1(t)=j;t=t+1;
break;
end
end
end
end
end
for i=1:2
M(i)=mode(H0); %取H0中众数
N(i)=mode(H1); %取H0中众数

%%%%%%%%%处理条纹,除去干扰%%%%%%%%%%%%%
[m n] = size(bw); %获取横纵尺寸
%%%%去除图干扰生成记录条纹间隔信息的levl中%%%%%%
for i=1:n
sum=0;
for j=1:m %每列相加求和
sum=sum+bw(j,i);
end
if sum>round(m/2) %去除半数干扰
levl(i)=1;
else levl(i)=0;
end
end

for i=1:n-1
if levl(i)==0&&levl(i+1)==1
x(t)=i;
t=t+1;
end
if levl(i)==1&&levl(i+1)0
y§=i;
p=p+1;
end
end
%%%%%%%计算条纹宽度结果保存在d中%%%%%%%%%%
for ii=1:30
if ii
1 %起始条纹
d(ii)=x(ii)-y(ii); %计算第一个条的宽度
d(ii+1)=y(ii+1)-x(ii); %计算第一个空的宽度
end
if ii>1 %第二个条纹开始
if ii>1&&ii<30

%%%%%%%%%计算基准宽度%%%%%%%%%%%%%
add=0;
j = 3;
for i=1:6
r(i)= (d(j+1)+d(j+2)+d(j+3)+d(j+4)+add)/7.0; %计算左边六个字的基准码的宽度
end

%%%%%%%%结果检验%%%%%%%%%%%
%%%%%%%%若校验失败则显示异常%%%%%%%%%%%
sum1=0;
sum2=6;
for i=1:6
sum1=result(2i-1)+sum1;
sum2=result(2
i)+sum2;
end
sum1=sum1*3;sum2=sum2-result(12);
if result(12)==10-rem((sum1+sum2),10)
set(handles.edit1,‘string’,num2str(result));
set(handles.edit6,‘string’,‘识别完毕’);

else
set(handles.edit6,‘string’,‘识别异常’);
end
%%%%%%%查询excel信息库%%%%%%%%%%%%
[m1,m2]=xlsread(‘libary’);%%读取excle数据
for ii=1:find(m1(:1),1,‘last’)
if m1(ii)==handles.shibie
disp1=m2(ii,1);
disp2=m2(ii,2);
end
end
set(handles.edit3,‘string’,disp1);
set(handles.edit2,‘string’,disp2);
set(handles.edit6,‘string’,‘显示完毕’);

特点

1、支持自定义GUI 处理
2、取样方便,手机拍照即可(老年机拍照请靠后)
3、源码自创,不懂可讲。
4、结构简单、注释详细容易理解
5、matlab功能强大,处理速度快秒出结果(第一次创建环境会稍慢)。

最后

上面展示代码不过冰上一角,也请大佬们多多探讨。
更多详细内容请加微信:w15136355113(注明来意)。
报价100RMB,包讲解。
另有实际演示视频可见

你可能感兴趣的:(MATLAB,形态学图像处理,条形码识别,图像处理,算法,计算机视觉)