欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

二维码生成利用qrencode库 + opencv + c++,顺便加个logo

程序员文章站 2024-03-18 19:50:28
...

二维码生成原理没有精力去研究,发现有可以用的*,就不重复造*了,站在巨人的肩膀上做事。参考了一大堆博客,忘记了他们的链接,没有能补上,抱歉。

需要用到的库:

1、opencv

2、qrencode,已经编译好了,下载:链接: https://pan.baidu.com/s/1_eUhkdEGvs9XiVNyy52DzA 提取码: w1xi

里面好像也有opencv编译好的库,没有就发邮件给我:aaa@qq.com

步骤:

1、直接调用:QRcode_encodeString,传入参数

QRcode * code = QRcode_encodeString(src.c_str(), 0, QR_ECLEVEL_H, QR_MODE_8, 1);

2、返回的数据用opencv生成图片,qrencode可以生成png图片,但是需要配置zlib,麻烦,直接opencv生成

for (int i = 0; i < code->width; ++i) {
		for (int j = 0; j < code->width; ++j)
		{
			img.at<uchar>(i, j) = (code->data[i*code->width + j] & 0x01) == 0x01 ? 0 : 255;
		}
	}

3、缩放生成的二维码,因为生成的比较小,需要放大,最后那个参数,选错了会很模糊

cv::resize(img, img, cv::Size(img.rows * 10, img.cols * 10),0,0, cv::INTER_NEAREST);

4、加白边框,其实就是放到一张比它大的图片上

	//白底
	result = 255 - result;
	//转换成彩色
	cv::cvtColor(result, result, cv::COLOR_GRAY2BGR);
	cv::cvtColor(img, img, cv::COLOR_GRAY2BGR);
	//建立roi
	cv::Rect roi_rect = cv::Rect((result.rows - img.rows) / 2, (result.cols - img.rows) / 2, img.cols, img.rows);
	//roi关联到目标图像,并把源图像复制到指定roi
	img.copyTo(result(roi_rect));

5、加logo,其它就是贴到它中心,因为选择生成的规格是高容错率的,所以加人小logo对扫码没有影响。

roi_rect = cv::Rect(result.cols/ 2- logo.cols/2, result.rows/2 - logo.rows / 2, logo.cols, logo.rows);
logo.copyTo(result(roi_rect));

#include <qrencode.h>
#include <iostream>
int main()
{

	cv::Mat logo = cv::imread("C:/Users/Administrator/source/repos/zbarcode/mini.png", cv::IMREAD_ANYCOLOR);
	if (logo.empty())
	{
		std::cout << "logo empty!\n";
		system("pause");
		return -1;
	}
	std::string src = "welcome to china,bbbbbbbbbbb";

	// 使用qrencode进行字符串编码
	QRcode * code = QRcode_encodeString(src.c_str(), 0, QR_ECLEVEL_H, QR_MODE_8, 1);
	if (code == NULL) {
		std::cout << "code = NULL" << std::endl;
		return -1;
	}

	cv::Mat img = cv::Mat(code->width, code->width, CV_8U);

	for (int i = 0; i < code->width; ++i) {
		for (int j = 0; j < code->width; ++j)
		{
			img.at<uchar>(i, j) = (code->data[i*code->width + j] & 0x01) == 0x01 ? 0 : 255;
		}
	}
	cv::resize(img, img, cv::Size(img.rows * 10, img.cols * 10),0,0, cv::INTER_NEAREST);
	
	cv::Mat result = cv::Mat::zeros(img.rows + 30, img.cols + 30, CV_8U);
	//白底
	result = 255 - result;
	//转换成彩色
	cv::cvtColor(result, result, cv::COLOR_GRAY2BGR);
	cv::cvtColor(img, img, cv::COLOR_GRAY2BGR);
	//建立roi
	cv::Rect roi_rect = cv::Rect((result.rows - img.rows) / 2, (result.cols - img.rows) / 2, img.cols, img.rows);
	//roi关联到目标图像,并把源图像复制到指定roi
	img.copyTo(result(roi_rect));

	
	roi_rect = cv::Rect(result.cols/ 2- logo.cols/2, result.rows/2 - logo.rows / 2, logo.cols, logo.rows);
	logo.copyTo(result(roi_rect));

	cv::imshow("code", result);
	cv::waitKey(0);
	system("pause");
	return 0;
}

生成的二维码

二维码生成利用qrencode库 + opencv + c++,顺便加个logo