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<< e.what() << 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

    文章

    401

    浏览量

    26311
  • 开源
    +关注

    关注

    3

    文章

    3162

    浏览量

    42136
  • OpenCV
    +关注

    关注

    29

    文章

    622

    浏览量

    41124

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    工业二维码扫描设备如何助力流水线生产?

    工业二维码扫描设备被广泛应用于现代工厂的流水线作业中,它们能够高效、准确地读取移动中的二维码。这些扫器通常被设计为固定式或手持式,以适应不同的生产环境和需求。固定式扫器安装在特定位
    的头像 发表于 08-12 14:56 159次阅读
    工业<b class='flag-5'>二维码</b>扫描设备如何助力流水线生产?

    如何为柜式终端设备选配(集成)二维码模块?

    的设计与升级过程中,集成高性能的二维码模块是提升用户体验、优化业务流程的关键一环。首要考虑的是功能需求匹配,根据具体应用场景,甄选既能读取传统二维码又能识别屏幕
    的头像 发表于 08-05 15:48 146次阅读
    如何为柜式终端设备选配(集成)<b class='flag-5'>二维码</b>模块?

    Labview生成二维码

     Labview 的一个Demo,生成二维码
    发表于 08-01 17:12 5次下载

    二维码器/二维码读取设备嵌入园区闸机系统中的应用

    二维码阅读设备集成至闸机系统中,主要功能是通过扫描用户的二维码通行证来实施园区出入口的自动收费。此技术凭借二维码的便利性及扫描设备的高效性,极大地提高了收费效率和精确度,减少了由于人为错误
    的头像 发表于 06-05 14:46 217次阅读
    <b class='flag-5'>二维码</b>扫<b class='flag-5'>码</b>器/<b class='flag-5'>二维码</b>读取设备嵌入园区闸机系统中的应用

    二维码模块嵌入到电梯设备里

    二维码模块在电梯设备中的应用1.二维码模块的基本介绍二维码模块是一种基于自动
    的头像 发表于 05-08 10:40 257次阅读
    <b class='flag-5'>二维码</b>扫<b class='flag-5'>码</b>模块嵌入到电梯设备里

    怎么在Framewin里显示二维码

    各位前辈好,刚刚开始使用STemWin。现在一个Framewin里显示二维码,在Framewin初始化里调用二维码函数没有反应。请问需要怎么调用?
    发表于 04-16 08:27

    远距离二维码扫描器如何选择?看看以下三款远距离二维码模块

    随着二维码相关技术及硬件的普及与低成本化,二维条码扫描设备的应用被人们广为熟知,应用的行业也众多。然而,在某些场景中,由于需要远距离扫描二维码(条码远距离识别),传统的扫
    的头像 发表于 03-21 15:41 564次阅读
    远距离<b class='flag-5'>二维码</b>扫描器如何选择?看看以下三款远距离<b class='flag-5'>二维码</b>扫<b class='flag-5'>码</b>模块

    闸机安装二维码识别器轻松解决访客预约通行难题

    在景区、学校、企业办公楼等入口处随处可见的二维码访客人行通道闸机,是一种依托于二维码识别技术的通行方式,即在门禁或通道闸机上安装专用的二维码识别
    的头像 发表于 03-11 13:53 374次阅读
    闸机安装<b class='flag-5'>二维码</b><b class='flag-5'>识别</b>器轻松解决访客预约通行难题

    Labview调用Halcon识别二维码

    Labview调用Halcon识别二维码 可一次识别多个二维码 使用Labview 2020编辑,halcon的版本是 19.11,32位
    发表于 02-21 16:31

    怎样快速选择二维码扫描仪模组

    二维码扫描仪模组的应用需求场景很多,除了我们生活中比较常见的支付场景,如在智慧交通的车载二维码收费、自动售卖及金融类POS等在内的各种嵌入集成应用中,内置的硬解码扫窗上都配置有这种类型的二维
    的头像 发表于 01-11 14:30 317次阅读
    怎样快速选择<b class='flag-5'>二维码</b>扫描仪模组

    虹科分享 | AR世界揭秘:从二维码的起源到数据识别与位姿技术的奇妙融合!

    引言:探索AR的神奇世界,我们将从二维码的诞生谈起。在这个科技的海洋中,二维码是如何帮助AR实现数据获取与位姿识别的呢?让我们一起揭开这层神秘的面纱! 一、
    的头像 发表于 11-26 18:40 460次阅读
    虹科分享 | AR世界揭秘:从<b class='flag-5'>二维码</b>的起源到数据<b class='flag-5'>识别</b>与位姿技术的奇妙融合!

    为什么很多自助设备要嵌入二维码模块?一二维以及长距离扫描头

    起到了积极的作用。因此,在自助设备领域,使用高性能、低成本的二维码模块及其解决方案,可以极大地提高企业运营效率,增强企业竞争力。基于近距离扫识别应用的
    的头像 发表于 11-21 15:05 465次阅读
    为什么很多自助设备要嵌入<b class='flag-5'>二维码</b>扫<b class='flag-5'>码</b>模块?一<b class='flag-5'>维</b><b class='flag-5'>二维</b>以及长距离扫描头

    二维码扫描器模块 嵌入式扫模块价格

    二维码扫描器模块就是具有二维码解码功能的嵌入式扫模块,它的作用是以命令触发或感应触发的方式快速扫描一二维码,也就是说当“
    的头像 发表于 10-23 14:37 2742次阅读
    <b class='flag-5'>二维码</b>扫描器模块 嵌入式扫<b class='flag-5'>码</b>模块价格

    哪款二维码模块适合嵌入智能快递柜?二维码扫描模组模块推荐

    作为现代化的物流服务设施,智能快递柜的使用愈发普遍。为了提供更便捷和高效的服务体验,许多快递柜生产厂商甚至配备了二维码扫描模组模块来提升用户的取件体验和操作便利性。在安装嵌入了二维码模块后,智能
    的头像 发表于 10-19 11:21 797次阅读
    哪款<b class='flag-5'>二维码</b>扫<b class='flag-5'>码</b>模块适合嵌入智能快递柜?<b class='flag-5'>二维码</b>扫描模组模块推荐