该博客是基于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 结果展示
Visual Studio Community 2015 简体中文免费版;下载VS2015镜像并进行安装,网上有很多安装教程,可以去参考如何安装。安装过程建议选择自定义模式---根据自己的需求进行安装;本人是选择典型安装的,在填坑的过程中遇到过Windows SDK问题,后来解决此问题需要把SDK的功能安装;在控制面板——>程序——>程序和功能中找到安装的VS2015主体,右击进行更改安装,如图1-1所示;
VAssistX番茄插件的安装,分享一个下载链接,提取码:f0zk 。关闭VS2015,安装VA_X_Setup2248_0.exe的过程就不再多赘述,网上很多教程。简述一下如图1-2所示;
Install即可 ;这里继续安利一个很好用的小工具,搜索工具Everything,网上下载安装即可。我们利用此工具能轻松找到我们安装工具软件的路径;如图1-3所示;右击打开路径,我们需要把网盘中的dll替换掉原本安装好的dll。
重启VS2015,检查组件是否安装成功。安装成功后自行更改设置,作为推荐!
CMake的安装过程很简单,CMake的官网可以下载!安装过程中记得勾选将CMake添加到系统环境变量中。如果安装时忘记勾选,安装后找到CMake的安装路径,将其bin文件所在路径添加到环境变量Path中。
OpenCV官网可以直接download安装包,一般下载最新的release版本;官网下载会比较慢,甚至可能比百度网盘还要慢,我个人分享一个链接供下载:https://pan.baidu.com/s/109x59O4N3c7TWMsyZwu1hg,提取码:mgff。下载并进行安装,安装教程不多赘述,配置OpenCV的教程参考网上教程!
zxing-cpp是zxing的开源C++接口,可以直接从该作者的GitHub中下载压缩包,进行解压。如图2-1所示;
a、基于图2-1的文件路径下新建文件夹“build”。打开CMake进行编译操作,如图2-2所示;
步骤1:本人将解压的文件重命名为zxing-cpp,解压后的文件夹作为源代码路径;
步骤2:编译保存的文件夹,即新建的build文件夹;
步骤3:非常关键---选择编译环境,我的环境是VS2015, X64。如图2-3所示;操作步骤完成后如图2-4所示;
图2-4显示的是配置完成操作!
步骤4:基于步骤3顺利完成,即可生成编译后的文件。
b、完成CMake操作打开build文件夹,会生成一个zxing.sln文件,如图2-5所示;
我们直接用VS2015打开zxing.sln文件,进行模式配置,如图2-6所示;
c、解决方案生成后会在build文件夹下生成一个Debug文件夹,该文件夹下一个库文件;如图2-7所示;
d、我们新建一个lib文件夹,将 libzxing-debug.lib放置到lib文件夹下;再在本机位置新建一个文件夹zxing,将lib文件夹 和 zxing-cpp\core\src目录下面的zxing文件夹拷贝出来,构成一个单独供C++调用的 zxing静态链接库,放置到zxing文件夹下。如图2-8所示
e、类似于OpenCV环境变量的配置,我们进行可以进行libzxing-debug.lib的环境变量配置
VS2015新建PDF417测试工程文件,在Debug x64的属性下配置libzxing-debug.lib和OpenCV的形成zxing-cv的属性表。
a、包含目录配置图3-1
b、库目录配置图3-2
c、附加依赖项配置图3-3
注:上述配置是Debug x64环境下的属性配置,Debug环境下解码速度比较慢,优化的话我们可以在zxing.sln生成工程文件时采用release x64的环境,这时生成的不是Debug文件夹,而是Release文件夹,其中包含libzxing.lib我们所需要的库文件。在PDF417工程文件下配置选择Release x64属性,配置属性表类似Debug x64一样,只不过附加依赖项不需要opencv-world410d.lib。
/*MatSource.h*/
#ifndef __MAT_SOURCE_H_
#define __MAT_SOURCE_H_
#include
#include
#include
#include
#include
#include
#include "zxing/LuminanceSource.h"
#include "zxing/common/Counted.h"
#include "zxing/Reader.h"
#include
#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 create(cv::Mat & _cvImage);
MatSource(cv::Mat & _cvImage);
zxing::ArrayRef getRow(int y, zxing::ArrayRef row) const;
zxing::ArrayRef getMatrix() const;
};
#endif /* __MAT_SOURCE_H_ */#pragma once
/*MatSource.cpp*/
#include "MatSource.h"
#include
zxing::Ref MatSource::create(cv::Mat & cvImage) {
return zxing::Ref(new MatSource(cvImage));
}
MatSource::MatSource(cv::Mat & _cvImage) : zxing::LuminanceSource(_cvImage.cols, _cvImage.rows) {
cvImage = _cvImage.clone();
}
zxing::ArrayRef MatSource::getRow(int y, zxing::ArrayRef row) const {
// Get width
int width = getWidth();
if (!row) {
// Create row
row = zxing::ArrayRef(width);
}
// Get pointer to row
const char *p = cvImage.ptr(y);
for (int x = 0; x < width; ++x, ++p) {
// Set row at index x
row[x] = *p;
}
return row;
}
zxing::ArrayRef MatSource::getMatrix() const {
// Get width and height
int width = getWidth();
int height = getHeight();
// Create matrix
zxing::ArrayRef matrix = zxing::ArrayRef(width * height);
for (int y = 0; y < height; ++y) {
// Get pointer to row
const char *p = cvImage.ptr(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
#include
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 source = MatSource::create(matGray);
int width = source->getWidth();
int height = source->getHeight();
fprintf(stderr, "image width: %d, height: %d\n", width, height);
zxing::Ref reader;
reader.reset(new zxing::pdf417::PDF417Reader);
try
{
zxing::Ref binarizer(new zxing::GlobalHistogramBinarizer(source));
zxing::Ref bitmap(new zxing::BinaryBitmap(binarizer));
zxing::Ref 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;
}
谢谢各位赏脸!哈哈哈哈哈