環境安裝:
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 =https://www.cnblogs.com/zhenjin-huaxiazongdai/p/ 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 放到編譯輸出目錄 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.uj5u.com/houduan/49345.html
標籤:C++
