ZBar项目简介及安装配置

[TOC]


前言

在我们的日常生活中,处处可见条形码和二维码。

在以前,我们去逛书店时,或者你现在随手拿起你身边的一本书,你肯定能看到书本的封页后面印有一排黑色线条组成的标签,也就是条形码;你去你们学校图书馆的自助机上借书还书时识别的也是条形码;哦,对了,你还记得每次大型考试答题卡上都会贴上监考老师分发给你的那个标签吗?还是条形码;甚至现在你随随便便逛个超市或便利店,收银员或者自助机也都是通过扫商品条形码给你计价的。条形码在我们的日常生活中真的是随处可见。

到了后来,2016年之后,二维码也渐渐开始普及起来,现在二维码几乎成了我们日常生活的一部分:新朋友微信加个好友;上下班搭乘公交地铁;平时买东西付款;和别人收付款的当面交易;各个大小公司或者商场甚至地摊搞活动**的时候也告诉你扫码有优惠。

现在只要你出门,或者你不出门,你只要用手机,你是个网民,你就很难不接触到各种条形码与二维码。

那么这些个条形码识别和二维码识别是怎么完成的呢?

这就涉及到了本文要介绍的ZBar项目。


一、ZBar是什么?

ZBar条形码阅读器(ZBar bar code reader)是一个用于读取条形码的开源软件套件。

它支持识别不同来源的文件类型,如视频流、图像文件和原始数据强度传感器。ZBar的算法可识别大部分种类的一维码(条形码),比如I25,CODE39,CODE128,二维码等等。

ZBar项目包括C、C++、Python和Perl多种语言共同实现以及用于Qt、GTK和PyGTK的GUI小部件。

1.软件安装

1.1 ZBar安装

ZBar bar code reader - Downloadhttp://zbar.sourceforge.net/download.html

 下载后根据流程安装,需要注意此处勾选 Development Headers and Libraries

 最后将项目安装在常用文件夹下(此处我选择放在C:\Program Files (x86)下)

由于ZBar的默认环境为win32,若在64位机器上使用Zbar,还需要一些库文件

从github下载64位ZBar的源码包

ZbarWin64下载https://github.com/dani4/ZBarWin64

解压后将 ZBarWin64-master\lib 文件夹下 libzbar64-0.lib 文件复制到ZBar安装路径下的 lib 文件夹

将 ZBarWin64-master\lib 文件夹下 libzbar64-0.dll 文件复制到ZBar安装路径下的 bin 文件夹

将ZBarWin64-master\zbar\libiconv\dll_x64文件夹下 libiconv.dll 复制到ZBar安装路径下的bin 文件夹
这部分配置教程来自 原文链接:https://blog.csdn.net/weixin_40689871/article/details/109462028

1.2 OpenCV安装

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在**LinuxWindowsAndroidMac OS**操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

这里采用OpenCV库辅助进行二维码的采集和代码的测试。

OpenCV下载https://opencv.org/releases/根据流程解压、安装后,最后将项目放在常用文件夹下(此处我选择放在C:\Program Files (x86)下)

2.环境配置

2.1 系统环境配置

打开 高级系统设置–环境变量–系统变量–Path

把OpenCV和Zbar安装包里的这两个文件目录放在系统变量的路径下即可

2.2 Visual Studio环境配置

打开 视图—其他窗口—属性管理器

单击右侧属性管理器,右键debug|x64(其他也可,配置项不同),添加一个新项目属性表,接下来对这个属性表进行配置。

双击刚刚新建的项目的属性表的属性页界面:

(1)VC++目录—包含目录

添加opencv的include路径和zbar的include路径(按照安装路径)

…\opencv\build\include

…\opencv\build\include\opencv

…\opencv\build\include\opencv2

…\ZBar\include

(2) VC++目录—库目录

添加opencv和zbar的lib路径

…\opencv\build\x64\vc15\lib

…\ZBar\lib

(3) 链接器—输入—附加依赖项

添加opencv和zbar的依赖

opencv_world343d.lib(根据安装的版本 在…\opencv\build\x64\vc15\lib中查看)

libzbar-0.lib

libzbar64-0.lib

3.代码测试

配置环境完成后,重启电脑。

