opencv contrib模块 示例 WeChat qrcode微信二维码检测解码

在opencv 4.5.3 的 contrib中, 腾讯WeChatCV团队贡献了wechat_qrcode模块,3行代码即可在opencv中实现微信的扫码功能。

文档链接为https://docs.opencv.org/4.x/d5/d04/classcv_1_1wechat__qrcode_1_1WeChatQRCode.html

微信扫码引擎是一款基于开源引擎ZXing,并高度优化和深度改造的高性能轻量二维码识别器。

1、接口、模型说明

Wechat QRCode 使用2个CNN模型,一个用于检测二维码的的包围框bounding box,另一个用于在二维码较小或有变形时的超分辨率重建。

1.1、接口

构造函数简单,传入2个CNN模型的网络结构、模型权重文件的路径。这两个模型都是基于caffe框架的。

// 构造函数
cv::wechat_qrcode::WeChatQRCode::WeChatQRCode(	
	const std::string & detector_prototxt_path = "",            // 检测模型的prototxt
	const std::string & detector_caffe_model_path = "",         // 检测模型的model
	const std::string & super_resolution_prototxt_path = "",    // 超分辨率模型的prototxt
	const std::string & super_resolution_caffe_model_path = ""  // 超分辨率模型的model
)

成员函数只有一个,进行二维码的检测与解码。返回结果为每个二维码的解码的字符串列表,顺序对应可选输出的二维码包围框。

// 检测解码函数
std::vector<std::string> cv::wechat_qrcode::WeChatQRCode::detectAndDecode(
	InputArray 			img,				// 灰度图或彩色图
	OutputArrayOfArrays points = noArray()  // 可选的,保存检测到的所有二维码包围框bounding box
)	

1.2、模型

两个模型的下载地址为 https://github.com/WeChatCV/opencv_3rdparty

(1)二维码检测

“一图多码”是扫码支付经常遇到的线下场景。早在2016年,微信扫码引擎在业内率先支持远距离二维码检测、自动调焦定位、多码检测识别。然而,传统方法需要牺牲40%以上的性能来支持多码的检测与识别。伴随着深度学习技术的成熟和移动端计算能力的提升,微信扫码引擎引入基于CNN的二维码检测器解决上述问题。
在这里插入图片描述
以SSD框架为基础,构造了短小精干的二维码检测器,采用残差连接(Residual Concat)、深度卷积(Depthwise Convolution)、空洞卷积(DilatedConvolution)、卷积投影(Convolution Projection)等技术进行了针对性的优化。整个模型大小仅943KB,iPhone7(A10)单CPU的推理时间仅需20ms,很好地满足“低延时、小体积、高召回”的业务需求。

(2)基于CNN的二维码增强
“大图小码”是远距扫码和长按识码经常面临的难点,二维码增强技术可以让小码更加清晰。2014年,微信率先在对话中上线“识别图中二维码”能力,离不开增强技术的加持。在长按识别的场景中,二维码图像经过用户的裁剪、压缩、转发,图像质量严重受损,分辨率急剧下降,边缘变得模糊不清,这给扫码引擎的识别带来了极大的挑战。
.
传统图像增强算法很难完美地解决以上问题,因此微信扫码引擎率先在识别流程中引入了基于深度学习的超分辨率技术。在网络结构上,密集连接(Dense Concat)、深度卷积(Depthwise Convolution)、反向卷积(Deconvolution)、残差学习(Residual Learning)等技术改善模型的性能;在目标函数上,针对二维码强边缘和二值化的特点,结合L2/L1损失、边界加权、二值约束设计了针对二维码的目标函数。经过精心的调优,超分辨率模型大小仅23KB,在iPhone7(A10)单CPU的推理时间仅需6ms(100x100超分200x200),完全满足移动端的应用需求。
在这里插入图片描述
部分内容摘自 opencv学堂。

2、测试示例

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>

using namespace std;
using namespace cv;

#include <opencv2/wechat_qrcode.hpp>
int main() 
{
	const std::string modelDir = R"(D:\opencv\opencv4.5.4\build_contrib\downloads\wechat_qrcode\)";
	 
	// 构造(使用异常捕获构造函数是否正常)
	wechat_qrcode::WeChatQRCode detector{
        modelDir + "detect.prototxt", 
        modelDir + "detect.caffemodel",
        modelDir + "sr.prototxt",     
        modelDir + "sr.caffemodel"
    };
    
    // 临时变量
    Mat img;
	vector<Mat> points;   // qrcode: Retangle, not RotatedBox
	
    auto camIdx = 0; 
    // auto camIdx = R"(C:\Users\wanggao\Desktop\qrconde_test.jpg)";
   
    VideoCapture cap(camIdx);
    while(cap.read(img)){
    	// 检测
       	auto res = detector->detectAndDecode(img, points); 
       	// 结果叠加
       	for(size_t idx = 0; idx < res.size(); idx ++){
			Point pt1 = points[idx].at<Point2f>(0);
			Point pt2 = points[idx].at<Point2f>(2);
	        Rect rect{pt1, pt2};
	        Point center = (pt1 + pt2) / 2;
			// 绘制矩形框
	        rectangle(img, rect, {0,0,255}, 2);
	        circle(img, center, rect.height / 15, {0,0,255}, -1);
			// 解码字符串
	        putText(img, res[idx], {pt1.x, pt2.y + 16}, 1, 1, {0,0,255});    
        }

		imshow("image", img);
		if (waitKey(30) >= 0)
			break;
    }
    return 0;
}

使用360浏览器打开任意网页,查看网站地址的二维码截图进行测试。下面是2个二维码的图片
在这里插入图片描述

对上图检测及解码的结果如下图所示:
在这里插入图片描述

  • 6
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
微信二维码是一种常用的二维码形式,用于快速扫描获取相关信息。Linux是一种开源的操作系统,拥有广泛的用户群体和开发者社区。OpenCV_contribOpenCV的一个开源扩展库,提供了更多的功能和算法。 在Linux操作系统上,可以使用OpenCV_contrib提供的功能来实现微信二维码的识别和解码。通过OpenCV_contrib,我们可以直接调用特定的函数和方法,利用OpenCV强大的图像处理和计算机视觉功能来解码和分析二维码。 为了在Linux上使用OpenCV_contrib,我们首先需要在我们的系统上安装OpenCVOpenCV_contrib扩展库。我们可以从官方网站上下载源代码,然后进行编译安装。一旦安装完成,我们就可以使用OpenCV_contrib提供的微信二维码识别功能了。 使用OpenCV_contrib进行微信二维码识别的过程大致如下:首先,我们需要获取一张包含微信二维码的图像。然后,我们将图像传递给OpenCV_contrib提供的特定函数,该函数将处理图像并尝试从中解码出二维码信息。最后,我们可以从函数的返回值中获取解码后的信息。 使用OpenCV_contrib进行微信二维码识别的过程需要一定的编程知识和经验。我们需要了解OpenCV的基本用法和函数调用方式,了解如何处理图像和二维码数据。另外,我们还可以根据实际需求自定义一些功能,如二维码定位、纠错等。 总之,通过在Linux操作系统上使用OpenCV_contrib,我们可以方便地实现微信二维码的识别和解码功能,为用户提供更好的使用体验和便利性。同时,开源和开放的特性也使得OpenCV_contrib可以吸引更多的开发者参与,共同推动算法和功能的发展和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aworkholic

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值