导读
用过二维码识别的小伙伴们都知道,微信的二维码识别确实要比开源的二维码识别zxing
和zbar
要强不少,zxing和zbar对小的二维码以及模糊的二维码基本上是识别不出来的,有时候一张包含二维码的图片可能你缩放一下就可能导致识别不出来,而微信的二维码识别不仅可以远距离识别
还可以识别各个拍照角度
以及模糊的二维码
。
腾讯的WeChatCV
团队最近开源了微信的二维码识别模型,并将这个功能添加到了opencv_contrib中,只需要简单的三行代码即可完成调用
,这篇文章就来教大家如何使用
微信的二维码识别引擎解析
微信的二维码识别能力如此强劲,主要依赖两个模块,二维码检测
和二维码增强
- 二维码检测
随着深度学习的发展,以及移动端设备性能的提升,给深度学习的应用提供了更好的平台。微信的二维码检测基于SSD目标检测
框架来实现的,以便支持小的二维码检测、模糊的二维码检测。
- 二维码增强
二维码增强是依赖于图像超分辨率
实现,将小的和模糊的二维码处理成清晰的二维码,以便于后面更好地识别二维码。
微信二维码识别引擎的使用
WeChatCV团队已经将开源的二维码识别功能嵌入到opencv_contrib中,目前opencv官方提供的release版本还没有嵌入微信二维码识别功能,所以大家需要将自己重新编译OpenCV,我有编译好的基于Windows的库,有需要的可以私信我。
opencv git地址:https://github.com/opencv/opencv
- OpenCV的编译
git上提供了比较详细的编译介绍,大家可以参考上面的步骤自己进行编译,Windows需要借助于cmake
和vs
或者mingw64
来进行编译,详细步骤可以百度,不过需要注意的时候,在添加opencv_contrib时不要勾选OPENCV_ENABLE_NONFREE否则后面可能会出现编译错误的问题。
编译opencv的时候可以勾选BUILD_OPENCV_world
这样编译出来的库就只会有一个opencv_world451.lib
,如果你不需要集成,就不用去勾选它默认是不勾选的。
注意
:这个编译只是编译了c++版本的库,如果你想编译Python版本的,需要改opencv-python的代码。
- 环境配置
编译好opencv
之后,打开vs,新建一个c++项目,然后配置好OpenCV的环境即可。
- 测试代码
#include <iostream>
#include <string>
#include<opencv2/core/core.hpp>
#include<opencv2/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/wechat_qrcode.hpp>using namespace cv;
using namespace std;int main()
{const std::string detector_prototxt_path = "D:\\opencv\\source_code\\build_vs2019_world\\downloads\\wechat_qrcode\\detect.prototxt";const std::string detector_caffe_model_path = "D:\\opencv\\source_code\\build_vs2019_world\\downloads\\wechat_qrcode\\detect.caffemodel";const std::string super_resolution_prototxt_path = "D:\\opencv\\source_code\\build_vs2019_world\\downloads\\wechat_qrcode\\sr.prototxt";const std::string super_resolution_caffe_model_path = "D:\\opencv\\source_code\\build_vs2019_world\\downloads\\wechat_qrcode\\sr.caffemodel";wechat_qrcode::WeChatQRCode weChatQR;weChatQR = wechat_qrcode::WeChatQRCode(detector_prototxt_path,detector_caffe_model_path,super_resolution_prototxt_path,super_resolution_caffe_model_path);Mat img;img = imread("../imgs/code.png");if (!img.empty()) {vector<Mat> qrcode_box;vector<std::string> recon_res = weChatQR.detectAndDecode(img, qrcode_box);for (int i = 0; i < recon_res.size(); i++) {int min_x = (int)qrcode_box[i].at<float>(0);int min_y = (int)qrcode_box[i].at<float>(1);int max_x = (int)qrcode_box[i].at<float>(4);int max_y = (int)qrcode_box[i].at<float>(5);cv::Rect box = cv::Rect(min_x, min_y, max_x - min_x, max_y - min_y);cv::rectangle(img, box, cv::Scalar(0, 255, 0), 2);cv::putText(img,recon_res[i],cv::Point(min_x,min_y-10), cv::FONT_HERSHEY_COMPLEX,1, cv::Scalar(0,0,255),2,2);}cv::imshow("draw_qrcode", img);cv::waitKey(0);}}
资源下载:我已经上传到CSDN上面,大家可以去CSDN资源下载
模型文件下载地址:https://github.com/WeChatCV/opencv_3rdparty