0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用OpenCV与微信二维码引擎实现二维码识别

新机器视觉 ? 来源:稀土掘金 ? 作者:Tony沈哲 ? 2022-04-06 10:01 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

背景

今年自疫情以来,我都没有写过文章。一方面是疫情导致居家办公比较烦躁,另一方面最近有点懒了。但是工作还是要继续,趁这几天优化了一下最近的项目,我整理了一下如何使用 OpenCV 和微信二维码引擎来实现二维码的识别。

微信开源了其二维码的解码功能,并贡献给 OpenCV 社区。其开源的 wechat_qrcode 项目被收录到 OpenCV contrib 项目中。从 OpenCV 4.5.2 版本开始,就可以直接使用。
该项目 github 地址:

https://github.com/opencv/opencv_contrib/tree/master/modules/wechat_qrcode

模型文件的地址:

https://github.com/WeChatCV/opencv_3rdparty

微信的扫码引擎,很早就支持了远距离二维码检测、自动调焦定位、多码检测识别等功能,它是基于 CNN 的二维码检测。

9ee56f9e-afe3-11ec-aa7f-dac502259ad0.jpg

基于CNN的二维码检测器

二维码识别的封装

首先,定义一个 AlgoQrCode.h

#pragmaonce
#include
#include
usingnamespacecv;
usingnamespacestd;

classAlgoQRCode
{
private:
Ptrdetector;

public:
boolinitModel(stringmodelPath);

stringdetectQRCode(stringstrPath);

boolcompression(stringinputFileName,stringoutputFileName,intquality);

voidrelease();
};

该头文件定义了一些方法,包含了加载模型、识别二维码、释放资源等方法,以及一个 detector 对象用于识别二维码。
然后编写对应的源文件 AlgoQrCode.cpp

boolAlgoQRCode::initModel(stringmodelPath){
stringdetect_prototxt=modelPath+"detect.prototxt";
stringdetect_caffe_model=modelPath+"detect.caffemodel";
stringsr_prototxt=modelPath+"sr.prototxt";
stringsr_caffe_model=modelPath+"sr.caffemodel";
try
{
detector=makePtr(detect_prototxt,detect_caffe_model,sr_prototxt,sr_caffe_model);
}
catch(conststd::exception&e)
{
cout<endl;
returnfalse;
}

returntrue;
}

stringAlgoQRCode::detectQRCode(stringstrPath)
{
if(detector==NULL){
return"-1";
}

vectorvPoints;
vectorvStrDecoded;
MatimgInput=imread(strPath,IMREAD_GRAYSCALE);
//vStrDecoded=detector->detectAndDecode(imgInput,vPoints);
....
}

boolAlgoQRCode::compression(stringinputFileName,stringoutputFileName,intquality){
MatsrcImage=imread(inputFileName);

if(srcImage.data!=NULL)
{
vector<int>compression_params;
compression_params.push_back(IMWRITE_JPEG_QUALITY);
compression_params.push_back(quality);//图像压缩参数,该参数取值范围为0-100,数值越高,图像质量越高

boolbRet=imwrite(outputFileName,srcImage,compression_params);

returnbRet;
}

returnfalse;
}

voidAlgoQRCode::release(){
detector=NULL;
}

其中:initModel() 方法用于加载算法模型文件,必须先调用,并且只需要调用一次即可。模型文件

9ef8a3de-afe3-11ec-aa7f-dac502259ad0.jpg

detectQRCode() 方法需要根据业务场景,先对图像做很多预处理的工作,然后再进行二维码的识别。这些预处理的过程,不再本文的讨论范围之列,以后有机会单独写一篇文章。

compression() 方法用于压缩图像,因为我们使用工业相机拍摄,图片会很大大概30M+,所以在使用之前会先压缩一下。

release() 方法可以在程序结束时,释放 detector 对象。

识别二维码,其实就是调用 detector 对象的 detectAndDecode() 方法。

最后,写一个 main() 函数测试一下,是否可用:

9f0bb4e2-afe3-11ec-aa7f-dac502259ad0.jpg

intmain()
{
AlgoQRCodealgoQrCode=AlgoQRCode();
algoQrCode.initModel("/Users/tony/IdeaProjects/creative-mirror-watcher/mirror/src/main/resources/");
stringvalue=algoQrCode.detectQRCode("/Users/tony/20220216851652_compress.jpeg");
cout<<"value="<endl;
}

执行结果,识别二维码的内容:

value={
"osVersion":"iOS13.3",
"model":"苹果iPhoneX",
"ip":"10.184.17.170",
"port":10123
}

写到这里,基本上完成了二维码识别的封装,可以给上层平台编译对应的算法包了。
我们最终是需要使用 Java/Kotlin 在 Windows 平台上调用该 cv 程序。因为该项目是一款智能设备的上位机程序。所以还需要编写一个 jni 程序供 Java/Kotlin 调用,这个过程就不再阐述了。最后,将 cv 程序和 jni 相关的代码最终编译成一个 dll 文件,供上位机程序调用,实现最终的需求。

总结

其实,上述代码可以供各种平台使用,无论是移动端、桌面端、服务端。微信开源了一款非常快速的二维码引擎,节省了我们原先大量的工作。

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 二维码
    +关注

    关注

    7

    文章

    465

    浏览量

    27441
  • 开源
    +关注

    关注

    3

    文章

    3779

    浏览量

    44137
  • OpenCV
    +关注

    关注

    32

    文章

    648

    浏览量

    43275

