基于VC的一维条形码识别Word格式文档下载.docx
- 文档编号:19828675
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:13
- 大小:137.78KB
基于VC的一维条形码识别Word格式文档下载.docx
《基于VC的一维条形码识别Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于VC的一维条形码识别Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。
1.3.2研究内容6
2一维条形码技术6
2.1一维条形码简介6
2.2EAN-13码简述7
2.2.1EAN-13码的构造7
2.2.2EAN-13码的编码规则8
2.2.3EAN-13编码的校验方法10
3一维条形码的识别10
3.1图像的预处理10
3.1.1图像的二值化处理10
3.1.2条码图像的提取12
3.2条码图像的字符识别12
4结论13
参考文献1
1绪论
1.1条码技术概述
条码技术是在计算机的应用实践中产生和发展起来的一种自动识别技术,条码应用技术就是应用条码系统进行的信息处理技术。
条码技术的研究始于20世纪中期,是继计算机技术应用和发展应运而生的。
随着70年代微处理器的问世,标志着“信息化社会”的到来,它要求人们对社会上各个领域的信息、数据实施正确、有效、及时的采集、传递和管理。
因此如何代替人的视觉、人的手工操作、或者在复杂的环境中正确、迅速地获取信息并加以识别,成为人们普遍关心和有关人员精心研究的课题。
通俗的说条形码是指在浅色衬底上印有深色矩形的线条(也称条码)排列而成的编码,其码条和空白条的数量和宽度按一定的规则(标准)排列。
条形码是由一组规则排列的条、空、相应的数字组成。
这种用条、空组成的数据编码可以供机器识读,而且很容易译成二进制数和十进制数。
这些条和空可以有各种不同的组合方法,构成不同的图形符号,即各种符号体系,适用于不同的应用场合。
条码系统是由条码符号设计、制作及扫描阅读组成的自动识别系统。
微电子技术和激光技术的发展使得条码识别系统越来越受到人们的关注。
条码是迄今为止最经济、实用的一种自动识别技术。
条码技术具有以下几个方面的优点:
●可靠准确。
●数据输入速度快。
●经济便宜。
●灵活、实用。
●自由度大。
●设备简单。
●易于制作,可印刷,称作为“可印刷的计算机语言”。
正因为条码具有上述迅速,准确,廉价,使用方便,适应性强等优点,克服了其他输入方法的不足,所以他在各个行业中的发展可谓突飞猛进,最初应用于物流管理,最引人注目的是pos系统,它使商店的定货管理,盘点,库存管理,库存查询,验货管理,收款等各项工作效率得到极大地提高。
目前已经应用到计算机自动化的各个领域,包括质量跟踪,仓储管理,物资管理,票证管理,人流物流管理,图书文献检索,医疗卫生,邮电系统,安全检查等领域。
1.2VisualC++数字图像处理基础
BMP文件是Windows操作系统所推荐和支持的图像文件格式,是一种将内存或显示器的图像数据不经过压缩而直接按位存盘的文件格式,所以称为位图(bitmap)文件,因其文件扩展名位BMP,故称为BMP文件格式,简称BMP文件。
BMP位图文件由四个部分组成:
位图头文件(Bitmap-fileHeader)、位图信息头(Bitmap-information-Header)、调色板(Palette)和像素数据(ImageData)。
●位图头文件:
包含文件类型、文件大小和存放信息等信息,结构如下:
typedefstructtagBITMAPFILEHEADER{
WORDbfType;
//类型名,必须是0x424D,即字符串“BM”,
DWORDbfSize;
//文件大小
WORDbfReserved1;
//保留字,不考虑
WORDbfReserved2;
//保留字,同上
DWORDbfOffBits;
//实际位图数据的偏移字节数,即前三个部分长度之和}BITMAPFILEHEADER;
●位图信息头:
包含位图大小、压缩类型和颜色格式等信息,结构如下:
typedef
struct
tagBITMAPINFOHEADER
{
DWORD
biSize;
//指定此结构体的长度,为40
LONG
biWidth;
//位图宽
biHeight;
//位图高
WORD
biPlanes;
//平面数,为1
biBitCount
//采用颜色位数,可以是1,4,8,24
biCompression;
//压缩方式,0为不压缩DWORD
biSizeImage;
//实际位图数据占用的字节数LONG
biXPelsPerMeter;
//X方向分辨率
biYPelsPerMeter;
//Y方向分辨率
biClrUsed;
//使用的颜色数
biClrImportant;
//重要颜色数,如果为0,则表示所有颜色都是重要的
}
BITMAPINFOHEADER;
●调色板:
VisualC++中,调色板实际上定义为一个数组,共有biClrUsed个元素,每个元素类型是一个RGBQUAD结构,其定义如下:
tagRGBQUAD
BYTE
rgbBlue;
//该颜色的蓝色分量
rgbGreen;
//该颜色的绿色分量
rgbRed;
//该颜色的红色分量
rgbReserved;
//保留值
RGBQUAD;
●像素数据:
紧跟在调色板之后的是图像数据字节阵列,用BYTE数据结构存储。
图像的每一扫描行由表示图像的连续像素字节组成,每一行的字节数取决于图像图像的颜色数和用像素表示的图像宽度。
扫描行是由底向上存储的,这就是说,数据存放是从下到上,从左到右。
从文件中最先读到的图像数据是位图最下面的左边的第一个像素,然后是左边第二个像素,而最后读到的图像数据是位图最上面一行的最右边的一个像素。
1.3文本研究意义及内容
1.3.1研究意义
条形码技术主要研究如何用条码标识信息、并将条形码表示的信息转换成计算机可识读的语言,以实现自动输入、自动识读、自动统计.在先进的工业国家里,条码技术作为一种信息处理技术己成为社会化产物,不仅应用于生产过程,而且也应用于管理过程。
在我国条码技术起步比较晚,但它的发展非常迅速,己被广泛用于工业、商业、图书出版、医疗卫生等各行各业。
随着全球经济贸易体系的形成,将被更广泛用于其它领域。
现在,它已变成商品进入国际市场的通行证。
图像处理识读方法是首先对条码图像进行处理,然后利用统计方法,根据相似边距离来判别条码字符,再通过译码、校验、纠错处理来识读条码,这样将大大降低条码印刷质量以及条码污染等各种因素的干扰,从而有效地提高条码的识读率。
1.3.2研究内容
本文所研究的是基于图像处理方式的条码的识别工作,具体工作如下:
●在VisualC++MFC框架下,利用工具ClassWizard添加图像处理类实现位图文件的读取及打开;
●对一维条形码图像的预处理(二值化)编程;
●利用一维条形码的纹理特点和规则,对其进行特征提取和识别的算法研究与实现。
2一维条形码技术
2.1一维条形码简介
条码由一组规则排列的条,空及相应的字符组成。
条码的信息靠条和空的不同宽度不同位置来传递的,信息量的大小事由条码的宽度和印刷的精度来决定的,条码越宽,包容的条和空越多,传递的信息量也越大,条码印刷的精度越高单位长度内可以容纳的条空也越多,传递的信息量也越大。
常见的条形码是由反射率相差很大的黑条和白条排成平行线图案。
条形码可以标出物品的生产国、制造厂家、商品名称、生产日期、图书分类号、类别等许多信息。
一般情况下,条码组成结构如下:
●起始边界和终止边界:
均为“静态区”,是没有字元、条纹的空白区。
●开始读取信号:
放在条码数据信号的第一个字元之前,是一个空白团的特殊条码,用来辨别条码数据符号的开始信号。
●数据信号:
数据信息的来源。
●终止字元符号:
也是一种特殊条纹与空白图案,告知解码器该数据已经输送完毕。
●检查和字元:
位于数据信息码之后,终止符号之前,检查解码后的结果正确与否。
2.2EAN-13码简述
2.2.1EAN-13码的构造
EuropeanArticleNumber(EAN)是欧洲物品编码的缩写,其中,共计13位代码的EAN-13是比较通用的一般终端产品的条形码协议和标准,主要应用于超级市场和其他零售业,一次这种是日常比较常见的。
代码前3位是国家代码,中间4位是生产商代码,后5位是产品代码,最后一位是自动生成的校验码。
EAN-13商品条码由左侧空白区、起始符、左侧数据符、中间分隔符、右侧数据符、校验符、终止符、右侧空白区及供人识别字符组成,共有113个模块,如图2.1所示:
图2.1EAN-条码符号结构
1)左侧空白区:
位于条码符号起始符左侧,无印刷符号且与空的颜色相同的区域。
其最小宽度为11个模块宽。
2)起始符:
位于条码符号左侧,表示信息开始的特殊符号,由3个模块组成。
3)左侧数据符:
介于起始符和中间分隔符之间的表示信息的一组条码字符。
表示前缀码(不包含前置码)和厂商代码,共6位数字。
由42个模块组成。
4)中间分隔符:
位于条码符号的中间位置,是平分条码符号的特殊符号,由5个模块组成。
5)右侧数据符:
中间分隔符右侧的一组选自C子集的条码字符,表示5位商品代码,又35个模块组成。
6)校验符:
最后一个条码字符,选自C子集,由7个模块组成,表示一个校验字符。
7)终止符:
位于条码符号右侧,表示信息结束的特殊符号,由3个模块组成。
8)右侧空白区:
在终止符之外的无印刷符号且与空的颜色相同的区域,其最小宽度为7个模块。
2.2.2EAN-13码的编码规则
表2.2说明了EAN-13条码中的每个数位应该如何编码,这要取决于这个数位位于条码的哪半边(左边还是右边)。
在这种情况下,一个左手边数位的编码(奇数性还是偶数性)将取决于数制码的第一个数位的值(见下表中奇偶性编码)。
表2.2EAN字符集编码表
观察发现:
●一个EAN-13字符使用7个元素来描述,包含2个条和2个空间。
任何条或空间的长度都不会超过4个元素。
●条码左手边的所有字符总是以0(空间)开始的,而条码右手边的所有字符都是以1(条)开始的。
●
如果把1变成0,把0变成1,那么“右手边”编码模式和“左手边奇数”编码模式是完全相同的。
●“左手边偶数”编码模式是基于“左手边奇数”编码模式的。
为了得到偶数编码,可以按照如下步骤对左手边编码模式进行操作:
1)把所有的1变成0,0变成1。
2)将得到的结果编码反着读(从右到左)就得到了“左手边偶数”编码模式。
表2.3说明了条码左手边每个字符按照哪种奇偶性进行编码。
奇偶性取决于EAN-13值得第一个数位。
例如,我们的CD的EAN-13值是0075678164125。
在这个条码中,数制码的第一个数位就是第一个“0”,所以,奇偶性就应该遵循下表中的数字0一行:
表2.3EAN奇偶性编码表
●第二个数制位总是按照奇数性进行编码(这在解码时很重要)。
●一个UPC-A条码的第一个数制位总是0,因此,全部使用奇数性。
●所有EAN-13符号(那些第一个数制位不是0的)始终有3个左手边字符采用偶数性编码,有2个采用奇数性编码。
这两个表是EAN-13编码的关键和核心,并且兼容现有的UPC-A符号。
2.2.3EAN-13编码的校验方法
校验码的主要作用是防止条形码标志因印刷质量低劣或包装运输中引起标志破损而造成扫描设备误读信息。
作为确保商品条形码识别正确性的必要手段,条形码用户在标志设计完成后,代码的正确与否直接关系到用户的自身利益。
对代码的验证,校验码的计算是标志商品质量检验的重要内容之一,应该谨慎严格,需确定代码无误后才可用于产品包装上。
下面是EAN-13条形码的校验码验算方法,步骤如下:
(1)以未知校验位为第1位,由右至左将各位数据顺序排队(包括校验码);
(2)由第2位开始,求出偶数位数据之和,然后将和乘以3,得积
;
(3)由第3位开始,求出奇数位数据之和,得
(4)将
和
相加得和
(5)用
除以10,求得余数,并以10为模,取余数的补码,即得校验位数据值;
(6)比较第1位的数据值与C的大小,若相等,则译码正确,否则进行纠错处理。
3一维条形码的识别
3.1图像的预处理
3.1.1图像的二值化处理
灰度化二值化,为实现数字图像的阈值变换提供前提条件,要将256色位图转变为灰度图,灰度与RGB值之间的关系为:
Y=0.299R+0.587G+O.114B
二值化是利用点运算中的阈值变换理论将灰度图转化为二值图像。
二值化中阈值T的选择是关键,在整幅图中,我们最关心的是条码,条码是由条空(黑白)组成的,又因为本实验中所用图像为256色位图,故采用双峰法得到阈值T,对其阀值设置为128,,此阈值可以有效地把条码的条空区分出来。
下图为实验中二值化图像:
图3.2二值化后的条码图像
部分代码如下:
voidGrayTrans:
:
BinaryImage(intthreshold)
{
if(m_pImgDataOut!
=NULL){
delete[]m_pImgDataOut;
m_pImgDataOut=NULL;
}
if(m_lpColorTableOut!
delete[]m_lpColorTableOut;
m_lpColorTableOut=NULL;
m_nBitCountOut=8;
m_nColorTableLengthOut=ComputeColorTabalLength(m_nBitCountOut);
if(m_nColorTableLengthOut!
=0){
m_lpColorTableOut=newRGBQUAD[m_nColorTableLengthOut];
for(inti=0;
i<
m_nColorTableLengthOut;
i++){
m_lpColorTableOut[i].rgbBlue=i;
m_lpColorTableOut[i].rgbGreen=i;
m_lpColorTableOut[i].rgbRed=i;
m_lpColorTableOut[i].rgbReserved=0;
}
intpixelByteIn=3;
intlineByteIn=(m_imgWidth*pixelByteIn+3)/4*4;
m_imgWidthOut=m_imgWidth;
m_imgHeightOut=m_imgHeight;
intlineByteOut=(m_imgWidth*m_nBitCountOut/8+3)/4*4;
m_pImgDataOut=newunsignedchar[lineByteOut*m_imgHeight];
intm,n;
for(m=0;
m<
m_imgHeight;
m++){
for(n=0;
n<
m_imgWidth;
n++)
*(m_pImgDataOut+m*lineByteOut+n)=0.11**(m_pImgData+m*lineByteIn+n*pixelByteIn+0)
+0.59**(m_pImgData+m*lineByteIn+n*pixelByteIn+1)
+0.30**(m_pImgData+m*lineByteIn+n*pixelByteIn+2)+0.5;
}
inti,j;
for(i=0;
i<
for(j=0;
j<
j++)
if(*(m_pImgDataOut+i*lineByteOut+j)<
threshold)
*(m_pImgDataOut+i*lineByteOut+j)=0;
else
*(m_pImgDataOut+i*lineByteOut+j)=255;
}
3.1.2条码图像的提取
图像提取是把图像中的条码部分割出来,得出宽度序列,用于后续的条码译码。
通过水平方向和垂直方向的直方图统计,寻找二值化后图像条码区域,来搜索得到条码图像宽度序列。
为下一步的字符识别做好准备。
3.2条码图像的字符识别
EAN-13是一种(7,2)码,即每个字符的总宽度为7个模块宽,交替由两个条和两个空组成,而每个条空的宽度不超过4个模块,如图4所示。
图3.1 EAN-13条码宽度的定义
图3.1中
表示当前字符中四个相邻条、空的宽度,
是一个字符的宽度,满足:
为整数
且
。
用
表示当前字符单位模块的宽度,则
令
,
由
的值可以得到编码。
例如:
若
,且条码的排列为条—空—条—空,则可知当前字符的编码为1000100,是右侧偶字符7。
,且条码的排列为空—条—空—条,则可知当前字符的编码为0001011,是左侧偶字符9。
识别结果如下图:
图3.2 EAN-13条码识别结果
4结论
在对条码图像作相应的图像预处理之后,对得到的二值条码图像利用上述条码识别算法在vc6.0软件环境下编写了相应的软件程序。
通过多次实验,识别效果很好,误码率低,大大提高了条码的识别率。
相信对其它一维条码图像识别具有一定的理论及实践参考价值。
尽管如此,设计中也遇到了很多的问题有待进一步的解决和探索研究。
图像处理是条码识别的重要基础。
本设计只是对质量较好的条码图像进行一般性处理,但实际中的图像并都不是这么理想,例如条码污染、条码断裂、条码瑕疵等。
这些需要进行滤波、去噪等处理过程才能达到译码的目的。
如果条码被污染了我们要进行修复,条码发生几何畸变我们要进行图像矫正等等。
只有考虑到更多的方面才能提高系统的性能和适应性,对一定质量范围内的条码图像都能进行有效的处理。
其次,对软件程序的精简也是我所追求的,希望通过最精练的语句实现所需要的功能。
程序中很多的语句还有进一步改进的空间,这样既能精简语句,使语句简明易懂,也能提高程序整体的执行速度,提高条码识别效率。
参考文献
[1]郑莉,张瑞丰等.C++语言程序设计[M].北京:
清华大学出版社,2003.
[2]谭浩强.C程序设计[M].北京:
清华大学出版社,2005.
[3]杨淑莹.图像识别与项目实践:
VC++、MATLAB技术实现[M].北京:
电子工业出版社,2014年5月
[4]冯伟兴,贺波,王臣业等.VisualC++数字图像模式识别技术详解[M].北京:
机械工业出版社,3013.1.1
[5]
费振原
条码技术及应用,上海:
上海科学技术文献出版社,1992.9
[6]刘志海,条形码技术及程序设计[M],重庆:
重庆大学出版社,1991。
[7]王雅静,基于图像处理的EAN-13条码识别算法[J],山东理工大学学报,2005,第19卷(第4期):
3-5。
[8]赵素霞,基于数字图像处理方式的EAN-13条码识读算法研究[C],山东:
山东大学,2005,48-60。
[9]苏彦华,VisualC++数字图像识别技术典型案例,北京:
人民邮电出版社,2004。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 VC 条形码 识别