吴兆林
摘要:本文是基于Zbar开源条形码识别开发包,使用VC++开发工具和OpenCV,进行条形码图像的识别,介绍了条码码识别常用的两种方法和条形码图像识别要解决的两个关键问题。详细讲述了基于Zbar条形码图像识别的具体实现步骤:开发工具环境的设置、条形码图像的获取、条形码图像的预处理、条形码图像的识别四个步骤,重点是Zbar开发工具的实现方法。
关键词:条形码 识别 Zbar OpenCV 图像
中图分类号:TP391.41 文献标识码:A 文章编号:1007-9416(2016)08-0128-02
自从上世纪末,互联网得到了飞速发展,互联网为信息化和现代化奠定了坚实的基础,在人们不断探索人与人的现代通信技术的同时,视觉也在物与物的通信角度悄然翻开。从2005年开始,一种全新的“网络”—物联网开始悄然出现并影响日益巨大,物联网被视为互联网的应用拓展,实现了任何物体与物体之间的信息交换和通信。目前物联网中最常用的信息采集技术是条形码技术,所以条形码图像采集和识别将变得越来越重要。
1 条形码技术简介
条形码是一种信息代码,它用特殊的图形来表示数字、字母信息和某些符号,用以表示一个完整数据的符号。条形码分为一维条形码和二维码。
一维条形码简称条形码,它是由一组规则排列的条、空以及对应的字符组成的标记,这些条和空组成的数据表达一定的信息。常用的一维码的码制包括:EAN码、39码、UPC码、128码、93码、库德巴码等。
二维条形码简称二维码,它是用某种特定的几何图形按一定规律在平面分布的黑白相间的图形记录数据符号信息的。常用二维码的码制有:DataMatrix、MaxiCode、Aztec、QRCode、Code49等。
2 条形码图像识别的常用方法
对条形码的图像进行识别,就是对条码图像进行译码,得到条码所表示的文本信息,常用的方法有如下两种:
2.1 按照条形码编码原理识别条码
由于条形码种类多,且每种条码都有自己的编码规则,所以利用条形码的编码原理来识别条形码,一是对条形码图像处理的要求高,二是每一种条形码编码需要相应的识别算法,程序编程量大,识别难度大。
2.2 使用开源条形码识别工具包进行识别
由于条形码都是标准化的产品,目前市场上有专门的条形码识别工具包,帮助程序开发者快速方便地识别出图像中的条码信息,这样开发者就无需再对图像中不同类型的条形码编写解码程序,只需将图像交给工具包就能快速得到条码信息。目前条形码识别工具包有很多,但开源的条形码开发工具包不多,主要有两个,一是Zbar工具包,另一是ZXing工具包,两者都具有解码多种格式的一维和二维条形码功能,并且这两种工具包支持多平台和多语种版本供开发者使用。ZBar工具是基于C语言编写,解码效率高于ZXing,所以在windows平台下,使用VC++开发工具进行条形码识别,首先Zbar工具包。
3 条形码图像识别要解决的两个关键问题
条形码图像识别的流程是:采集图像、图像预处理、条形码识别,得到图像中的条形码信息。需要解决好二个问题,即图像处理和条形码识别问题。
3.1 图像处理问题
图像处理部分是条码识别的前期工作,需要使用强大的图象处理工具来进行,包括图像的读入、条形码区域的裁剪、滤波、二值化处理等,得到高质量图像。条码识别就是在这个图像的基础上实现,所以图像处理的质量直接关系到条码能否正确识别。
3.2 条形码识别问题
条形码识别问题,就是采用什么方法把图像上的条形码转化成相应的文本信息。如果采用根据条形码编码原理来识别条码,因为条形码种类多,每种条形码编码方式不同,开发人员不仅要熟悉各种条形码的编码规则,而且要针对每种条形码编写相应的解码程序,具有实现起来难度大、编程量大等缺点。而采用条形码识别工具包来进行条形码识别,一可以大大简化编程工作量;二不需要熟悉各种条形码的编码规则,识别工具包都能自行判断;三来识别率高、速度快。
4 基于Zbar条形码图像识别的实现步骤
要对图像中的条形码进行识别,有很多种实现途径,本文是在windows操作系统下,使用VC++开发工具来实现,需要如下几个步骤:
4.1 开发工具环境的设置
使用Zbar进行条形码图像识别的第一步是开发工具的环境设置,开发工具环境的设置包含两个方面:一是图像处理工具设置;二是Zbar工具包设置。
4.1.1 图像处理工具OpenCV的设置
OpenCV是一个基于C/C++语言的开源图像处理函数库,其代码都经过优化,用于实时处理图像,图像处理能力强大、速度快、使用方便。使用OpenCV函数库时,需要正确的配置VC++的工程设置,主要是配置Windows环境变量和VC++的环境设置。VC++的环境设置包括设置预先编译头文件的路径与动态链接库的路径,即将OpenCV需要的一些函数头文件和库文件加入到当前编译的工程中,使得程序在编译时能够正确地找到所需文件。
4.1.2 Zbar条形码开发工具的设置
Zbar条形码工具包的环境设置,只涉及到一个库文件libzbar-0.lib和一个头文件Zbar.h,把库文件复制到OpenCV的库文件目录下,把头文件Zbar.h加到当前编译的工程中就可以了,VC++在编译时就可以就能找到这些文件进行编译。
4.2 条形码图像的获取
识别的第二步是获取要识别的图像,获取图像的方法有两种:一是通过电脑摄像头或者其他图像采集设备,实时获取要识别的条形码图像,二是导入已经用其他方法采集好的图像。从摄像头获取图像的方法是利用OpenCV的库函数,先创建设备和图像两个变量CvCapture* capture; IplImage* m_Frame;然后利用库函数获取摄像头中的图像capture=cvCreateCameraCapture(0); m_Frame=cvQueryFrame(capture);就可以从摄像头中获取图像。
如果是图像已经采集好了,使用VC++的CFileFind类和CopyFile()函数,把采集好的图像文件导入到软件的指定文件夹就可以了。
4.3 条形码图像的预处理
图像预处理的目标是提高别的速度和识别的正确率。简单的图像处理方法是对整幅图像进行去噪声和二值化处理;复杂的处理方法是从整个图像中裁剪取条形码区域,去噪声和二值化,必要时还要进行旋转、放大和缩小等处理,最终获得高质量的图像。
4.4 条形码图像的识别
图像预处理好了,就可以利用Zbar进行条形码的识别,需要如下步骤:(1)创建并设置Zbar图像阅读器;(2)获取图像信息;(3)从图像中识别条形码数据;(4)把识别的数据从UTF8格式转成ASCII格式。
4.4.1 创建并设置Zbar图像阅读器
要从图像中识别条形码,必须先创建Zbar图像阅读器,并且进行相应设置,代码如下:
zbar_image_scanner_t *scanner = zbar_image_scanner_create();
zbar_image_scanner_set_config(scanner, ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
4.4.2 获取图像信息
Zbar阅读器设置好了以后,接着读入图像,获取图像信息,为识别条形码做准备,代码如下:
int width = 0, height = 0;const void *raw = NULL;
CvMat *cv_matrix = cvLoadImageM(“文件名”,CV_LOAD_IMAGE_GRAYSCALE);
width = cv_matrix->width;height= cv_matrix->height;
raw = (char*)cv_matrix->data.ptr;
zbar_image_t *image = zbar_image_create();
zbar_image_set_format(image, *(int*)”Y800”);
zbar_image_set_size(image, width, height);
zbar_image_set_data(image, raw, width * height, zbar_image_free_data);
4.4.3 图像中识别条形码数据
上述识别准备工作做好以后,接下就是从图像中读取条形码数据,代码如下:
int n = zbar_scan_image(scanner, image);
const zbar_symbol_t *symbol = zbar_image_first_symbol(image);
const char *data = zbar_symbol_get_data(symbol);//数据存放到data
4.4.4 把识别的数据从UTF8格式转成ASCII格式
Zbar从图像得到的数据存放在data变量中,但数据的格式是UTF8格式,而一般使用的是数据格式是ASCII格式,所以要进行数据格式转换,代码如下:
CString result_String; //用于存放转成ASCII码格式的数据
int nLen = MultiByteToWideChar(CP_UTF8, 0, data, -1, NULL, 0);WCHAR *pWstr = new WCHAR[nLen+1];
ZeroMemory(pWstr,sizeof(WCHAR) * (nLen+1)) ;
MultiByteToWideChar(CP_UTF8, 0, data, -1, pWstr, nLen) ;
std::string strAnsi(_bstr_t((wchar_t*)pWstr));
result_String.Format(_T(“%s”),pWstr);
delete[] pWstr ;
这样识别出来的条形码数据就存放再result_String变量中,用户就可以对该数据根据需要进行相应的处理。
5 结语
利用Zbar开源的条形码工具包来开发条形码识别程序,可以大大简化程序开发工作量,识别程序开发的重点可以放在图像预处理上,即使图像不进行预处理,Zbar也能识别出图像质量较好的条形码,条形码识别这块程序无需专门开发,只要调用Zbar工具中相应的语句就可以了。通过实验,识别效果好、条形码识别率高、速度快,可以识别出多种常用的一维和二维条形码识码数据。
参考文献
[1]布拉德斯基,克勒.学习OpenCV(中文版).清华大学出版社,2009.
[2]徐永星.条形码国家标准汇编[M].北京:中国标准出版社,2004.
[3]范永法,郭艳萍.条码图像处理及识别的软件开发[J].计算机应用研究,2008.