C++利用zxing识别二维码

2023-11-05

C++利用zxing识别二维码


Win10-x64+VS2015/VS2019

下载编译

1.下载zxing包,并解压,下载地址:https://github.com/glassechidna/zxing-cpp
在这里插入图片描述
build文件夹是后面建立的

2.新建build文件夹,打开cmd命令框,进入build路径下,执行命令(Cmake已经安装):

32位系统下执行:

> cmake -G "Visual Studio 14" ..

64位系统下执行:

> cmake -G "Visual Studio 14 2015 Win64" ..

在这里插入图片描述
注意看命令行提示信息,Cmakelist找不到OpenCV下提供的OpenCVConfig.cmake或者opencv-config.cmake。实际上这是因为zxing库需要依赖OpenCV,我们打开build上级目录下的CMakeLists.txt,在第48行添加OpenCV库的路径,该路径下包含了所需的cmake文件。
在这里插入图片描述
修改完成后,重新执行命令(注意清空build文件夹生成的文件),成功找到opencv!
在这里插入图片描述
这里注意,因为我们的VS使用的是2015,所以命令中指定的是Visual Studio 14。
当然,也可以使用Cmake的GUI方式操作,不需要修改CmakeLists.txt的方式。如下,第一步,打开Cmake工具;第二步,选择Source和Build路径;第三步,点击Add Entry,添加OpenCV_DIR,其中类型输入Path,值通过文件选择为OpenCV的lib路径;第四步点击Configure,选择Visual Studio 14和x64,然后点击完成,可以在下方空白区看到开始配置,Configuring done,成功找到OpenCV;第五步,点击Generate,下方区域显示Generating done。编译完成
在这里插入图片描述
编译成功后,build文件夹下的内容如下:
在这里插入图片描述
3.使用VS2015打开zxing.sln项目,设置成debug x64模式,右键zxing的解决方案(包含6个项目),生成解决方案!
在这里插入图片描述
注意!解决方案下zxing生成失败,libzxing生成时一大堆警告!
经过小编连续几天的不懈努力,包括但不限于对源码、属性表及Cmakelists.txt的研究。终于在最后还是放弃了,目前只知道解决方案生成失败是由于项目libzxing中存在名称相同的源文件,而在编译过程中发生混乱引起的!(这里请擅长VS2015编译链接过程的大佬支个招,为广大同行排忧解难!)

VS2019已经很成熟,能够针对不同路径的同名文件自动编译而不发生混乱,将上面所有使用VS2015的步骤改用VS2019就可以成功编译生成。
例如:
“Visual Studio 14 2015 Win64"修改为"Visual Studio 16 2019 Win64”

配置使用

1.第一步,构建zxing库

将 libzxing-debug.lib , zxing-cpp\core\src和zxing-cpp\opencv\src目录下面的zxing文件夹拷贝出来,构成一个单独供C++调用的 zxing库。 如下图所示,建立了一个新的Zxing文件夹,在其下面新建lib和include文件夹,将libzxing-debug.lib拷贝进lib;并且将zxing-cpp\core\src和zxing-cpp\opencv\src目录下面的zxing文件夹合并拷贝到include文件夹里面。
在这里插入图片描述
2.第二步,配置开发环境

使用VS2019建立工程(VS2015编译失败),打开项目的属性,按如下配置:

  • C/C++>常规附加包含目录:添加include目录
  • 链接器常规附加库目录:添加lib目录
  • 链接器常规附加依赖项:添加libzxing-debug.lib

同时还需要添加opencv的属性配置,方法请参考opencv的配置方法,这里不再说明。

3.第三步,代码中使用zxing

#include "stdafx.h"
#include <string>
#include <iostream>
#include <zxing/LuminanceSource.h>
#include <zxing/common/Counted.h>
#include <zxing/Reader.h>

#include <zxing/common/GlobalHistogramBinarizer.h>
#include <zxing/DecodeHints.h>
#include <zxing/MultiFormatReader.h>
#include <zxing/oned/CodaBarReader.h>
#include <zxing/oned/Code39Reader.h>
#include <zxing/oned/Code93Reader.h>
#include <zxing/oned/Code128Reader.h>
#include <opencv2/opencv.hpp>
#include <vector>
#include <zxing/MatSource.h>