原文标题:使用 OpenCV + 微信二维码引擎实现二维码识别

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    扫描条码模块、二维码模块,广泛应用于定制的手持设备

    模块为核心,凭借出色的一二维码识别、解码及传输能力,结合安卓系统的实时通讯优势,让条码扫描在更多领域实现了高效落地。扫描条码模块(也称条码识别
    的头像 发表于 08-18 15:18 ?24次阅读
    扫描条码模块、<b class='flag-5'>二维码</b>模块,广泛应用于定制的手持设备

    GM861条二维码识别模块用户手册

    GM861条二维码识别模块用户手册
    发表于 07-09 14:56 ?0次下载

    基于STM32的二维码识别源码+二维码解码库lib

    基于STM32的二维码识别源码+二维码解码库lib,推荐下载!
    发表于 05-28 22:04

    基于LockAI视觉识别模块:C++二维码识别

    二维码识别是视觉模块经常使用到的功能之一。我们将演示如何使用基于瑞芯RV1106的LockAI视觉识别模块进行二维码
    发表于 05-26 09:57

    基于LockAI视觉识别模块:C++二维码识别

    二维码识别是视觉模块经常使用到的功能之一。我们将演示如何使用基于瑞芯RV1106的LockAI视觉识别模块进行二维码
    的头像 发表于 05-26 09:42 ?369次阅读
    基于LockAI视觉<b class='flag-5'>识别</b>模块:C++<b class='flag-5'>二维码</b><b class='flag-5'>识别</b>

    基于STM32的二维码识别源码+二维码解码库lib

    基于STM32的二维码识别源码+二维码解码库lib项目实例下载! 纯分享帖,需要者可点击附件免费获取完整资料~~~【免责声明】本文系网络转载,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请第一时间告知,删除内
    发表于 05-23 20:45

    基于RK3576开发板的二维码识别算法

    了快速上手指南,包括源码管理、开发环境搭建、例程编译与运行等步骤,并详细介绍了二维码识别API的使用方法及调用示例。通过API函数qr_decode,用户可以轻松实现二维码
    的头像 发表于 05-10 09:25 ?545次阅读
    基于RK3576开发板的<b class='flag-5'>二维码</b><b class='flag-5'>识别</b>算法

    基于RV1126开发板实现二维码识别方案

    在RV1126上实现二维码识别方案
    的头像 发表于 04-11 14:48 ?321次阅读
    基于RV1126开发板<b class='flag-5'>实现</b><b class='flag-5'>二维码</b><b class='flag-5'>识别</b>方案

    二维码读取器是干嘛的

    二维码读取器(用于二维码读取的机器),作为一种现代化的自动识别技术设备,正日益渗透到我们生活的方方面面。从商场购物到物流配送,从医疗管理到工业生产线,二维码读取器凭借其高效、准确的读取
    的头像 发表于 03-17 15:57 ?516次阅读
    <b class='flag-5'>二维码</b>读取器是干嘛的

    一“”当先!看二维码模组如何重塑智能门锁扫体验

    在科技日新月异的今天,智能门锁正逐步取代传统机械锁,成为现代家庭安全防护的首选。在这场门锁智能化革命中,二维码模组以其独特的识别技术和便捷的操作方式,成为智能门锁的重要组成部分。本文将深入探讨二维码
    的头像 发表于 03-12 16:17 ?526次阅读
    一“<b class='flag-5'>码</b>”当先!看<b class='flag-5'>二维码</b>模组如何重塑智能门锁扫<b class='flag-5'>码</b>体验

    嵌入式二维码识别引擎是什么设备?哪些场景用得到?

    在科技日新月异的今天,嵌入式技术已广泛渗透到我们生活的方方面面,其中,嵌入式二维码识别引擎作为一种高效、便捷的信息采集工具,正逐渐成为众多行业智能化升级的重要推手。本文将带您深入探索二维码
    的头像 发表于 03-10 14:57 ?421次阅读
    嵌入式<b class='flag-5'>二维码</b><b class='flag-5'>识别</b><b class='flag-5'>引擎</b>是什么设备?哪些场景用得到?

    RS232接口的二维影像扫描引擎,广泛用在医疗设备上扫一二维码

    其稳定可靠的性能,成为连接医疗设备与二维码之间的桥梁。在医疗设备上,二维影像扫描引擎通过RS232接口与设备主体相连,实现了对一
    的头像 发表于 12-23 16:02 ?710次阅读
    RS232接口的<b class='flag-5'>二维</b>影像扫描<b class='flag-5'>引擎</b>,广泛用在医疗设备上扫一<b class='flag-5'>维</b><b class='flag-5'>二维码</b>

    工业视觉在条码/二维码识别领域的应用

    工业视觉技术在条码和二维码识别领域的应用日益广泛,它通过高精度的图像处理和识别算法,实现了对条码和二维码的快速、准确
    的头像 发表于 11-18 16:28 ?864次阅读
    工业视觉在条码/<b class='flag-5'>二维码</b><b class='flag-5'>识别</b>领域的应用

    二维码识读设备有哪些类型

    随着二维码应用的日益普及,各类二维码识读设备也应运而生。这些设备不仅极大地方便了我们的日常生活,也为企业提供了更加高效便捷的服务。那么,你知道二维码识读设备都有哪些类型吗?让我们一起来了解一下。据
    的头像 发表于 11-05 16:10 ?1088次阅读
    <b class='flag-5'>二维码</b>识读设备有哪些类型

    二维码扫描头设备嵌入到闸机上,实现扫手机屏幕完成签到签退

    如何嵌入到闸机上,实现扫手机屏幕完成签到签退的过程及其优势。一、二维码扫描头设备的嵌入技术二维码扫描头设备作为一种高效的信息采集工具,其核心技术在于快速、准确地读取并
    的头像 发表于 09-18 15:45 ?829次阅读
    <b class='flag-5'>二维码</b>扫描头设备嵌入到闸机上,<b class='flag-5'>实现</b>扫手机屏幕<b class='flag-5'>码</b>完成签到签退