微信二维码引擎概述见“微信二维码引擎OpenCV开源!3行代码让你拥有微信扫码能力[1] ”。
一、编译
Rose已内置微信二维码引擎,编译出Rose也就编译出它了。这里的编译是基于Opencv官方建议方法,即Windows下CMake + Visual Studio。
编译需要同时下载opencv、opencv_contrib。为尽快确认编译是否正确、以及看到使用引擎扫码结果,还要下载opencv_extra。
Windows环境下,使用Cmake进行编译,总的来说是“两次Configue一次Generate"。第一次Configue是配置opencv包,第二次Configue则包括了contrib的opencv。过程中,可能出现各种问题。
1.1 ippicv下载超时
cmake编译OpenCV时经常因为ippicv而编译失败,IPPICV: Download failed: 28;"Timeout was reached"。OpenCV编译第三方库(3rdparty)用的是这么个逻辑:如果缓存(.cache)中有该文件,就直接使用缓存中文件,否则从“网上”下载,这个“网上”还是opencv,不是该第三方库的官网。具体到ippicv,以下是opencv4.5.1中相关参数。
缓存文件 | 下载URL | |
32位 | <opencv>/.cache/ippicv/cd39bdf0c2e1cac9a61101dad7a2413e-ippicv_2020_win_ia32_20191018_general.zip | https://raw.githubusercontent.com/opencv/opencv_3rdparty/a56b6ac6f030c312b2dce17430eef13aed9af274/ippicv/ippicv_2020_win_ia32_20191018_general.zip |
64位 | <opencv>/.cache/ippicv/879741a7946b814455eee6c6ffde2984-ippicv_2020_win_intel64_20191018_general.zip | https://raw.githubusercontent.com/opencv/opencv_3rdparty/a56b6ac6f030c312b2dce17430eef13aed9af274/ippicv/ippicv_2020_win_intel64_20191018_general.zip |
如何得到缓存文件名、下载URL,见ippicv.cmake。ocv_download用于向网络下载某个文件。
<opencv>/3rdparty/ippicv/ippicv.cmake ------------------------------ function(download_ippicv root_var) set(${root_var} "" PARENT_SCOPE) # Commit SHA in the opencv_3rdparty repo set(IPPICV_COMMIT "a56b6ac6f030c312b2dce17430eef13aed9af274") # Define actual ICV versions if(WIN32 AND NOT ARM) set(OPENCV_ICV_PLATFORM "windows") set(OPENCV_ICV_PACKAGE_SUBDIR "ippicv_win") if(X86_64) set(OPENCV_ICV_NAME "ippicv_2020_win_intel64_20191018_general.zip") set(OPENCV_ICV_HASH "879741a7946b814455eee6c6ffde2984") else() set(OPENCV_ICV_NAME "ippicv_2020_win_ia32_20191018_general.zip") set(OPENCV_ICV_HASH "cd39bdf0c2e1cac9a61101dad7a2413e") endif() endif() set(THE_ROOT "${OpenCV_BINARY_DIR}/3rdparty/ippicv") ocv_download(FILENAME ${OPENCV_ICV_NAME} HASH ${OPENCV_ICV_HASH} URL "${OPENCV_IPPICV_URL}" "$ENV{OPENCV_IPPICV_URL}" "https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}/ippicv/" DESTINATION_DIR "${THE_ROOT}" ID IPPICV STATUS res UNPACK RELATIVE_URL) endfunction()
解决办法(以32位为例)
- https://raw.githubusercontent.com/opencv/opencv_3rdparty/a56b6ac6f030c312b2dce17430eef13aed9af274/ippicv/ippicv_2020_win_ia32_20191018_general.zip,下载ippicv_2020_win_ia32_20191018_general.zip。
- (可选)计算ippicv_2020_win_ia32_20191018_general.zip的MD5值,值应该是cd39bdf0c2e1cac9a61101dad7a2413e。要计算MD5,Windows可下载个叫“hasher.exe”的小软件。
- 修改文件名为cd39bdf0c2e1cac9a61101dad7a2413e-ippicv_2020_win_ia32_20191018_general.zip,并复制到<opencv>/.cache/ippicv目录。
1.2 如何让同时编译opencv_contrib
第一次Configue成功后,配置opencv包就结束了。微信二维码引擎位在opencv_contrib中的wechat_qrcode。为让接下的“Generate”生成工程文件包括引擎模块,须第二次Configue。

在cmake搜索框中搜索“OPENCV_EXTRA_MODULES_PATH”,将其值选择为opencv_contrib文件夹中的modules文件夹。上图对应的opencv_contrib文件夹目录是C:/ddksample/opencv_contrib。同时要保证WITH_CUDA未被勾选。填写值时,切记要把目录分隔符写成“/”。要是用Windows默认的“\”,会报类似以下错误。
CMake Error at cmake/OpenCVModule.cmake:368 (_glob_locations): Syntax error in cmake code at c:/ddksample/opencv/cmake/OpenCVModule.cmake:368 when parsing string c:\ddksample\opencv_contrib\modules Invalid character escape '\d'.
1.3 下载微信二维码引擎须要的4个模型文件
类似ippicv,编译wechat_qrcode模块时会遇到下载失败,解决方法也是类似ippicv。通过查看<opencv_contrib>/modules/wechat_qrcode/CMakeLists.txt,可知要下载4个模型文件,以下是应该的结果。

再一次点击“Configure”,成功之后“Generate”,便可生成OpenCV.sln。
1.4 测试
编译哪个项目、及测试,参考“微信二维码引擎OpenCV开源研究[2] ,那里有图文,这里只写文字部分。
打开OpenCV.sln,“Build”——“Configuration Manager”。选中“INSTALL”(对应“CMakeTarges”中的“INSTALL”)。“Build”——“Build Solution”,编译结束后,<opencv>/out/目录下会生成install目录。
进一步,将opencv_extra解压出来的testdata目录放在install下,则可以开启Test测试。testdata存放测试二维码图片放在testdata\cv\qrcode。
回到Visual Studio,在“tests accuracy”下找到“opencv_test_wechat_qrcode”这个vcxproj,右击设置为启动,如果看到全绿回显,证明前面配置全部正确。
二、使用
使用微信二维码引擎有两种方法,一是使用caffe model,二是不使用。对一些场景,会发生使用model识别不出二维码,不用模型时却可以。对从摄像头输入、然后实时识别的应用,Rose强制使用model。原因是不用模型时,检测二维码阶段(WeChatQRCode::detect)会花去“很长”时间,这个时间到底多少,还往往不确定。
因为使用模型,这时要读取模型文件。对如何读取文件,微信二维码api是让app输入文件名作为参数,然后调用opencv提供的文件api。由于opencv文件api存在问题,像不能正确读写android assets中文件,Rose改为app传入已读出的模型文件,调用opencv dnn时,使用参数是缓存的dnn::readNetFromCaffe版本。
参考
- 微信二维码引擎OpenCV开源!3行代码让你拥有微信扫码能力 https://zhuanlan.zhihu.com/p/348412200
- 微信二维码引擎OpenCV开源研究 https://www.cnblogs.com/jsxyhelu/p/14390171.html