int main()
{
  std::string image_name = "F:\\chenggeng\\HalconItem\\code1d_1.png";
  cv::Mat matSrc = cv::imread(image_name, 1);
  if (!matSrc.data) {
    std::cout << "read image error: " << image_name << std::endl;
    return -1;
  }

  cv::Mat matGray;
  cv::cvtColor(matSrc, matGray, cv::COLOR_BGR2GRAY);

  zxing::Ref<zxing::LuminanceSource> source(new MatSource(matGray));
  int width = source->getWidth();
  int height = source->getHeight();
  std::cout << "image width: " << width << ", height: " << height << std::endl;
  zxing::Ref<zxing::Reader> reader;
  reader.reset(new zxing::oned::Code128Reader);

  zxing::Ref<zxing::Binarizer> binarizer(new zxing::GlobalHistogramBinarizer(source));
  zxing::Ref<zxing::BinaryBitmap> bitmap(new zxing::BinaryBitmap(binarizer));
  zxing::Ref<zxing::Result> result(reader->decode(bitmap, zxing::DecodeHints(zxing::DecodeHints::CODE_128_HINT)));
  std::string str2 = result->getText()->getText();
  std::cout << "recognization result: " << str2 << std::endl;

  zxing::ArrayRef< zxing::Ref<zxing::ResultPoint> > rpoints = result->getResultPoints();
  cv::Point point0(rpoints[0]->getX() + 30, rpoints[0]->getY() + 50);
  cv::Point point1(rpoints[1]->getX() - 30, rpoints[1]->getY() - 50);
  cv::putText(matSrc, str2, cv::Point(rpoints[1]->getX() - 10, rpoints[1]->getY() - 10), 1, 2, cv::Scalar(0, 0, 255));
  cv::rectangle(matSrc, cv::Rect(point1, point0), cv::Scalar(0, 0, 255), 2);
  cv::imshow("locate", matSrc);
  cv::waitKey(0);
  return 0;
}

输出如下:
在这里插入图片描述

参考:

https://blog.csdn.net/qq_24915933/article/details/88934970

https://xiulian.blog.csdn.net/article/details/60467090

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++利用zxing识别二维码 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template

