Linux下二维码识别库Zbar的安装与使用
1. 安装Zbar
sudo apt-get install libzbar-dev
2. 识别流程
- 读取图像并转换为Zbar内建图像类型
- 创建Zbar扫描器
- 设置扫描参数
- 扫描图像并获取结果
#include <zbar.h> // 仅能包含该头文件,其他头文件宏定义中写了不可用于使用
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img = imread("test.jpg"); // 读取图像
/*转换为Zbar内置图像类型*/
auto row = Gray.rows;
auto col = Gray.cols;
uchar *data = (uchar *)Gray.data;
/*创建Zbar图像, Image类型对象*/
Image code(col, row, "Y800", data, row * col);
/*创建Zbar扫描器*/
ImageScanner scanner;
/*设置Zbar配置,这里设置的是条码二维码均可识别的模式,至于可选参数可以查看对应的枚举类型定义*/
scanner.set_config(ZBAR_NONE, ZBAR_CFG_ENABLE, 1);
/*扫描图像并获取结果*/
scanner.scan(code); // 返回值为: >0代表有条码/二维码被识别,0代表没有识别到,<0代表出错
/*输出识别结果,每一个二维码有三种属性,类型,内容以及在图像中的位置*/
struct ans // 暂存结果
{
string type;
string content;
vector<Point2f> points;
}
vector<ans> res;
/*一张图像中可能有多个码因此使用Zbar提供的迭代器类型进行访问*/
Image::SymbolIterator Symbol = code.symbol_begin();
for(; Symbol != code.symbol_end(); ++Symbol)
{
ans tmp;
tmp.type = Symbol->get_type();
tmp.content = Symbol->get_data();
for (int i = 0; i < Symbol->get_location_size(); i++)
tmp.points.push_back(Point2f(Symbol->get_location_x(i), Symbol->get_location_y(i)));
res.push_back(tmp);
}
/*展示结果*/
for(int i = 0; i < res.size(); i++)
{
cout << "type: " << res[i].type << endl;
cout << "content: " << res[i].content << endl;
for(int j=0;j<res[i]..size();j++)
line(img,res[i].points[j],res[i].points[(j+1)%res[i].points.size()],Scalar(255,0, 0),4);
}
}
3. cmake编写
如果使用findpackage
去寻找zbar,是找不到的。
使用findpackage的前提是包在安装时提供了一个名为
findXXX.cmake
或者xxxconfig.cmake
的文件且加到环境变量中。
但zbar等以下轻量库并没有提供这个文件,取而代之的是一个后缀为.pc
的文件。
pkgconfig
是linux下的一个包管理器,与cmake类似,它通过.pc
后缀文件来去管理包,获取包的相关信息。
因此我们可以通过cmake调用pkgconfig
来找到zbar的相关信息。
cmake_minimum_required(VERSION 3.5.1)
project(ZbarTest)
find_package(OpenCV REQUIRED)
find_package(PkgConfig REQUIRED) # 找到pkgconfig
pkg_search_module(ZBAR REQUIRED zbar) # 通过pkgconfig查找zbar,然后就可以使用ZBAR_INCLUDE_DIRS和ZBAR_LIBRARIES变量了
add_executable(main QrCode.cpp)
target_include_directories(main PRIVATE ${OpenCV_INCLUDE_DIRS} ${ZBAR_INCLUDE_DIRS})
target_link_libraries(main PRIVATE ${OpenCV_LIBS} ${ZBAR_LIBRARIES} libMVSDK.so MvCamera)