该博客是基于Windows Visual Studio 15 X64的环境解码!本小白一枚,有不对或着讲解复杂的地方请多多指教!!!写该篇博客前参考很多博主的博客,零七八碎的,于是就整合出自己填坑的过程,参考博客众多,就不一一列举致谢,望包涵体谅!
目录
1.1 Visual Studio 15的下载与安装以及VAssistX插件的安装
1. Windows 10下环境的搭建
1.1 Visual Studio 15的下载与安装以及VAssistX插件的安装
Visual Studio Community 2015 简体中文免费版;下载VS2015镜像并进行安装,网上有很多安装教程,可以去参考如何安装。安装过程建议选择自定义模式---根据自己的需求进行安装;本人是选择典型安装的,在填坑的过程中遇到过Windows SDK问题,后来解决此问题需要把SDK的功能安装;在控制面板——>程序——>程序和功能中找到安装的VS2015主体,右击进行更改安装,如图1-1所示;
![](https://i-blog.csdnimg.cn/blog_migrate/ebd8e714884d21e10ed9e4e1b39c8681.png)
VAssistX番茄插件的安装,分享一个下载链接,提取码:f0zk 。关闭VS2015,安装VA_X_Setup2248_0.exe的过程就不再多赘述,网上很多教程。简述一下如图1-2所示;
![](https://i-blog.csdnimg.cn/blog_migrate/c88a3bd2b42a85e85d601068cecfe200.png)
Install即可 ;这里继续安利一个很好用的小工具,搜索工具Everything,网上下载安装即可。我们利用此工具能轻松找到我们安装工具软件的路径;如图1-3所示;右击打开路径,我们需要把网盘中的dll替换掉原本安装好的dll。
![](https://i-blog.csdnimg.cn/blog_migrate/8003c54534407acd41229909f9e9ea2f.png)
重启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所示;
![](https://i-blog.csdnimg.cn/blog_migrate/09696922860a1a5d2ab076e7ebe2292d.png)
2.2 zxing-cpp的编译过程
a、基于图2-1的文件路径下新建文件夹“build”。打开CMake进行编译操作,如图2-2所示;
![](https://i-blog.csdnimg.cn/blog_migrate/5492aaf78747b3ab95ad641837346d74.png)
步骤1:本人将解压的文件重命名为zxing-cpp,解压后的文件夹作为源代码路径;
步骤2:编译保存的文件夹,即新建的build文件夹;
步骤3:非常关键---选择编译环境,我的环境是VS2015, X64。如图2-3所示;操作步骤完成后如图2-4所示;
![](https://i-blog.csdnimg.cn/blog_migrate/66caf97409533a803469c784dad76f61.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5768d253b6e85648c1a27898dbbc477a.png)
图2-4显示的是配置完成操作!
步骤4:基于步骤3顺利完成,即可生成编译后的文件。
b、完成CMake操作打开build文件夹,会生成一个zxing.sln文件,如图2-5所示;
![](https://i-blog.csdnimg.cn/blog_migrate/8373d6edbad542fcc4f48480feffe3af.png)
我们直接用VS2015打开zxing.sln文件,进行模式配置,如图2-6所示;
![](https://i-blog.csdnimg.cn/blog_migrate/453c4b906f2f8fd5b320481b0dbf23a7.png)
c、解决方案生成后会在build文件夹下生成一个Debug文件夹,该文件夹下一个库文件;如图2-7所示;
![](https://i-blog.csdnimg.cn/blog_migrate/939d2c1427ba5b4f87aa2846e3e2fe99.png)
d、我们新建一个lib文件夹,将 libzxing-debug.lib放置到lib文件夹下;再在本机位置新建一个文件夹zxing,将lib文件夹 和 zxing-cpp\core\src目录下面的zxing文件夹拷贝出来,构成一个单独供C++调用的 zxing静态链接库,放置到zxing文件夹下。如图2-8所示
![](https://i-blog.csdnimg.cn/blog_migrate/8129de1ae5837e86c3f5bb5b6fb1fd28.png)
e、类似于OpenCV环境变量的配置,我们进行可以进行libzxing-debug.lib的环境变量配置
3. PDF417解码测试
3.1 配置PDF417测试工程文件
VS2015新建PDF417测试工程文件,在Debug x64的属性下配置libzxing-debug.lib和OpenCV的形成zxing-cv的属性表。
a、包含目录配置图3-1
![](https://i-blog.csdnimg.cn/blog_migrate/59b61105f0e915995ffaee5d06bc7599.png)
b、库目录配置图3-2
![](https://i-blog.csdnimg.cn/blog_migrate/651e0ad59af61330c67d58b3eda6d35a.png)
c、附加依赖项配置图3-3
![](https://i-blog.csdnimg.cn/blog_migrate/f93f160dec86a347414168099371bd47.png)
注:上述配置是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 width
int width = getWidth();
if (!row) {
// Create row
row = zxing::ArrayRef<char>(width);
}
// Get pointer to row
const char *p = cvImage.ptr<char>(y);
for (int x = 0; x < width; ++x, ++p) {
// Set row at index x
row[x] = *p;
}
return row;
}
zxing::ArrayRef<char> MatSource::getMatrix() const {
// Get width and height
int width = getWidth();
int height = getHeight();
// Create matrix
zxing::ArrayRef<char> matrix = zxing::ArrayRef<char>(width * height);
for (int y = 0; y < height; ++y) {
// Get pointer to row
const char *p = cvImage.ptr<char>(y);
// Calculate y offset
int yoffset = y * width;
for (int x = 0; x < width; ++x, ++p) {
// Set row at index x with y offset
matrix[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 结果展示
![](https://i-blog.csdnimg.cn/blog_migrate/746f2483d8f27fb7c65ef9c29762002d.png)
谢谢各位赏脸!哈哈哈哈哈