随机推荐

  • sql代码转换小工具(delphi)

    1 下载 2 粘贴sql语句 3 msql转换为delphi sql语句
  • shell脚本基础3——正则表达式

    文章目录 一 基本了解 二 基本正则表达式 2 1 字符匹配 2 2 位置锚定 2 3 匹配次数 2 4 分组 三 扩展正则表达式 3 1 字符匹配 3 2 位置锚定 3 3 匹配次数 3 4 分组 3 5 或者 一 基本了解 正则表达式分
  • 对表的简单查询

    SQL命令对表进行查询 目录 SQL命令对表进行查询 1 无条件查询 2 条件查询 3 统计汇总查询 4 分组查询 5 对查询结果排序 1 无条件查询 无条件查询指只包含 SELECT FROM 的查询 这种查询最简单 例如 在S表中查询所
  • Android Studio安装中的问题及第一次运行hello world程序

    总结一下 在安装Android Studio中可能出现和遇到的问题 并给出解决方案 1 AS在安卓官网可以直接下载完整的安装包 2 SDK找不到的情况 可以自己下载 参考 https www jianshu com p 4ac1313b50
  • 自定义动态数据源

    文章目录 准备 业务流程分析 代码实现 网页上切换数据源 准备 mysql spring boot 配置依赖 配置文件 数据源配置 spring datasource type com alibaba druid pool DruidDat
  • UnityVR--小程序3--金色的子弹2

    子弹需要一个打击目标 目标具备一定的生命值 HP 当生命值将为0时 目标被击落并消失 1 前篇的AXButton cs脚本不需要修改 2 子弹的程序Bullet cs中 OnTriggerEnter Collider other 函数修改为
  • 肖战

    肖战是中国内地男演员 歌手 主持人 毕业于中央戏剧学院表演系 他曾出演过多部影视剧 包括 花千骨 武媚娘传奇 和 长安十二时辰 此外 他还是一位多才多艺的歌手 曾发行过多张个人音乐专辑
  • 苹果开发平台常用网址链接

    苹果开发者中心 https developer apple com cn 苹果开发者中心 企业类型 https developer apple com cn programs enterprise 注册账号 https developer
  • react+antd实现Table拖拽调整列宽

    注意 列需要传入 width 并且配合下面的css样式才能显示拖拽手势 import React useEffect useState from react import Table from antd import Resizable f
  • PE半透明屏是怎么制造的?工艺、材料、应用

    PE半透明屏是一种新型的屏幕材料 具有半透明的特点 它由聚乙烯 PE 材料制成 具有良好的透明度和柔韧性 PE半透明屏广泛应用于建筑 广告 展览等领域 具有很高的市场潜力 PE半透明屏的特点之一是其半透明性 它可以在一定程度上透过光线 使得
  • 相关性分析热力图(Python&Matlab代码实现)

    目录 1 热力图 1 1 简介 1 2 语法 2 算例1 Python代码实现 2 1 算例 2 2 Python代码 2 3 运行结果 3 算例2 Python代码实现 4 算例3 Python代码实现 4 1 算例 4 2 Python
  • 小电容通高频大电容通低频的理解

    本文参考为什么电容通高频阻低频 记录下个人理解并总结 1 电容的作用是通高频阻低频 高频的时候电容总是还没充满电 负半周期便到来 所以电流始终存在 低频的时候信号交流电负半周还没到来 电容已充满电便发生断路 2 理论上电容越大 能通越高的高
  • 简单解释同步、异步、阻塞、非阻塞、中断、轮询、多线程,协程这几个概念(代码未验证,仅参考)

    科普 同步和异步的区别 同步和异步是指程序执行的方式 其中同步指程序按顺序执行 每个任务必须等待前面的任务执行完成后才能执行 而异步则指程序可以在执行一个任务时同时执行另一个任务 不需要等待前一个任务执行完毕 同步 Synchronous
  • supervisor源码分析

    Supervisor分析 1 运行原理概述 Supervisor生成主进程并将主进程变成守护进程 supervisor依次生成配置文件中的工作进程 然后依次监控工作进程的工作状态 并且主进程负责与supervisorctl客户端通信 实现主
  • c语言中求三个整数中的最大值和最小值,编程用指针实现输入三个整数,求其中的最大值...

    公告 为响应国家净网行动 部分内容已经删除 感谢读者理解 话题 编程用指针实现输入三个整数 求其中的最大值回答 include stdio h int getmax int p int n int i max p max p p 0 for
  • C++ 多线程 学习笔记

    线程睡眠很稳定 但无线程睡眠不稳定 线程调用类方法 有参数时调用方法 当参数为引用时 detach分离线程 分离线程与主线程同时进行 join会使主线程挂起 执行join进来的进程 detach必须让主线程在还住运行的情况下调用 换句话说就
  • harbor数据库迁移

    harbor数据库迁移 相同版本间迁移 一 数据导出 旧harbor机 1 进入数据库容器 root localhost docker exec u root it d53efe26b3da bin bash 2 导出registry数据库
  • KafkaConsumer-Kafka从入门到精通(十)

    上篇文章说了 消息压缩可以看分情况进行 判断下服务器cpu空闲还是io空闲较多 如果cpu空闲较多 则考虑消息积压 反之则不考虑 还有消费者组 consumer group 对于同一个group 只会发送一条消息进入一个实例 位移提交在0
  • php中mail,php中mail()函数和SMTP工作原理及实际

    php中mail 函数和SMTP工作原理及实际 发表于2019 05 24 12 36 次阅读 来源网络整理 作者session 摘要 php中mail 函数和SMTP工作原理及实际 php中mail 函数和SMTP工作原理及实际 一个发送
  • C++利用zxing识别二维码

    C 利用zxing识别二维码 下载编译 配置使用 Win10 x64 VS2015 VS2019 下载编译 1 下载zxing包 并解压 下载地址 https github com glassechidna zxing cpp build文