测试代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <opencv2/imgproc.hpp> // Gaussian Blur
#include <opencv2/core.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp> // OpenCV window I/O
#include <opencv2/features2d.hpp>
#include <opencv2/objdetect.hpp>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <zbar.h>
using namespace cv;
using namespace std;
using namespace zbar;
int main()
{
ImageScanner scanner;
scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
//调用系统摄像头,若只有一个摄像头则参数为0
VideoCapture cap(1);
Mat mFrame;
while (1)
{
cap >> mFrame;
Mat image = mFrame;
imshow("camera", mFrame);
Mat imageGray;
cvtColor(image, imageGray, COLOR_BGR2GRAY);
int width = imageGray.cols;
int height = imageGray.rows;
uchar* raw = (uchar*)imageGray.data;
// 在Zbar中进行扫描时候,
//需要将OpenCV中的Mat类型转换为(uchar *)类型,raw中存放的是图像的地址;
//对应的图像需要转成Zbar中对应的图像zbar::Image
Image imageZbar(width, height, "Y800", raw, width * height);
//Y800=GREY 是GRAY灰度图像
scanner.scan(imageZbar);
Image::SymbolIterator symbol = imageZbar.symbol_begin();
for (; symbol != imageZbar.symbol_end(); ++symbol)
{
cout << "类型:" << endl << symbol->get_type_name() << endl << endl;
cout << "条码:" << endl << symbol->get_data() << endl << endl;
}
waitKey(5);
//waitKey()函数的功能是不断刷新图像,频率为delay,单位是ms
}
waitKey();
return 0;
}

使用OpenCV打开电脑摄像头并对视频的每一帧进行采集后,调用Zbar对二维码(或其他码)进行分析

运行结果:

4.遇到问题

测试程序虽然并不复杂,但第一次接触,还是遇到了问题。

1
2
1.  CvCapture* capture = cvCreateFileCapture(0);
2. //类似语句调用OpenCV打开摄像头在调试时会报错

以上代码在编写时没有语法报错,一旦调试就会报错。

1
2
\[ WARN:0\] cvCreateFileCaptureWithPreference: backend FFMPEG doesn't support legacy API anymore.
\[ WARN:0\] cvCreateFileCaptureWithPreference: backend MSMF doesn't support legacy API anymore.

查找资料发现是因为高版本的OpenCV已经不支持这样的C语言风格的代码,而是建议用上面C++面向对象风格编写代码。

三、Linux下Zbar的安装及使用(Ubuntu)

1.环境搭建

  1. 安装依赖项
  2. 安装zbar工具 - zbarimg等
  3. 添加依赖
  4. 下载解压源码
  5. 进入zbar文件夹,创建安装输出文件夹
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//安装依赖项
sudo apt-get install libqt4-dev libv4l-dev python-gtk2-dev imagemagick libmagickwand-dev

//安装zbar工具 - zbarimg等
sudo apt-get install zbar-tools

//添加依赖
sudo ln -s /usr/include/libv4l1-videodev.h /usr/include/linux/videodev.h

//下载解压源码
wget http://downloads.sourceforge.net/project/zbar/zbar/0.10/zbar-0.10.tar.gz
tar -vxzf zbar-0.10.tar.gz

//进入zbar文件夹,创建安装输出文件夹
cd zbar-0.10&&mkdir output

2.编译安装

  1. 从源码进行安装需要预先配置相关内容
1
2
3
4
//配置选项  --prefix:指定install路径  CFLAGS :指定编译时的自定义头文件路径 (可选)
./configure --prefix=$PWD/output/ --enable-shared --disable-video --without-python --without-gtk --without-qt --without-imagemagick CFLAGS=""
//编译和安装 -- 文件会输出到output
make&&make install

3.测试验证

  1. 利用工具生成二维码
  2. 利用编译的zbarimg 进行扫码测试
1
2
3
4
5
6
#下载工具 qrencode
sudo apt-get install qrencode
#生成二维码
qrencode -o test.png -s 18 ‘http://www.baidu.com’
#测试二维码
./zbarimg test.png

四、嵌入式交叉编译Zbar(RISC-V)

  1. 搭建交叉编译环境 riscv64-unknown-linux-gnu-gcc的相关工具预先配置

  2. 同Linux源码进行安装

  3. 利用pkg-config 编译

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #解压
    tar -xvf zbar-0.10.tar.gz
    #配置
    ./configure CC=gcc/linux-x86/riscv/toolchain-thead-glibc/riscv64-glibc-gcc-thead_20200702/bin/riscv64-unknown-linux-gnu-gcc --host=riscv64-unknown-linux-gnu --prefix=$PWD/output/ --without-gtk --without-qt --without-python
    export -p CFLAGS=""
    ./configure --host=x86_64-linux-gnu --prefix=$PWD/output/ --without-gtk --without-qt --without-python --disable-video

    #编译安装
    make -j20&& make instll
    #pkg-config
    export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:project/github/application/zbar-0.10/output/lib
    pkg-config --libs --cflags zbar*

总结

 ZBar项目涉及知识十分丰富且复杂,本次各种环境下对ZBar进行了安装、配置以及简单的测试和使用,后续将开展详细的代码分析工作。