二维条码 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 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 结果展示

result.png​​​​

 

谢谢各位赏脸!哈哈哈哈哈

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值