使用zbar识别二维码

目录

1 说明

2 软件获取

3 在Windows下使用zbar

4 在Linux PC(Ubuntu Server 1604 64位)下使用zbar

4.1 无内存泄漏的示例代码

5 在ARM Linux(Hi3518ev300)下使用zbar

6 配置为只识别二维码

7 获取二维码位置信息


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坐标。

示例代码如下图示:

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ta是一个搬运工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值