C++桌面端使用 zxing-cpp 和 opencv 生成二维码(带中间logo)

2023-11-06

一、环境工具准备

二、zxing-cpp 编译

1. 源码目录下新建build文件夹存放构建目录

在这里插入图片描述

2. 使用cmake编译源码

在这里插入图片描述

  1. 源码路径
  2. 构建目录
  3. 点击configure 选择 vs2019-》X64
  4. 点击Generate 在build目录下生成VS工程

在这里插入图片描述

  1. 用VS2019打开编译项目 生成lib库文件

build\core\Debug\ZXingCore.libbuild\core\Realse\ZXingCore.lib

三、创建测试项目

1. VS2019创建控制台项目 TestZXing

2. 配置项目环境

  1. 准备zxing-cpp 头文件和lib库
  • 新建includelib
  • zxing-cpp项目中找出头文件:BarcodeFormat.h BitMatrix.h ByteMatrix.h CharacterSet.h MultiFormatWriter.h stb_image.h stb_image_write.h TextUtfEncoding.h ZXConfig.h ZXStrConvWorkaround.h
  • zxing-cpp中拷贝出生成的lib库:build\core\Debug\ZXingCore.libbuild\core\Realse\ZXingCore.lib

在这里插入图片描述

  1. 准备opencv4.2.0 头文件、dll、lib

opencv4.2.0 开发环境这里不做记录,有兴趣网上查找
在这里插入图片描述

  1. 项目配置
  • 头文件包含目录:右键-》属性-》C/C+±》常规-》附加包含目录

在这里插入图片描述

  • lib库目录:右键-》属性-》链接器-》常规-》附加库目录

在这里插入图片描述

  • lib库:右键-》属性-》链接器-》输入-》附加依赖项

在这里插入图片描述

3. 编写测试代码

#include "BarcodeFormat.h"
#include "MultiFormatWriter.h"
#include "BitMatrix.h"
#include "ByteMatrix.h"
#include "TextUtfEncoding.h"
#include "ZXStrConvWorkaround.h"

#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <cctype>
#include <cstdlib>

#define STB_IMAGE_WRITE_IMPLEMENTATION
#include "stb_image_write.h"
using namespace ZXing;

#include<opencv2/opencv.hpp>  
using namespace cv;


static inline std::string GetExtension(const std::string& path)
{
	auto fileNameStart = path.find_last_of("/\\");
	auto fileName = fileNameStart == std::string::npos ? path : path.substr(fileNameStart + 1);
	auto extStart = fileName.find_last_of('.');
	auto ext = extStart == std::string::npos ? "" : fileName.substr(extStart + 1);
	std::transform(ext.begin(), ext.end(), ext.begin(), [](unsigned char c) { return std::tolower(c); });
	return ext;
}

static inline void AddLogoToQRCodeImage(const std::string pngPath, const std::string logoPath)
{
	Mat srcQRCode = imread(pngPath);
	Mat srcLogo = imread(logoPath);
	Mat imageRoi = srcQRCode(Rect(srcQRCode.cols / 2 - srcLogo.cols / 2, srcQRCode.rows / 2 - srcLogo.rows / 2, srcLogo.cols, srcLogo.rows));
	Mat mask = imread(logoPath, 0);
	srcLogo.copyTo(imageRoi, mask);

	imwrite(pngPath, srcQRCode);
}

