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)

Linux下二维码识别库Zbar的安装与使用的更多相关文章

  1. 【OpenWRT】增加第三方开源库 - 二维码开源库 zbar

    序言 第一次开始写博客,在日常学习和工作当中 CSDN 给我帮助很大,因此我也在 CSDN 奉献自己的经验,借此回馈 CSDN 对我的帮助,希望自己的经验可以帮助需要的人,也方便自己后续复习之用,同时 ...

  2. 有关python下二维码识别用法及识别率对比分析

    最近项目中用到二维码图片识别,在python下二维码识别,目前主要有三个模块:zbar .zbarlight.zxing. 1.三个模块的用法: #-*-coding=utf-8-*- import ...

  3. 二维码开源库zbar、zxing使用心得

    首先说明我的测试场景是“识别打印在纸上的二维码”,在扫描结果中寻找二维码并进行识别,而不是直接让摄像头对着二维码扫描. zbar和zxing用的都是自己从github上clone的c++源码/接口编译 ...

  4. DM二维码识别库DMDECODER的使用--MFC例程

    DM码和QR码是当今比较主流的二维码,其中QR码容量大,容量密度为16kb,DM码容量要小一点,可在仅仅25mm²的面积上编码30个数字,但是DM码的容错率更高,所以实际的工业生产中经常使用DM码作为 ...

  5. 第47章 QR-Decoder-OV5640二维码识别—零死角玩转STM32-F429系列

    第47章     QR-Decoder-OV5640二维码识别 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.y ...

  6. C#/.net 通过js调用系统相机进行拍照,图片无损压缩后进行二维码识别

    这两天撸了一个需求,通过 JS  调用手机后置相机,进行拍照扫码.前台实现调用手机相机,然后截取图片并上传到后台的功能.后台接收传过来的图片后,通过调用开源二维码识别库 ZXing 进行二维码数据解析 ...

  7. Python zxing 库解析(条形码二维码识别)

    各种扫码软件 最近要做个二维码识别的项目,查到二维码识别有好多开源的不开源的软件 http://www.oschina.net/project/tag/238/ Zbar 首先试了一下Zbar,pyt ...

  8. 基于opencv3.0和下的条形码与二维码识别

    其中对条码与二维码的识别分为以下4个步骤 1. 利用opencv和Zbar(或者Zxing)对标准的条形码图片(即没有多余背景干扰,且图片没有倾斜)进行解码,将解码信息显示出来,并与原始信息对比. 2 ...

  9. tornado zbar 二维码识别 ,配合nginx 反向代理,supervisord 监控

    tornado zbar 二维码识别 ,配合nginx 反向代理,supervisord 监控 1.zbar识别二维码程序,python2.6.6 #!/usr/bin/env python # co ...

  10. Opencv+Zbar二维码识别(二维码校正)

    二维码和车牌识别基本都会涉及到图像的校正,主要是形变和倾斜角度的校正,一种二维码的畸变如下图: 这个码用微信扫了一下,识别不出来,但是用Zbar还是可以准确识别的~~. 这里介绍一种二维码校正方法,通 ...

随机推荐

  1. HttpContext.SignInAsync 失效(表面解决了问题,未深入到.net core 源码去找问题,记录一下,等有时间翻一下.net core 源码试试能不能找到根本原因)

    今天在弄 identityServer4 项目的时候,发现好好的登录竟然没用了. 各种跟踪后发现是 HttpContext.SignInAsync 这个方法不写cookies了 原本经过这个方法后,会 ...

  2. 【YashanDB知识库】主备延迟故障分析方法

    [标题]主备延迟故障分析方法 [问题分类]故障分析 [关键字]Yashandb.主备延迟 [问题描述]当数据库备机出现回放延迟时,需要通过一些手段分析延迟的原因.通过数据库的系统视图或操作系统监控数据 ...

  3. k8s 中的 Service 简介【k8s 系列之二】

    〇.前言 k8s 集群中的每一个 Pod 都有自己的 IP 地址,那么是不是有 IP 了,访问起来就简单了呢,其实不然. 因为在 k8s 中 Pod 不是持久性的,摧毁重建将获得新的 IP,客户端通过 ...

  4. JavaScript – Set and Map

    参考 Set 和 Map 数据结构 Set 介绍和使用 Set 很像 Array, 但其实它是一个 Iteralbe 对象. 用于保存多个值, 而且具有 unique 特性 (1 个 set 里面不会 ...

  5. 一个 tomcat 下如何部署多个项目?附详细步骤

    一个tomcat下如何部署多个项目?Linux跟windows系统下的步骤都差不多,以下linux系统下部署为例.windows系统下部署同理. 一.不修改端口,部署多个项目 清楚tomcat目录结构 ...

  6. 痞子衡嵌入式:MCUBootUtility v6.3发布,支持获取与解析启动日志

    -- 痞子衡维护的 NXP-MCUBootUtility 工具距离上一个大版本(v5.3.0)发布过去一年了,期间痞子衡也做过三个版本更新,但不足以单独介绍.这一次痞子衡为大家带来了全新重要版本v6. ...

  7. Unity中的光源类型(向前渲染路径进行光照计算)

    Unity中的光源类型 Unity中共支持4种光源类型: 平行光 点光源 聚光灯 面光源(在光照烘焙时才可以发挥作用) 光源的属性: 位置 方向(到某个点的方向) 颜色 强度 衰减(到某个点的衰减) ...

  8. SXYZ-6.28训练赛

    今天上午出中考成绩,所以下午打了一场训练赛,只有两个小时,没有昨天毒瘤,但也很毒瘤(还是模拟赛好) 关于中考可以看我的中考游记 (为了保护隐私,以后都把姓名涂掉) 为什么还是倒数啊~ T1 binar ...

  9. Kubernetes的Pod调度:让你的应用像乘坐头等舱!

    一.Kubernetes 中 Pod 调度的重要性 在 Kubernetes 的世界里,Pod 调度就像是一个繁忙的交通指挥官,负责把小车(也就是我们的 Pod)送到最合适的停车位(节点).调度不仅关 ...

  10. arm64 下内核 crash—— 非法地址

    下面是在实际工作中遇到的一次内核(5.4.110)访问非法内存地址(空指针)导致出错的现场,在这里记录一下简单的分析流程为以后遇到类似的问题作为参考. [ 220.619861] Unable to ...