【图像识别】基于matlab条形码识别系统【含Matlab源码 096期】

一、源代码

clc;clear;close all;
ImageSrc=BinaryImage(imread('..\Pic\3.bmp'));
ImageSrc=BinaryImage(imread('..\Pic\Demo12.bmp'));
ImageSrc=BinaryImage(imread('..\Pic\Demo1211.bmp'));
ImageSrc=BinaryImage(imread('..\Pic\李梦1.bmp'));
ImageSrc=BinaryImage(imread('..\Pic\未1命名.bmp'));
ImageSrc=BinaryImage(imread('..\Pic\新978.bmp'));
 
[ImageHeight,ImageWidth]=size(ImageSrc);
ImageArray=ones(size(ImageSrc));
ImageArray(find(ImageSrc>=160))=0;
subplot(211);imshow(flipud(ImageSrc));
subplot(212);imshow(flipud(ImageArray),[]);
arPixelH=sum(ImageArray,1);
arPixelV=sum(ImageArray,2);%左右方向投影
 
tempMax = max(arPixelV);
arMark=zeros(size(ImageArray,1));
 
arDifference=arPixelV(2:end)-arPixelV(1:end-1);
 
% 如果该行像素足够多且变化不大,标记为true
% 相当于与的关系abs(arDifference)<20 && (arPixelV[i]>(0.75*tempMax)
arMark(find(abs(arDifference)<20))=1;
arMark(find(arPixelV<=0.75*tempMax))=0;
 
% 确定包含条码的行
iLengthThrehold=40;
for i=1:ImageHeight-iLengthThrehold+1
    iCount=length(find (arMark(i:i+iLengthThrehold-1)==1 )   );
    if(iCount >= 37)	
		ImageTop = i+10;	%确定顶部
        break;
    end
end
 
for i=ImageHeight:-1:iLengthThrehold
    iCount=length(find (arMark(i:-1:i-iLengthThrehold+1)==1 )   );
    if(iCount >= 37)	
        ImageBottom = i-10;	%确定顶部
        break;
    end
end
 
arLeftEdge=zeros(ImageHeight,1);
arLeftEdge1=arLeftEdge;
arDelta=arLeftEdge;
 
% 寻找左边缘,为了保证鲁棒性,在已经确定的上下边界内全局搜索
for i=ImageTop:ImageBottom
    for j=21:ImageWidth
        if( (ImageArray(i,j-1)==0) && (ImageArray(i,j)==1) )		
            arLeftEdge(i) = j;
				break;
        end
    end
end
[tempMax,iMax]=max(arLeftEdge);
 
% 倾斜度不能大于1/10
iCount = 0;
for i=ImageTop:ImageBottom
    if( abs(tempMax-arLeftEdge(i)) < abs(i-iMax)/6+1 )
		iCount=iCount+1;
    end
end
if( (iCount/(ImageBottom-ImageTop))<0.6 )
		display('failure1!');
        return;
end
 
for n=0:28
    for i=ImageTop:ImageBottom
        for j=arLeftEdge(i)+1:ImageWidth
            if( (ImageArray(i,j-1)==1) && (ImageArray(i,j)==0) )			
                arLeftEdge1(i) = j;		break;
            end
        end
        arDelta(i) = arLeftEdge1(i) - arLeftEdge(i);
    end    
    tempArray=arDelta;
    
    %排序
    for i=ImageTop:ImageBottom-1
        for j=ImageBottom:-1:i+1
            if(tempArray(j)< tempArray(j-1))
                tempSwap = tempArray(j);
                tempArray(j)= tempArray(j-1);
                tempArray(j-1) = tempSwap;
            end
        end
    end
    t0=floor(ImageTop+(ImageBottom-ImageTop)/2);
    t1=t0+2;
    t2=t0-2;
    if(tempArray(t1)-tempArray(t2)>1) display('failure1!');  return;
    else			arWidth(2*n+1) = tempArray(t0);
    end
    
    %调整下一列边缘    
    for i=ImageTop:ImageBottom	
        if(abs(arDelta(i) - arWidth(2*n+1))>2)
				arLeftEdge1(i) = arLeftEdge(i) + arWidth(2*n+1);
        end
        arLeftEdge(i)= arLeftEdge1(i);
    end
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % 搜索空的右边缘
    for i=ImageTop:ImageBottom
        for j = arLeftEdge(i)+1:ImageWidth
            if  (ImageArray(i,j-1)==0) && (ImageArray(i,j)==1) 
                arLeftEdge1(i) = j;
                break;
            end
        end
        arDelta(i) = arLeftEdge1(i) - arLeftEdge(i);
    end
    tempArray = arDelta;
    for i=ImageTop:ImageBottom-1
        for j=ImageBottom:-1:i+1
            if(tempArray(j)< tempArray(j-1))
                tempSwap = tempArray(j);
                tempArray(j)= tempArray(j-1);
                tempArray(j-1) = tempSwap;
            end
        end
    end
    t0=floor(ImageTop+(ImageBottom-ImageTop)/2);
    t1=t0+2;
    t2=t0-2;
    if(tempArray(t1)-tempArray(t2)>1) display('failure1!');  return;
    else			arWidth(2*n+2) = tempArray(t0);
    end
    
    %调整下一列边缘
    for i=ImageTop:ImageBottom	
        if(abs(arDelta(i) - arWidth(2*n+2))>2)
				arLeftEdge1(i) = arLeftEdge(i) + arWidth(2*n+2);
        end
        arLeftEdge(i)= arLeftEdge1(i);
    end;
    
end
 
%%  搜索最后一个条的右边缘
for i=ImageTop:ImageBottom
    for j = arLeftEdge(i)+1:ImageWidth
        if  (ImageArray(i,j-1)==1) && (ImageArray(i,j)==0) 
            arLeftEdge1(i) = j;
            break;
        end
    end
    arDelta(i) = arLeftEdge1(i) - arLeftEdge(i);
end
tempArray=arDelta;    
%排序
for i=ImageTop:ImageBottom-1
    for j=ImageBottom:-1:i+1
        if(tempArray(j)< tempArray(j-1))
            tempSwap = tempArray(j);
            tempArray(j)= tempArray(j-1);
            tempArray(j-1) = tempSwap;
        end
    end
end
t0=floor(ImageTop+(ImageBottom-ImageTop)/2);
t1=t0+2;
t2=t0-2;
n=29;
if(tempArray(t1)-tempArray(t2)>1) display('failure1!');  return;
else			arWidth(2*n+1) = tempArray(t0);
end
 
% %调整下一列边缘    此段程序不需要
% for i=ImageTop:ImageBottom	
%     if(abs(arDelta(i) - arWidth(2*n+1))>2)
%             arLeftEdge1(i) = arLeftEdge(i) + arWidth(2*n+1);
%     end
%     arLeftEdge(i)= arLeftEdge1(i);
% end
barnumber=[9,BarRecognize(arWidth)];
if( checkcode(barnumber)==1)
    display(['二维码识别结果:',num2str(barnumber)]);
else display('识别错误!');
end
 
 

二、运行结果

【图像识别】基于matlab条形码识别系统【含Matlab源码 096期】_第1张图片

三、备注

完整代码或者代写添加QQ2449341593
往期回顾>>>>>>
【图像识别】基于matlab路面裂缝识别含GUI【含Matlab源码 009期】
【图像识别】基于matlab身份证号码识别【含Matlab源码 014期】
【图像压缩】基于matlab图像处理教程系列之图像压缩【含Matlab源码 024期】
【图像分割】基于matlab图像处理教程系列之图像分割(一)【含Matlab源码 025期】
【图像分割】基于matlab图像处理教程系列之图像分割(二)【含Matlab源码 026期】
【模式识别】基于matlab指纹识别【含Matlab源码 029期】
【模式识别】基于matlab银行卡号识别【含Matlab源码 030期】
【图像聚类】基于matlab FCM和改进的FCM脑部CT图像聚类【含Matlab源码 074期】
【图像评价】基于matlab CCF算法的图像质量评价【含Matlab源码 075期】
【图像增强】基于matlab局部对比度增强的CLAHE算法之直方图增强【含Matlab源码 076期】
【图像融合】基于matlab Frequency Partition之图像融合【含Matlab源码 077期】
【图像评价】基于matlab SVM之图像无参考质量评价【含Matlab源码 078期】
【图像处理】基于matlab DWT+DCT+PBFO改进图像水印隐藏提取含GUI【含Matlab源码 081期】
【图像变换】基于matalb DIBR-3D图像变换【含Matalb源码 082期】
【图像融合】基于matlab CBF算法的图像融合【含Matlab源码 083期】
【图像分割】基于matlab模糊聚类算法FCM的图像分割【含Matlab源码 084期】
【图像分割】基于形态学重建和过滤改进FCM算法(FRFCM)的的图像分割【Matlab 085期】
【图像去噪】基于matlab自适应形态学的图像去噪【含Matlab源码 086期】
【图像增强】基于matlab DEHAZENET和HWD的水下去散射图像增强【含Matlab 087期】
【图像增强】基于matlab PSO寻优ACE的图像增强【含Matlab源码 088期】
【图像增强】基于matlab区域相似变换函数和蜻蜓算法之灰度图像增强【含Matlab源码 089期】
【图像重建】基于matlab图像重建之ASTRA算法【含Matlab源码 090期】
【图像分割】基于matlab四叉树图像分割【含Matlab源码 091期】
【图像分割】基于matlab心脏中心线提取【含Matlab源码 092期】
【图像识别】基于matlab svm植物叶子疾病检测和分类【含Matlab源码 093期】
【图像识别】基于matlab模板匹配之手写数字识别系统GUI界面【含Matlab源码 094期】
【图像识别】基于matlab不变矩的数字验证码识别含GUI界面【含Matlab源码 095期】

你可能感兴趣的:(matlab,图像处理)