MATLB图像处理条形码识别
基于数字图像处理解决条形码识别
matlab2018a读取图像,检测识别图中条形码并翻译,显示其产品信息,结合excel信息库、查找指定产品。
主要功能
1、读取图片,并设定最优值进行二值化 2、检测图片中的条形码并分割出来 3、对条形码的条纹宽度测量并根据编码规则译码 4、译码校验 5、条码译文在excel库中比对产品信息 6、支持添加新类产品信息 7、支持查找指定产品信息 8、GUI界面人机交互
主要技术
1、sobel算子边缘探测 2、图像矫正算法 3、图像开运算、闭运算(腐蚀、膨胀、擦除) 4、译码规则模型化 5、结合excel 6、GUI界面操作
实际效果
产品信息库
GUI交互界面
源码小窥
%%%%%%探测矫正%%%%%%% 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 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 ii1 %起始条纹 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(2i)+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,包讲解。 另有实际演示视频可见
|