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-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 ,下載路徑:

image

Demo地址https://github.com/SourceCode-Farmer/ZxingDemo

 

過程記錄:

一、 添加依賴

1. 新建Visual C++ Windows控制台應用程序 ZxingDemo,打開項目文件夾有如下文件:

image

2. 打開opencv 安裝目錄下的 build 文件夾,復制 include 文件夾到 ZxingDemo 項目文件夾中,重命名為opencv_header.

image

3. 在 ZxingDemo 項目文件夾中新建 opencv_lib\lib64 文件夾,打開 opencv 安裝目錄下的 build\x64\vc15\lib 文件夾,將 opencv_world412.lib 和 opencv_world412d.lib 兩個文件復制到 ZxingDemo 項目文件夾中(如果 lib 文件名稱有變化,請將所有 lib 文件一股腦復制過來即可)。

image

4. 在 ZxingDemo 項目文件夾中新建文件夾 zxing_lib ,復制 zxing-cpp 編譯后的 lib 到文件夾中(注意 Zxing-cpp 和 ZxingDemo 編譯時的解決方案配置、解決方案平台必須一致)。

image

5. 打開 zxing-cpp 源碼中的 core 文件夾,復制 src 到 ZxingDemo 項目目錄中,重命名文件夾為 zxing_header。

image

6. 打開 zxing_header 文件夾,刪除當前目錄及其子目錄中的所有cpp文件。

ps:如果只做 Qr 碼識別,可以刪除目錄 aztec、maxicode、oned、pdf417 和 textcodec,保留 zxing_header 下 h 文件和 datamatrix 、 qrcode文件下h文件。

ps:修改文件分組依據,可以以快速刪除 cpp 文件

image

 

二、 配置依賴

1. vs 項目右鍵屬性,調整配置為 Release,調整平台為 x64.

image

2. 屬性 - 配置屬性 - c/c++ - 常規 - 附加包含目錄 ,添加頭文件路徑(圖片路徑按實際做調整,依葫蘆畫瓢)。

image

3. 屬性 - 配置屬性 - 鏈接器 - 常規 - 附加庫目錄,添加 lib 庫目錄(圖片路徑按實際做調整,依葫蘆畫瓢)。

image

4.屬性 - 配置屬性 - 鏈接器 - 常規 - 附加依賴項,添加 ZxingDemo 項目中所有的 lib 文件名稱(根據 lib 文件實際名稱調整)。

image

 

三、編碼

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(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調試器”啟動測試。

image

2.成功輸出結果。

image

五、常見問題

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   
image

解決方法:右鍵項目屬性 - 配置屬性 – c/c++ - 預處理器 - 預處理器定義,添加如下預處理定義。

_CRT_SECURE_NO_WARNINGS
_CRT_NONSTDC_NO_WARNINGS
_CRT_SECURE_NO_WARNINGS_GLOBALS

image

2. 執行異常,啟動測試后報錯:無法啟動此程序,因為計算機中丟失 opencv_world412.dll。嘗試重新安裝該程序已解決此問題。

image

原因:程序找不到opencv_world412.dll,一般情況:1.沒安裝 opencv 或者沒有添加 opencv 環境變量 2.打開 vs2017 后才添加 opencv 環境變量,未生效。

解決:安裝 opencv ,添加 Path 環境變量 build\x64\vc15\bin(或者build\x64\vc14\bin)。關閉 Vs2017 重新打開項目。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM