小言_互联网的博客

电脑摄像头一维条形码matlab识别

617人阅读  评论(0)

一维条形码现在广泛用于超市、图书馆、学校等,几乎在生活的各个领域和行业都直接或间接的用到了一维条形码(本文是指EAN13)。对一维条形码的识别就成为了必要,现在超市及其他场所大部分都是利用光电识读器,利用条形码样条不同的反光率来识别,采用线性扫描,只能读取条形码局部信息,以致识别容易受条形码上的灰尘、水汽或样条断裂影响,造成识别率降低。
本文介绍一种利用图像处理的方法来识别一维条形码,为了读取的方便,本文的图像直接是从电脑摄像头中采集的,省去了储存图像后再读取图像的过程,使识别更加快速。
MATLAB程序包括两部分,一、调用函数,包括图像的预处理和数据的识别;二、主程序。

1、调用函数
获取主程序传递的图像数据,然后对图像预处理,预处理包括灰度处理和几何校正,其中的灰度处理的过程是:灰度化——>中值滤波——>二值化。灰度化用到的函数是rgb2gray();中值滤波函数medfilt2();二值化函数im2bw(),处理过程中图像如fig 1-1。

fig 1-1
fig 1-1中的第一幅图(从左到右)是原图、第二幅图是灰度化后的图、第三幅图是中值滤波后的图、第四幅图是二值化后的图。
从fig 1-1中明显能看出图像中的条形码不是正摆的,需要进行几何校正。几何校正的过程:设置采样点(程序设了五个)——>采集条形码的黑色条码坐标——>通过采样点的坐标差异来决定几何校正的角度。几何校正函数imrotate()。处理后的图如fig 1-2。

fig 1-2
但有时候考虑到计算速度问题,几何校正可以被省去,因为本文是利用电脑摄像头来采集图像的,可以通过观察视频来人工摆正。
当图像预处理完成后,则进行图像条形码的识别阶段。处理过程主要是利用五个采样点采集的数据。五个采样点都要图像采集一遍,按行采集。采集完后,程序将提取样条数据,在每一次提取中程序都会去掉五个采集点中最小数据和最大数据,然后对剩下的三个的数据进行后期处理。程序先判断采集点是否采集到59个样条(一维条形码除去左、右侧空白区,共有95个模块,本文涉及的59样条是指黑白样条个数,而一维条形码中的95个模块是指每个黑白条占得标准模块个数相加的和),是59则继续读数据处理,不是则调用函数退回等待主程序再次传递图像。当为59个样条时,就对提取获得的数据求平均值,然后储存到一个矩阵中。获得的数据平均值显示如fig 1-3。

fig 1-3
fig 1-3 上图值为1的是条形码中黑色样条含有像素个数,值为0的是条形码中白色样条含有像素个数。下图是把上图读取的黑白样条像素个数的一维图像显示。
最后根据一维条形码的编码规则编写出解码算法。把获得的矩阵带入解码算法中,通过对比校准,最终得到人能识别的阿拉伯数字码。
由于篇幅限制这里就不把程序代码写入。

2、主程序
获取电脑摄像头的视频数据,连续采集视频图像数据,把图像数据传递给调用函数,最后把识别的阿拉伯数字码显示到MATLAB显示区上。主程序的代码较短,代码如下:

%读取电脑摄像头视频
info=imaqhwinfo;
win_info=imaqhwinfo(char(info.InstalledAdaptors(2)));
dev_win_info=win_info.DeviceInfo;
obj = videoinput(char(info.InstalledAdaptors(2)),dev_win_info.DeviceID,char(dev_win_info.SupportedFormats(5)));
preview(obj);%显示视频,视频的分辨率是640x480,如果比这个分辨率小就可能读不出识别码
%传递图像给调用函数
start(obj);
a=getsnapshot (obj);%获取视频中的图像信息
flag1=‘y’;
while flag1==‘y’||flag1==‘Y’
flag=0;
while flag==0
a=ycbcr2rgb(getsnapshot (obj));%把ycbcr格式图像信息转换为rgb格式图像
flushdata(obj);%刷新obj中的数据
flag=ginny(a);
drawnow;%刷新事件
end;
flag1=input('Do you want agian? Y/N : ', ‘s’);
end
delete(obj);

3、结果与总结
识别的结果如fig 1-4,图为MATLAB GUI 界面。


转载:https://blog.csdn.net/RONNIE_Zz/article/details/117552000
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场