二维条码 PDF417 zxing-cpp解码详细过程
該博客是基于Windows Visual Studio 15 X64的環境解碼!本小白一枚,有不對或著講解復雜的地方請多多指教!!!寫該篇博客前參考很多博主的博客,零七八碎的,于是就整合出自己填坑的過程,參考博客眾多,就不一一列舉致謝,望包涵體諒!
目錄
1. Windows 10下環境的搭建
1.1 Visual Studio 15的下載與安裝以及VAssistX插件的安裝
1.2 CMake的下載與安裝
1.3 OpenCV的下載與安裝
2. zxing-cpp的編譯過程
2.1 zxing-cpp開源庫下載
2.2 zxing-cpp的編譯過程
3. PDF417解碼測試
3.1 配置PDF417測試工程文件
3.2 附加C++代碼
3.3 結果展示
1. Windows 10下環境的搭建
1.1 Visual Studio 15的下載與安裝以及VAssistX插件的安裝
Visual Studio Community 2015 簡體中文免費版;下載VS2015鏡像并進行安裝,網上有很多安裝教程,可以去參考如何安裝。安裝過程建議選擇自定義模式---根據自己的需求進行安裝;本人是選擇典型安裝的,在填坑的過程中遇到過Windows SDK問題,后來解決此問題需要把SDK的功能安裝;在控制面板——>程序——>程序和功能中找到安裝的VS2015主體,右擊進行更改安裝,如圖1-1所示;
圖1-1??
?VAssistX番茄插件的安裝,分享一個下載鏈接,提取碼:f0zk?。關閉VS2015,安裝VA_X_Setup2248_0.exe的過程就不再多贅述,網上很多教程。簡述一下如圖1-2所示;
圖1-2?
Install即可 ;這里繼續安利一個很好用的小工具,搜索工具Everything,網上下載安裝即可。我們利用此工具能輕松找到我們安裝工具軟件的路徑;如圖1-3所示;右擊打開路徑,我們需要把網盤中的dll替換掉原本安裝好的dll。
圖1-3?
重啟VS2015,檢查組件是否安裝成功。安裝成功后自行更改設置,作為推薦!
1.2 CMake的下載與安裝
CMake的安裝過程很簡單,CMake的官網可以下載!安裝過程中記得勾選將CMake添加到系統環境變量中。如果安裝時忘記勾選,安裝后找到CMake的安裝路徑,將其bin文件所在路徑添加到環境變量Path中。
1.3 OpenCV的下載與安裝
OpenCV官網可以直接download安裝包,一般下載最新的release版本;官網下載會比較慢,甚至可能比百度網盤還要慢,我個人分享一個鏈接供下載:https://pan.baidu.com/s/109x59O4N3c7TWMsyZwu1hg,提取碼:mgff。下載并進行安裝,安裝教程不多贅述,配置OpenCV的教程參考網上教程!
2. zxing-cpp的編譯過程
2.1 zxing-cpp開源庫下載
zxing-cpp是zxing的開源C++接口,可以直接從該作者的GitHub中下載壓縮包,進行解壓。如圖2-1所示;
圖2-1?
2.2 zxing-cpp的編譯過程
a、基于圖2-1的文件路徑下新建文件夾“build”。打開CMake進行編譯操作,如圖2-2所示;
圖2-2?
步驟1:本人將解壓的文件重命名為zxing-cpp,解壓后的文件夾作為源代碼路徑;
步驟2:編譯保存的文件夾,即新建的build文件夾;
步驟3:非常關鍵---選擇編譯環境,我的環境是VS2015, X64。如圖2-3所示;操作步驟完成后如圖2-4所示;
圖2-3 圖2-4?圖2-4顯示的是配置完成操作!
步驟4:基于步驟3順利完成,即可生成編譯后的文件。
b、完成CMake操作打開build文件夾,會生成一個zxing.sln文件,如圖2-5所示;
圖2-5?
我們直接用VS2015打開zxing.sln文件,進行模式配置,如圖2-6所示;
圖2-6?
?c、解決方案生成后會在build文件夾下生成一個Debug文件夾,該文件夾下一個庫文件;如圖2-7所示;
圖2-7?
?d、我們新建一個lib文件夾,將 libzxing-debug.lib放置到lib文件夾下;再在本機位置新建一個文件夾zxing,將lib文件夾?和 zxing-cpp\core\src目錄下面的zxing文件夾拷貝出來,構成一個單獨供C++調用的 zxing靜態鏈接庫,放置到zxing文件夾下。如圖2-8所示
圖2-8
?
e、類似于OpenCV環境變量的配置,我們進行可以進行libzxing-debug.lib的環境變量配置
3. PDF417解碼測試
3.1 配置PDF417測試工程文件
VS2015新建PDF417測試工程文件,在Debug x64的屬性下配置libzxing-debug.lib和OpenCV的形成zxing-cv的屬性表。
a、包含目錄配置圖3-1
圖3-1?
b、庫目錄配置圖3-2
圖3-2?
?c、附加依賴項配置圖3-3
圖3-3注:上述配置是Debug x64環境下的屬性配置,Debug環境下解碼速度比較慢,優化的話我們可以在zxing.sln生成工程文件時采用release x64的環境,這時生成的不是Debug文件夾,而是Release文件夾,其中包含libzxing.lib我們所需要的庫文件。在PDF417工程文件下配置選擇Release x64屬性,配置屬性表類似Debug x64一樣,只不過附加依賴項不需要opencv-world410d.lib。
3.2 附加C++代碼
/*MatSource.h*/#ifndef __MAT_SOURCE_H_ #define __MAT_SOURCE_H_#include <zxing\ZXing.h> #include <zxing\LuminanceSource.h> #include <opencv2\opencv.hpp> #include <opencv2/core/core.hpp>#include <string> #include <fstream> #include "zxing/LuminanceSource.h" #include "zxing/common/Counted.h" #include "zxing/Reader.h" #include <zxing/ReaderException.h> #include "zxing/aztec/AztecReader.h" #include "zxing/common/GlobalHistogramBinarizer.h" #include "zxing/DecodeHints.h" #include "zxing/MultiFormatReader.h" #include "zxing/pdf417/PDF417Reader.h"class MatSource : public zxing::LuminanceSource { private:cv::Mat cvImage;public:static zxing::Ref<zxing::LuminanceSource> create(cv::Mat & _cvImage);MatSource(cv::Mat & _cvImage);zxing::ArrayRef<char> getRow(int y, zxing::ArrayRef<char> row) const;zxing::ArrayRef<char> getMatrix() const;};#endif /* __MAT_SOURCE_H_ */#pragma once?
/*MatSource.cpp*/ #include "MatSource.h" #include <zxing/common/IllegalArgumentException.h>zxing::Ref<zxing::LuminanceSource> MatSource::create(cv::Mat & cvImage) {return zxing::Ref<LuminanceSource>(new MatSource(cvImage)); }MatSource::MatSource(cv::Mat & _cvImage) : zxing::LuminanceSource(_cvImage.cols, _cvImage.rows) {cvImage = _cvImage.clone(); }zxing::ArrayRef<char> MatSource::getRow(int y, zxing::ArrayRef<char> row) const {// Get widthint width = getWidth();if (!row) {// Create rowrow = zxing::ArrayRef<char>(width);}// Get pointer to rowconst char *p = cvImage.ptr<char>(y);for (int x = 0; x < width; ++x, ++p) {// Set row at index xrow[x] = *p;}return row;}zxing::ArrayRef<char> MatSource::getMatrix() const {// Get width and heightint width = getWidth();int height = getHeight();// Create matrixzxing::ArrayRef<char> matrix = zxing::ArrayRef<char>(width * height);for (int y = 0; y < height; ++y) {// Get pointer to rowconst char *p = cvImage.ptr<char>(y);// Calculate y offsetint yoffset = y * width;for (int x = 0; x < width; ++x, ++p) {// Set row at index x with y offsetmatrix[yoffset + x] = *p;}}return matrix;}?
/*pdf417Demo.cpp*/ #include "MatSource.h" #include <typeinfo> #include <opencv2\imgproc\types_c.h>int main() {std::string image_name ="C:\\Users\\vista\\Desktop\\PDF417_img\\3.jpg";cv::Mat matSrc = cv::imread(image_name, 1); // cv::rotate(matSrc, matSrc, cv::ROTATE_90_CLOCKWISE); // cv::Mat canvas; // cv::resize(matSrc, canvas, cv::Size(480 * matSrc.cols / matSrc.rows, 480));if (matSrc.empty()) {fprintf(stderr, "read image error: %s", image_name.c_str());return -1;}cv::imshow("test", matSrc);cv::waitKey(1);cv::Mat matGray;cv::cvtColor(matSrc, matGray, CV_BGR2GRAY);zxing::Ref<zxing::LuminanceSource> source = MatSource::create(matGray);int width = source->getWidth();int height = source->getHeight();fprintf(stderr, "image width: %d, height: %d\n", width, height);zxing::Ref<zxing::Reader> reader;reader.reset(new zxing::pdf417::PDF417Reader);try{zxing::Ref<zxing::Binarizer> binarizer(new zxing::GlobalHistogramBinarizer(source));zxing::Ref<zxing::BinaryBitmap> bitmap(new zxing::BinaryBitmap(binarizer));zxing::Ref<zxing::Result> result(reader->decode(bitmap, zxing::DecodeHints(zxing::DecodeHints::PDF_417_HINT)));std::string str = result->getText()->getText();fprintf(stdout, "recognization result: %s\n", str.c_str());}catch (const zxing::ReaderException& e){std::cerr << e.what() << " (ignoring)" << std::endl;}catch (const zxing::IllegalArgumentException& e) {std::cerr << e.what() << " (ignoring)" << std::endl;}catch (const zxing::Exception& e) {std::cerr << e.what() << " (ignoring)" << std::endl;}catch (const std::exception& e) {std::cerr << e.what() << " (ignoring)" << std::endl;}// cv::destroyWindow("test");system("pause");return 0;}?
3.3 結果展示
result.png?????
謝謝各位賞臉!哈哈哈哈哈
總結
以上是生活随笔為你收集整理的二维条码 PDF417 zxing-cpp解码详细过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 订阅内容解码失败(非base64码)_【
- 下一篇: 机器学习算法之 K-means、层次聚类