opencv调用nu-book/zxing-cpp识别二维码
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了opencv调用nu-book/zxing-cpp识别二维码,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4612字,纯文字阅读大概需要7分钟。
内容图文
环境安装:
1. zxing-cpp 源码和源码编译后生成的lib,我的版本是V1.0.8,编译方法见:https://www.cnblogs.com/zhenjin-huaxiazongdai/p/12545959.html。zxing-cpp项目路径:https://github.com/nu-book/zxing-cpp
2. Visual Studio 2017安装https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/,安装完成后在 工具-获取工具和支持 中添加“使用C++的桌面开发”支持。
3.安装windows opencv并添加环境变量,例如我安装在 D:\opencv\opencv 文件夹中,添加环境变量 D:\opencv\opencv\build\x64\vc15\bin。观察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_lib\lib64 文件夹,打开 opencv 安装目录下的 build\x64\vc15\lib 文件夹,将 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_header\HybridBinarizer.h" #include "zxing_header\LuminanceSource.h" #include "zxing_header\GenericLuminanceSource.h" #include "zxing_header\DecodeHints.h" #include "zxing_header\BinaryBitmap.h" #include "zxing_header\ReadBarcode.h" #include "zxing_header\TextUtfEncoding.h" #include "zxing_header\MultiFormatReader.h" #include <opencv2\opencv.hpp> #include <opencv2\core\types_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(newchar[len + 1]); len = std::wcsrtombs(buff.get(), &data, len, &state); if (static_cast<size_t>(-1) != len) { str.assign(buff.get(), len); } } return str; } staticvoid 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(); return0; }
2. 搞一张二维码图片 test.PNG 放到编译输出目录 x64\Release 中。
四、启动
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:\cpp\ZxingDemo\ZxingDemo\ZxingDemo.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 环境变量 build\x64\vc15\bin(或者build\x64\vc14\bin)。关闭 Vs2017 重新打开项目。
原文:https://www.cnblogs.com/zhenjin-huaxiazongdai/p/12571824.html
内容总结
以上是互联网集市为您收集整理的opencv调用nu-book/zxing-cpp识别二维码全部内容,希望文章能够帮你解决opencv调用nu-book/zxing-cpp识别二维码所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。