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)
Linux下二维码识别库Zbar的安装与使用的更多相关文章
- 【OpenWRT】增加第三方开源库 - 二维码开源库 zbar
序言 第一次开始写博客,在日常学习和工作当中 CSDN 给我帮助很大,因此我也在 CSDN 奉献自己的经验,借此回馈 CSDN 对我的帮助,希望自己的经验可以帮助需要的人,也方便自己后续复习之用,同时 ...
- 有关python下二维码识别用法及识别率对比分析
最近项目中用到二维码图片识别,在python下二维码识别,目前主要有三个模块:zbar .zbarlight.zxing. 1.三个模块的用法: #-*-coding=utf-8-*- import ...
- 二维码开源库zbar、zxing使用心得
首先说明我的测试场景是“识别打印在纸上的二维码”,在扫描结果中寻找二维码并进行识别,而不是直接让摄像头对着二维码扫描. zbar和zxing用的都是自己从github上clone的c++源码/接口编译 ...
- DM二维码识别库DMDECODER的使用--MFC例程
DM码和QR码是当今比较主流的二维码,其中QR码容量大,容量密度为16kb,DM码容量要小一点,可在仅仅25mm²的面积上编码30个数字,但是DM码的容错率更高,所以实际的工业生产中经常使用DM码作为 ...
- 第47章 QR-Decoder-OV5640二维码识别—零死角玩转STM32-F429系列
第47章 QR-Decoder-OV5640二维码识别 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.y ...
- C#/.net 通过js调用系统相机进行拍照,图片无损压缩后进行二维码识别
这两天撸了一个需求,通过 JS 调用手机后置相机,进行拍照扫码.前台实现调用手机相机,然后截取图片并上传到后台的功能.后台接收传过来的图片后,通过调用开源二维码识别库 ZXing 进行二维码数据解析 ...
- Python zxing 库解析(条形码二维码识别)
各种扫码软件 最近要做个二维码识别的项目,查到二维码识别有好多开源的不开源的软件 http://www.oschina.net/project/tag/238/ Zbar 首先试了一下Zbar,pyt ...
- 基于opencv3.0和下的条形码与二维码识别
其中对条码与二维码的识别分为以下4个步骤 1. 利用opencv和Zbar(或者Zxing)对标准的条形码图片(即没有多余背景干扰,且图片没有倾斜)进行解码,将解码信息显示出来,并与原始信息对比. 2 ...
- tornado zbar 二维码识别 ,配合nginx 反向代理,supervisord 监控
tornado zbar 二维码识别 ,配合nginx 反向代理,supervisord 监控 1.zbar识别二维码程序,python2.6.6 #!/usr/bin/env python # co ...
- Opencv+Zbar二维码识别(二维码校正)
二维码和车牌识别基本都会涉及到图像的校正,主要是形变和倾斜角度的校正,一种二维码的畸变如下图: 这个码用微信扫了一下,识别不出来,但是用Zbar还是可以准确识别的~~. 这里介绍一种二维码校正方法,通 ...
随机推荐
- TimeWheel算法介绍及在应用上的探索
作者:来自 vivo 互联网服务器团队- Li Fan 本文从追溯时间轮算法的出现,介绍了时间轮算法未出现前,基于队列的定时任务实现,以及基于队列的定时任务实现所存在的缺陷.接着我们介绍了时间轮算法的 ...
- 必应每日壁纸API封装
简介 这个类封装了必应首页的每日壁纸查看功能,提供了查看.保存壁纸的方法,最大支持查看近8天的壁纸 使用方法 async Task Main() { try { var bing = BingWall ...
- C#自定义控件—旋转按钮
C#用户控件之旋转按钮 按钮功能:手自动旋转,标签文本显示.点击二次弹框确认(源码在最后边): [制作方法] 用方法找到控件的中心坐标,画背景外环.内圆:再绘制矩形开关,进行角度旋转即可获得: [关键 ...
- c程序设计语言 by K&R(五)UNIX系统接口
一.文件描述符 在unix操作系统中,所有的外围设备(包括键盘和显示器)都被看作是文件系统的文件,因此,所有的输入.输出都要通过读/写文件来完成.也就是说,通过一个单一的接口就可以处理外围设备和程序之 ...
- c程序设计语言 by K&R(三)结构
一.类型定义 typedef typedef int Length; typedef char* String; typedef struct tnode* Treeptr; typedef int ...
- 从Linq的Where方法理解泛型、委托应用场景
最近遇到了一个问题,Linq的Where里面传递的是什么?Where的功能是什么实现的?没有第一时间答上来,在整理相关资料后决定自行实现Linq的Where方法来加深印象. 什么是泛型 指在 ...
- MyBatis——案例——添加
添加 1.编写接口方法:Mapper接口 参数:除了 id 之外的所有数据 结果:void /** * 添加 */ void add(Brand brand); 2.编写SQL ...
- web架构-nginx负载均衡
nginx的负载均衡 Nginx 是一个广泛使用的反向代理服务器,能够高效地实现负载均衡.负载均衡的核心作用是将来自客户端的请求分发到多个后端服务器上,从而平衡每台服务器的压力.通过Nginx,我们可 ...
- Java实现随机抽奖的方法有哪些
在Java中实现随机抽奖的方法,通常我们会使用java.util.Random类来生成随机数,然后基于这些随机数来选择中奖者.以下将给出几种常见的随机抽奖实现方式,包括从数组中抽取.从列表中抽取以及基 ...
- 如何关闭每次打开启动软件前的弹窗(用户账户控制)你要允许此应用.WIN11、10、7
1.先点击任务栏内的搜索,输入"控制面板",然后点开 2.然后在右上角输入"更改用户",然后在下方点击"更改用户账户控制设置" 3.然后把& ...