win10 x64环境下利用vs2015编译zxing-cpp及利用zxing C++进行解码


在这里,我将介绍如何利用cmake, vs2015对zxing-cpp进行编译,并且利用zxing-cpp c++版本进行解码。我已经编译好了x64 vs2015环境下的zxing-cpp库,并给出了相应的解码demo,可以参考GitHub代码(其中zxing是已经编译好的库,可以直接配置使用,像配置opencv一样(但不需要动态链接库);demo是演示解码例程)。

CMake 安装与配置

CMake官网下载安装程序。直接安装CMake,但在安装的时候要记得勾选将CMake包含在电脑的环境变量中;如果安装时没有勾选,那也没关系,直接找到CMake的安装路径,将其bin文件所在路径添加到环境变量中(不懂的可以Google)。

zxing-cpp 下载与编译

  1. zxing-cpp是zxing开源库的C++接口,该作者也一直在维护该库。在这里直接clone zxing-cpp 到本地目录下面(如下图),得到下面的文件(初始是没有build文件夹)
    win10 x64环境下利用vs2015编译zxing-cpp及利用zxing C++进行解码
  2. 在zxing-cpp目录下建立build文件夹(也就是上图中的build文件夹),供CMake编译保存。如下图,分别选择两个相应的路径,在Configure中,一定要设置正确的编译器和机器位数(本文设置的是vs2015 v14和 x64), 千万不能忽略。 设置完成之后,直接Generate就ok了, 没问题的话都是done的状态。
    win10 x64环境下利用vs2015编译zxing-cpp及利用zxing C++进行解码
  3. CMake 完成编译之后,打开build文件夹,我们可以找到一个zxing.sln的文件,直接用vs2015打开。
    win10 x64环境下利用vs2015编译zxing-cpp及利用zxing C++进行解码
  4. 打开之后,在vs2015里面设置成debug x64模式,右键Solution ‘zxing’ 直接build即可。
    win10 x64环境下利用vs2015编译zxing-cpp及利用zxing C++进行解码
  5. 工程建立完毕之后,会在build文件夹下面,生成Debug的文件夹,如下图。
    win10 x64环境下利用vs2015编译zxing-cpp及利用zxing C++进行解码
  6. 在Debug文件夹下面,我们可以得到 libzxing-debug.lib 和zxing.exe两个文件。
    win10 x64环境下利用vs2015编译zxing-cpp及利用zxing C++进行解码
  7. zxing.exe文件可以在命令行下面直接运行(如下面命令行执行所示),可以设置图片进行解码。在这里,libzxing-debug.lib对我们才是重要的。
    win10 x64环境下利用vs2015编译zxing-cpp及利用zxing C++进行解码
  8. 得到libzxing-debug.lib后,我们可以像配置opencv库一样配置好zxing-cpp库,来进行解码。这里,我 将 libzxing-debug.lib 和 zxing-cpp\core\src目录下面的zxing文件夹拷贝出来,构成一个单独供C++调用的 zxing库。 如下图所示,建立了一个新的zxing文件夹,在其下面建立一个lib文件夹,将libzxing-debug.lib拷贝进去;并且将zxing-cpp\core\src目录下面的zxing文件夹拷贝到该zxing文件夹里面。这样,我们就得到了一个类似于opencv的库,只是是静态链接库。
    win10 x64环境下利用vs2015编译zxing-cpp及利用zxing C++进行解码
  9. 利用vs2015建立一个demo工程,在debug x64属性下配置好opencv 和 刚刚建立好的zxing库,形成zxing-cv属性表(不会属性配置详见Google,或者参照GitHub链接中的配置)。在工程中添加source.cpp文件,如下,其他文件参考Github链接。
#include <string>
#include <fstream>
#include <zxing/LuminanceSource.h>
#include <zxing/common/Counted.h>
#include <zxing/Reader.h>
#include <zxing/aztec/AztecReader.h>
#include <zxing/common/GlobalHistogramBinarizer.h>
#include <zxing/DecodeHints.h>
#include <zxing/datamatrix/DataMatrixReader.h>
#include <zxing/MultiFormatReader.h>
#include <zxing/pdf417/PDF417Reader.h>
#include <zxing/qrcode/QRCodeReader.h>
#include <zxing/oned/CodaBarReader.h>
#include <zxing/oned/Code39Reader.h>
#include <zxing/oned/Code93Reader.h>
#include <zxing/oned/Code128Reader.h>
#include <opencv2/opencv.hpp>
#include "MatSource.h"

int main()
{
	std::string image_name = "02.jpg";
	cv::Mat matSrc = cv::imread(image_name, 1);
	if (!matSrc.data) {
		fprintf(stderr, "read image error: %s", image_name.c_str());
		return -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::oned::Code128Reader);

	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::CODE_128_HINT)));

	/*std::string txt = "Code128.txt";
	std::ifstream in(txt);
	if (!in.is_open()) {
		fprintf(stderr, "fail to open file: %s\n", txt.c_str());
		return -1;
	}
	std::string str1;
	std::getline(in, str1);
	fprintf(stderr, "actual        result: %s\n", str1.c_str());*/

	std::string str2 = result->getText()->getText();
	fprintf(stdout, "recognization result: %s\n", str2.c_str());

	/*if (str1.compare(str2) == 0) {
		fprintf(stderr, "=====  recognition is correct  =====\n");
	}
	else {
		fprintf(stderr, "=====  recognition is wrong =====\n");
		return -1;
	}*/

	/*in.close();*/

	return 0;
}

win10 x64环境下利用vs2015编译zxing-cpp及利用zxing C++进行解码
10. 解码结果:
win10 x64环境下利用vs2015编译zxing-cpp及利用zxing C++进行解码

已编译好的 zxing-cpp 链接

Github - zxing-cpp for vs2015 x64。

已配置好的 zxing 解码demo链接

Github - 注意属性表中的路径需要根据个人环境进行配置,直接运行工程便可以解码(此处只添加了code128解码,后续将添加其他格式解码)。