int main(int argc, char* argv[])
{
	int width = 500, height = 500;
	int margin = 10;    //空白
	int eccLevel = 8;	//纠错级别
	std::string format = "QR_CODE";
	std::string text = " {\"data\" : \"www.baidu.com\",\"type\" : \"1\"} ";
	std::string filePath = "./QrCode.png";
	std::string logoPath = "./logo.png";
	try {
		auto barcodeFormat = BarcodeFormatFromString(format);
		if (barcodeFormat == BarcodeFormat::FORMAT_COUNT)
			throw std::invalid_argument("Unsupported format: " + format);

		MultiFormatWriter writer(barcodeFormat);
		if (margin >= 0)
			writer.setMargin(margin);
		if (eccLevel >= 0)
			writer.setEccLevel(eccLevel);

		auto bitmap = writer.encode(TextUtfEncoding::FromUtf8(text), width, height).toByteMatrix();

		auto ext = GetExtension(filePath);
		int success = 0;
		if (ext == "" || ext == "png") {
			success = stbi_write_png(filePath.c_str(), bitmap.width(), bitmap.height(), 1, bitmap.data(), 0);
		}
		else if (ext == "jpg" || ext == "jpeg") {
			success = stbi_write_jpg(filePath.c_str(), bitmap.width(), bitmap.height(), 1, bitmap.data(), 0);
		}

		if (!success) {
			std::cerr << "Failed to write image: " << filePath << std::endl;
			return -1;
		}
	}
	catch (const std::exception& e) {
		std::cerr << e.what() << std::endl;
		return -1;
	}

	AddLogoToQRCodeImage(filePath, logoPath);
	return 0;
}

四、完整源码

https://download.csdn.net/download/u011780419/87326616?spm=1001.2014.3001.5503

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

