收录于专栏    

编译、使用微信二维码引擎

微信二维码引擎概述见“微信二维码引擎OpenCV开源!3行代码让你拥有微信扫码能力[1] ”。

一、编译

Rose已内置微信二维码引擎,编译出Rose也就编译出它了。这里的编译是基于Opencv官方建议方法,即Windows下CMake + Visual Studio。

编译需要同时下载opencvopencv_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.ziphttps://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.ziphttps://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位为例)

  1. https://raw.githubusercontent.com/opencv/opencv_3rdparty/a56b6ac6f030c312b2dce17430eef13aed9af274/ippicv/ippicv_2020_win_ia32_20191018_general.zip,下载ippicv_2020_win_ia32_20191018_general.zip。
  2. (可选)计算ippicv_2020_win_ia32_20191018_general.zip的MD5值,值应该是cd39bdf0c2e1cac9a61101dad7a2413e。要计算MD5,Windows可下载个叫“hasher.exe”的小软件。
  3. 修改文件名为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版本。

参考

  1. 微信二维码引擎OpenCV开源!3行代码让你拥有微信扫码能力 https://zhuanlan.zhihu.com/p/348412200
  2. 微信二维码引擎OpenCV开源研究 https://www.cnblogs.com/jsxyhelu/p/14390171.html

全部评论: 0

    写评论: