c/c++语言开发共享opencv调用nu-book/zxing-cpp识别二维码

环境安装: 1. zxing-cpp 源码和源码编译后生成的lib,我的版本是V1.0.8,编译方法见:https://www.cnblogs.com/zhenjin-huaxiazongdai/p/12545959.html。zxing-cpp项目路径:https://github.com/nu- …

环境安装:

1.  zxing-cpp 源码和源码编译后生成的lib,我的版本是v1.0.8,编译方法见:。zxing-cpp项目路径:

2. visual studio 2017安装,安装完成后在 工具-获取工具和支持 中添加“使用c++的桌面开发”支持。

3.安装windows opencv并添加环境变量,例如我安装在 d:opencvopencv 文件夹中,添加环境变量  d:opencvopencvbuildx64vc15bin。观察opencv文件夹我们也可以知道,opencv默认只支持x64,x86需要自己下载源码编译。我安装的版本是 4.1.2 ,下载路径:

demo地址:https://github.com/sourcecode-farmer/zxingdemo

 

过程记录:

一、 添加依赖

1. 新建visual c++ windows控制台应用程序 zxingdemo,打开项目文件夹有如下文件:

2. 打开opencv 安装目录下的 build 文件夹,复制 include 文件夹到 zxingdemo 项目文件夹中,重命名为opencv_header.

3. 在 zxingdemo 项目文件夹中新建 opencv_liblib64 文件夹,打开 opencv 安装目录下的 buildx64vc15lib 文件夹,将 opencv_world412.lib 和 opencv_world412d.lib 两个文件复制到 zxingdemo 项目文件夹中(如果 lib 文件名称有变化,请将所有 lib 文件一股脑复制过来即可)。

4. 在 zxingdemo 项目文件夹中新建文件夹 zxing_lib ,复制 zxing-cpp 编译后的 lib 到文件夹中(注意 zxing-cpp 和 zxingdemo 编译时的解决方案配置、解决方案平台必须一致)。

5. 打开 zxing-cpp 源码中的 core 文件夹,复制 src 到 zxingdemo 项目目录中,重命名文件夹为 zxing_header。

6. 打开 zxing_header 文件夹,删除当前目录及其子目录中的所有cpp文件。

ps:如果只做 qr 码识别,可以删除目录 aztec、maxicode、oned、pdf417 和 textcodec,保留 zxing_header 下 h 文件和 datamatrix 、 qrcode文件下h文件。

ps:修改文件分组依据,可以以快速删除 cpp 文件

 

二、 配置依赖

1. vs 项目右键属性,调整配置为 release,调整平台为 x64.

2. 属性 – 配置属性 – c/c++ – 常规 – 附加包含目录 ,添加头文件路径(图片路径按实际做调整,依葫芦画瓢)。

3. 属性 – 配置属性 – 链接器 – 常规 – 附加库目录,添加 lib 库目录(图片路径按实际做调整,依葫芦画瓢)。

4.属性 – 配置属性 – 链接器 – 常规 – 附加依赖项,添加 zxingdemo 项目中所有的 lib 文件名称(根据 lib 文件实际名称调整)。

 

三、编码

1.在 zxingdemo.cpp 文件中编写代码。

//按项目实际路径调整  #pragma comment(lib,"zxing_lib/zxingcore.lib")    #include "stdafx.h"    #include "zxing_headerhybridbinarizer.h"  #include "zxing_headerluminancesource.h"  #include "zxing_headergenericluminancesource.h"  #include "zxing_headerdecodehints.h"  #include "zxing_headerbinarybitmap.h"  #include "zxing_headerreadbarcode.h"  #include "zxing_headertextutfencoding.h"  #include "zxing_headermultiformatreader.h"    #include <opencv2opencv.hpp>  #include <opencv2coretypes_c.h>      static std::string wstringtostring(const std::wstring &wstr) {      std::string str;      std::mbstate_t state = {};      const wchar_t *data = wstr.data();      size_t len = std::wcsrtombs(nullptr, &data, 0, &state);      if (static_cast<size_t>(-1) != len) {          std::unique_ptr<char[]> buff(new char[len + 1]);          len = std::wcsrtombs(buff.get(), &data, len, &state);          if (static_cast<size_t>(-1) != len) {              str.assign(buff.get(), len);          }      }      return str;  }    static void scan() {      cv::mat mat, gray_mat;      //打开图片      mat = cv::imread("test.png");      if (mat.empty()) {          std::cout << "not found image" << std::endl;          return;      }      //转为灰度图      cv::cvtcolor(mat, gray_mat, cv::color_rgba2gray);      //宽高      int height = gray_mat.rows;      int width = gray_mat.cols;      auto *pixels = new unsigned char[height * width];      int index = 0;      for (int i = 0; i < height; i++) {          for (int j = 0; j < width; j++) {              pixels[index++] = gray_mat.at<unsigned char>(i, j);          }      }      //识别      std::shared_ptr<zxing::genericluminancesource> luminance = std::make_shared<zxing::genericluminancesource>(0, 0, width, height, pixels, width * sizeof(unsigned char));      std::shared_ptr<zxing::binarybitmap> bitmap = std::make_shared<zxing::hybridbinarizer>(luminance);      zxing::decodehints hints;      //根据需要添加format      std::vector<zxing::barcodeformat> formats = { zxing::barcodeformat(zxing::barcodeformat::qr_code) };      hints.setpossibleformats(formats);      auto reader = new zxing::multiformatreader(hints);      zxing::result result = reader->read(*bitmap);      if (result.status() == zxing::decodestatus::noerror) {          //识别成功,打印结果          std::cout << wstringtostring(result.text()) << std::endl;      }      else {          std::cout << "fail" << std::endl;      }  }    int main()  {      scan();      std::cin.get();      return 0;  }

 

2. 搞一张二维码图片 test.png 放到编译输出目录 x64release 中。

 

四、启动

1. 调整配置为 release,调整平台为 x64,点击”本地windows调试器”启动测试。

2.成功输出结果。

五、常见问题

1. 编译异常:错误    c4996    ‘wcsrtombs’: this function or variable may be unsafe. consider using wcsrtombs_s instead. to disable deprecation, use _crt_secure_no_warnings. see online help for details.    zxingdemo    h:cppzxingdemozxingdemozxingdemo.cpp    23   

解决方法:右键项目属性 – 配置属性 – c/c++ – 预处理器 – 预处理器定义,添加如下预处理定义。

_crt_secure_no_warnings  _crt_nonstdc_no_warnings  _crt_secure_no_warnings_globals

2. 执行异常,启动测试后报错:无法启动此程序,因为计算机中丢失 opencv_world412.dll。尝试重新安装该程序已解决此问题。

原因:程序找不到opencv_world412.dll,一般情况:1.没安装 opencv 或者没有添加 opencv 环境变量 2.打开 vs2017 后才添加 opencv 环境变量,未生效。

解决:安装 opencv ,添加 path 环境变量 buildx64vc15bin(或者buildx64vc14bin)。关闭 vs2017 重新打开项目。

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/600064.html

(0)
上一篇 2021年5月9日
下一篇 2021年5月9日

精彩推荐