目录
4 在Linux PC(Ubuntu Server 1604 64位)下使用zbar
5 在ARM Linux(Hi3518ev300)下使用zbar
1 说明
手机端有很多APP可以通过扫码识别二维码或一维码的内容,本文主要讲解在桌面端和嵌入式端通过使用开源软件zbar识别二维码。
2 软件获取
https://sourceforge.net/projects/zbar/files/zbar/0.10/,该链接有Windows、Linux环境的Zbar程序。
百度网盘:https://pan.baidu.com/s/1Xj7yZ2MpP64Ui9DAFUu9gA
提取码:xbtv,网盘中有一些示例图片和程序可供参考。
3 在Windows下使用zbar
双击exe文件即可安装。
参考安装目录下的README.windows->RUNNING已经网盘中的示例图片pics_windows,
在系统程序栏选择“ZBar Command Prompt”,将图片放入安装目录的examples子目录下,以图片a.png为例(条码内容为”hello你好”),执行zbarimg -d examples\a.png,当二维码中有中文时,Windows命令行下显示乱码,这是windows cmd窗口字符编码的问题,可以不用管它,zbar本身支持中文,在文章后面会讲到怎么在终端中显示条码的中文内容。
4 在Linux PC(Ubuntu Server 1604 64位)下使用zbar
zbar支持从图片(灰度图)中识别二维码(“ZBar Command Prompt”),也支持从视频流中识别二维码(“zbarcam”),下面只讲解识别图片中的二维码。
export CFLAGS=""
tar xjf zbar-0.10.tar.bz2
cd zbar-0.10/
mkdir output
./configure --prefix=$PWD/output/ --without-gtk --without-qt --without-imagemagick --without-python --disable-video
make & make install,此时output目录下会有库文件和头文件(ls -R output/)
如果遇到如下错误,完全按照上述步骤操作应该可以消除该错误,
zbar结合其他工具如imagemagick可以实现丰富的功能,但是会增加移植复杂度,当前笔者只使用纯粹的zbar功能,zbar的接口接收灰度图像(PGM图片),笔者使用libjpeg将JPEG图片转换为PGM格式的灰度图像。网盘中pics_linuxPC1.rar包含了示例用的BMP、PGM图片。PGM图片可以使用imagemagick的Windows版本打开,比如在ftp://ftp.imagemagick.org/pub/ImageMagick/下载ImageMagick-6.9.10-84-Q16-x64-dll.exe直接安装即可,也可以在网盘中找到该安装包,该工具还可以实现丰富的图片处理,如图片格式转换等。
网盘中test_linuxPC.c实现识别内容为https://www.wondfo.com.cn/的二维码,在output目录编译和执行,
gcc test_linuxPC.c ./lib/libzbar.a -I./include -o test_linuxPC.c -lpthread
./test_linuxPC 1920 1080 backup.pgm
pics_linuxPC2.rar是测试用的图片示例,当二维码有中文时能正常显示。
4.1 无内存泄漏的示例代码
上述测试程序使用valgrind测试时发现有内存泄漏,笔者未修复该泄漏问题,另外编译安装包里面的examples/scan_image.c,使用valgrind测试依旧有一个内存泄漏,截图如下:
笔者直接修改安装包源代码,将qrdectxt.c第58行直接注释掉,之后重新编译,没有内存泄漏并能识别出二维码。
网盘中output.tar.gz、test2.c、backup.pgm为测试所需的文件:
使用valgrind测试截图如下:
5 在ARM Linux(Hi3518ev300)下使用zbar
zbar支持从图片(灰度图)中识别二维码(“ZBar Command Prompt”),也支持从视频流中识别二维码(“zbarcam”),下面只讲解识别图片中的二维码。
export CFLAGS=""
tar xjf zbar-0.10.tar.bz2
cd zbar-0.10/
mkdir output
./configure --prefix=$PWD/output/ --without-gtk --without-qt --without-imagemagick --without-python --disable-video --host=arm CC=arm-himix100-linux-gcc
make & make install
,此时output目录下会有库文件和头文件(ls -R output/,如果output目录下没有文件则执行make distclean之后再配置、编译、安装)。
zbar结合其他工具如imagemagick可以实现丰富的功能,但是会增加移植复杂度,当前笔者只使用纯粹的zbar功能,zbar的接口接收灰度图像,笔者使用libjpeg将JPEG图片转换为PGM格式的灰度图像。网盘中pics_armlinux.rar包含了示例用的BMP、PGM图片。
test_armlinux.c实现识别内容为https://www.wondfo.com.cn/的二维码,在output目录编译和执行,
arm-himix100-linux-gcc test_armlinux.c ./lib/libzbar.a -I./include -o test -lpthread
./test 1920 1080 backup.pgm
当二维码有中文时能正常显示(串口终端工具的字符串编码集为UTF-8)。
6 配置为只识别二维码
zbar可以同时识别多个条形码(具体参看zbar_symbol_type_t),如果只想让zbar做识别二维码(QR-Code)的功能,则可以通过接口配置它。
示例代码如下:
7 获取二维码位置信息
zbar的接口支持获取已识别出来的二维码的位置信息,获取到的位置为4个边角的图片相对坐标(x,y)。
unsigned zbar_symbol_get_loc_size (const zbar_symbol_t *sym);返回坐标个数,正常情况下应该返回4。
int zbar_symbol_get_loc_x (const zbar_symbol_t *sym, unsigned idx);获取指定索引位置的x坐标。
int zbar_symbol_get_loc_y (const zbar_symbol_t *sym, unsigned idx);获取指定索引位置的y坐标。
示例代码如下图示: