资源简介

基于MATLAB的一维码识别系统,对损坏的条码图像时执行光电软仿真,识别率很高。

资源截图

代码片段和文件信息

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%               中国矿业大学信息与电气工程学院                 %
%                       王灿                                  %
%                                                    %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clc;
clear all;
close all;
%启动定时器,测试软件性能
[filenamefilepath]=uigetfile(‘*.jpg‘‘打开文件‘);%gui中打开文件
filep=strcat(filepathfilename);
%filep
Image=imread(filep);
tic;
%读取图像并二值化
% Image = imread(‘0081.jpg‘);
level = graythresh(Image);  %获取图像二值化的阈值
bw = im2bw(Imagelevel);    %二值化处理
imshow(bw);
t = 1;
p = 1;
[m n] = size(bw);
%初步计数黑白条的书目
q = round(m/2);
    for i=q
        for j=1:n-1
            if bw(ij)==0&&bw(ij+1)==1%颜色变化由黑色变成白色,黑条
                x(t) = j;
                 t = t+1;
            end
       
        end
    end

for i=q
    for j=1:n-1
        if bw(ij)==1&&bw(ij+1)==0 %颜色变化由白色变成黑色,白条
            y(p) = j;
             p = p+1;
        end
       
    end
end
pin = 0;
 while length(x)~=30||length(y)~=30
     %%等待提示信息
        if pin ==0
        display(‘正在扫码,请对准而条形码............‘);
        end
        pin = pin+1;
     %条形码有损坏是逐行扫描
       for pp=q:round(5*m/6)
           t=1;
           p=1;
            if length(x)==30&&length(y)==30 %通过判断黑白条数测试当前行有无算坏
                break;
            end
                for i=pp
                    for j=1:n-1
                        if bw(ij)==0&&bw(ij+1)==1
                            x(t) = j;
                            t = t+1;
                        end
                    end
                end
                for i=pp
                    for j=1:n-1
                        if bw(ij)==1&&bw(ij+1)==0
                            y(p) = j;
                            p = p+1;
                        end
       
                    end
                end
       end
 end 
 if length(x)~=30||length(y)~=30
     display(‘扫码错误!‘);
     return;
 end
 if i~=round(m/2)
     display(‘该条形码已受损,但仍然可以正常扫描‘);
 end
%计算每个条—空的宽度,利用所记录在xy数组中的坐标值,对应相减
 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
        d(2*ii) = y(ii+1)-x(ii); %分别计算第2~29个空的宽度
        d(2*ii-1)=x(ii)-y(ii);   %分别计算第2~29个条的宽度
     elseif ii==30
         d(ii*2-1)=x(ii)-y(ii);   %总共有59个条-空,单独计算第三十个条的宽度
         end
     end    
end

j  = 3;
for i=1:6               
    r(i)=(d(j+1)+d(j+2)+d(j+3)+d(j+4))/7;       %计算左边六个字的基准码的宽度
end
j=32;
for i=7:12
    r(i)=(d(j+1)+d(j+2)+d(j+3)+d(j+4))/7;       %计算右边五个字的基准码的宽度
end
n=0;%四字计数
i=1;
j1=1;
j=4;%跳过起始符,从左边第一个开始读码
flag0=0;%作为标识符,将样条交替翻译成1或者0
while j<=56
    if n==4
        n=0;
        i=i+1;
    end
    if d(j)<0.5*r(i)%小于0.5舍去
        return;
    elseif d(j)<1.5*r(i)&&d(j)>0.5*r(i)%0.5~1.5记为1个值
        if flag0==0
            bs(j1)={‘0‘};%对于的被译码
        else
             b

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        6746  2015-07-03 14:58  matlab\dimesion_code\one_dimensional_code.m
     目录           0  2015-06-29 12:41  matlab\
     目录           0  2015-06-29 12:41  matlab\dimesion_code\
     文件       74030  2015-01-07 10:03  matlab\dimesion_code\001.jpg
     文件       29880  2015-06-19 15:56  matlab\dimesion_code\002.jpg
     文件       30880  2015-06-19 15:55  matlab\dimesion_code\003.jpg
     文件       29266  2015-06-19 15:56  matlab\dimesion_code\004.jpg
     文件       29772  2015-06-19 15:57  matlab\dimesion_code\005.jpg
     文件       32289  2015-06-19 15:57  matlab\dimesion_code\006.jpg
     文件       32218  2015-06-19 15:57  matlab\dimesion_code\007.jpg
     文件       31456  2015-06-19 15:58  matlab\dimesion_code\008.jpg
     文件       83578  2015-06-22 21:46  matlab\dimesion_code\0081.jpg

评论

共有 条评论