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)
posted @ 2024-11-25 15:21  凪风sama  阅读(819)  评论(0)    收藏  举报