C++桌面端使用 zxing-cpp 和 opencv 生成二维码(带中间logo) 的相关文章

  • 删除文件的最后 10 个字符

    我想删除文件的最后 10 个字符 说一个字符串 hello i am a c learner 是文件内的数据 我只是希望该文件是 hello i am a 文件的最后 10 个字符 即字符串 c learner 应在文件内消除 解决方案 将
  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 如何从本机 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
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

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

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • echarts pie饼图既显示内部又显示外部指示线

    查了echarts 文档 并不能通过简单的配置来实现 原因如下 在单个serie的label中 只能设置一个label 位置可以选择在饼图内部inner 或者饼图外部outer 无法实现同时实现内部 外部显示 想到设置两个serie 让两个
  • Java三部曲(二)JavaWeb

    前言 1 什么是JavaWeb Web 全球广域网 也成为万维网 www 能通过浏览器访问的网站 JavaWeb 用Java开发网站的技术栈 2 本教程的基础框架 网页端 展现数据 HTML 制作页面 CSS 美化页面 JavaScript
  • matlab三维图形的绘制

    采用matlab进行三维图绘制 1 mesh函数 网格图 mesh x y z x是n维向量 y是m维向量 z是m n维向量 x 1 0 1 10 y 1 0 1 10 x y meshgrid x y z x 2 y 2 mesh x y
  • 十种排序算法概览

    十种排序算法概览 快速记忆表格 快速回忆各算法 01 冒泡排序 02 选择排序 03 插入排序 重点 04 希尔排序 05 归并排序 重点 06 快速排序 重点 07 堆排序 重点 08 计数排序 09 桶排序 10 基数排序 练习 本文旨
  • 跟我一起写 Makefile(一)

    跟我一起写 Makefile 陈皓 概述 什么是makefile 或许很多Winodws的程序员都不知道这个东西 因为那些Windows的IDE都为你做了这个工作 但我觉得要作一个好的和professional的程序员 makefile还是
  • 基于深度学习的YOLO目标检测研究-附Matlab代码

    目录 一 引言 二 YOLO的基本思想 三 实验验证 四 参考文献 五 Matlab代码获取 一 引言 目标检测是计算机视觉中的一个研究热点 在很多领域都有应用需求 例如监控安全 自动驾驶 交通监控和机器人视觉等场景 目标检测一般是检测一些
  • 华为OD机试真题2022Q4 A + 2023 B卷(JAVA&JS)

    华为机试题库已于5月10号由2022Q4 A卷 切换 为2023 B卷 各位同学如果收到的是A卷则刷下面的题 如果收到的是B卷则去B卷区刷题 B卷区地址 华为OD机试真题2023 B卷 JAVA JS 华为机试有三道题目 第一道和第二道属于
  • 论文笔记C3D:Learning Spatiotemporal Features with 3D Convolutional Networks

    思考 对视频进行描述 其描述子必须 1 具有普遍性以适应各种场景 2 必须短小紧凑 3 必须利于计算 4 必须易于实现 图像识别中 特征提取的很完备和优秀 但不适用于视频 本文致力于利用3D CNN提取时空特征 我们只用线性分类器来分类它们
  • JavaWeb——基础知识

    Java Web开发的基础内容 Servlet 增加了几个限制的Java类 所以开发一个Servlet并不复杂 然后就是把Servlet部署到web服务器上 Tomcat这个老人家现在身体依然硬朗 然后就等待客户的请求就可以了 Servle
  • 铁岭python培训班

    进入12月后 大部分学校2022的春招也开始收尾 家长们一定要抓紧最后的机会 不管是探校择校 还是插班入学 都要把握时间做好准备 还没确定孩子去哪所学校的家长们 小初高12月开放日 专场来了 今年最后1波开放日活动 包含校园参观 课程体验
  • OSError: [WinError 1455] 页面文件太小,无法完成操作。 Error loading “C:\ProgramData\Anaconda3\lib\site-packages\to

    完整报错OSError WinError 1455 页面文件太小 无法完成操作 Error loading C ProgramData Anaconda3 lib site packages torch lib shm dll or one
  • 为你精选107个本科软件工程专业的计算机毕业设计项目推荐

    当面对茫茫计算机毕业设计题目海洋 你是否感到无所适从 不知如何选出一个富有创新意义的题目 今天 我们将为大四的同学们分享一些毕业设计项目 希望能给你的毕业设计带来一些灵感 一 成品列表 以下所有springboot框架项目的源码博主已经打包
  • sql:mysql:截取某个字符 1.最后一次出现的之前的字符串 2.最后出现那次的之后的字符串

    截取某个字符最后一次出现 如 之前的字符串 示例字符串 我是 中国 人 select REVERSE 我是 中国 人 from dual 人 国中 是我 select INSTR REVERSE 我是 中国 人 1 from dual 2
  • [零刻]EQ12&EQ12Pro安装OpenWRT软路由教程

    OpenWRT系统安装 安装前准备 1 U盘一个 2 WePE写盘工具 3 Openwrt固件 4 Img镜像写盘工具 安装步骤 1 首先下载WePE写盘工具 制作一个PE系统安装环境 启动软件后 选择安装PE到U盘 2 插入U盘后 刷新一
  • jQuery 查找文本并高亮

    让我们来看一下如何使用 jQuery 去查找或搜索一段文本并高亮它 我是 jQuery 的忠实粉丝 喜欢它简介的语法 接下来让我演示一个示例 仅使用一行 jQuery 代码便可把搜索字段进行高亮
  • <HTML>简单登录页面代码

    这是一个简单的静态的html页面登录图片 之前写的 验证码方面没有搞懂 这里我重新参考了这里 但是部分功能还没有完善 仅供参考
  • 2023年全国硕士研究生入学统一考试英语(一)试题

    2023年全国硕士研究生入学统一考试英语 一 试题 Section I Use of Englis Directions Read the following text Choose the best word s for each num
  • 毕业论文找文献是个问题,我直接用python把全网文献爬了一遍,这波就很舒服

    文章目录 一 写在前面 二 准备工作 三 开始爬取 四 效果展示 一 写在前面 马上要毕业了兄弟们 毕业论文是个麻烦事 论文要的资料得一条一条去网上查看 那多浪费时间 咱直接写个爬虫 批量下载慢慢看 不舒服 二 准备工作 使用软件 Pyth
  • mysql char 和varchar的区别?

    char 和varchar的区别 1 char 一定会使用指定的空间 varchar是根据数据来定空间 2 char的插入数据效率理论上比varchar高 varchar是需要通过后面的记录数来计算 使用哪一种类型 如果确定数据一定是占指定
  • C++桌面端使用 zxing-cpp 和 opencv 生成二维码(带中间logo)

    一 环境工具准备 VS2019 Cmake zxing cpp 源代码 https gitee com asalmc zxing cpp opencv4 2 0 二 zxing cpp 编译 1 源码目录下新建build文件夹存放构建目录