欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++利用zxing识别二维码

程序员文章站 2022-07-14 17:19:51
...

C++利用zxing识别二维码


Win10-x64+VS2015/VS2019

下载编译

1.下载zxing包,并解压,下载地址:https://github.com/glassechidna/zxing-cpp
C++利用zxing识别二维码
build文件夹是后面建立的

2.新建build文件夹,打开cmd命令框,进入build路径下,执行命令(Cmake已经安装):

32位系统下执行:

> cmake -G "Visual Studio 14" ..

64位系统下执行:

> cmake -G "Visual Studio 14 2015 Win64" ..

C++利用zxing识别二维码
注意看命令行提示信息,Cmakelist找不到OpenCV下提供的OpenCVConfig.cmake或者opencv-config.cmake。实际上这是因为zxing库需要依赖OpenCV,我们打开build上级目录下的CMakeLists.txt,在第48行添加OpenCV库的路径,该路径下包含了所需的cmake文件。
C++利用zxing识别二维码
修改完成后,重新执行命令(注意清空build文件夹生成的文件),成功找到opencv!
C++利用zxing识别二维码
这里注意,因为我们的VS使用的是2015,所以命令中指定的是Visual Studio 14。
当然,也可以使用Cmake的GUI方式操作,不需要修改CmakeLists.txt的方式。如下,第一步,打开Cmake工具;第二步,选择Source和Build路径;第三步,点击Add Entry,添加OpenCV_DIR,其中类型输入Path,值通过文件选择为OpenCV的lib路径;第四步点击Configure,选择Visual Studio 14和x64,然后点击完成,可以在下方空白区看到开始配置,Configuring done,成功找到OpenCV;第五步,点击Generate,下方区域显示Generating done。编译完成
C++利用zxing识别二维码
编译成功后,build文件夹下的内容如下:
C++利用zxing识别二维码
3.使用VS2015打开zxing.sln项目,设置成debug x64模式,右键zxing的解决方案(包含6个项目),生成解决方案!
C++利用zxing识别二维码
注意!解决方案下zxing生成失败,libzxing生成时一大堆警告!
经过小编连续几天的不懈努力,包括但不限于对源码、属性表及Cmakelists.txt的研究。终于在最后还是放弃了,目前只知道解决方案生成失败是由于项目libzxing中存在名称相同的源文件,而在编译过程中发生混乱引起的!(这里请擅长VS2015编译链接过程的大佬支个招,为广大同行排忧解难!)

VS2019已经很成熟,能够针对不同路径的同名文件自动编译而不发生混乱,将上面所有使用VS2015的步骤改用VS2019就可以成功编译生成。
例如:
“Visual Studio 14 2015 Win64"修改为"Visual Studio 16 2019 Win64”

配置使用

1.第一步,构建zxing库

将 libzxing-debug.lib , zxing-cpp\core\src和zxing-cpp\opencv\src目录下面的zxing文件夹拷贝出来,构成一个单独供C++调用的 zxing库。 如下图所示,建立了一个新的Zxing文件夹,在其下面新建lib和include文件夹,将libzxing-debug.lib拷贝进lib;并且将zxing-cpp\core\src和zxing-cpp\opencv\src目录下面的zxing文件夹合并拷贝到include文件夹里面。
C++利用zxing识别二维码
2.第二步,配置开发环境

使用VS2019建立工程(VS2015编译失败),打开项目的属性,按如下配置:

  • C/C++>常规附加包含目录:添加include目录
  • 链接器常规附加库目录:添加lib目录
  • 链接器常规附加依赖项:添加libzxing-debug.lib

同时还需要添加opencv的属性配置,方法请参考opencv的配置方法,这里不再说明。

3.第三步,代码中使用zxing

#include "stdafx.h"
#include <string>
#include <iostream>
#include <zxing/LuminanceSource.h>
#include <zxing/common/Counted.h>
#include <zxing/Reader.h>

#include <zxing/common/GlobalHistogramBinarizer.h>
#include <zxing/DecodeHints.h>
#include <zxing/MultiFormatReader.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 <vector>
#include <zxing/MatSource.h>

int main()
{
  std::string image_name = "F:\\chenggeng\\HalconItem\\code1d_1.png";
  cv::Mat matSrc = cv::imread(image_name, 1);
  if (!matSrc.data) {
    std::cout << "read image error: " << image_name << std::endl;
    return -1;
  }

  cv::Mat matGray;
  cv::cvtColor(matSrc, matGray, cv::COLOR_BGR2GRAY);

  zxing::Ref<zxing::LuminanceSource> source(new MatSource(matGray));
  int width = source->getWidth();
  int height = source->getHeight();
  std::cout << "image width: " << width << ", height: " << height << std::endl;
  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 str2 = result->getText()->getText();
  std::cout << "recognization result: " << str2 << std::endl;

  zxing::ArrayRef< zxing::Ref<zxing::ResultPoint> > rpoints = result->getResultPoints();
  cv::Point point0(rpoints[0]->getX() + 30, rpoints[0]->getY() + 50);
  cv::Point point1(rpoints[1]->getX() - 30, rpoints[1]->getY() - 50);
  cv::putText(matSrc, str2, cv::Point(rpoints[1]->getX() - 10, rpoints[1]->getY() - 10), 1, 2, cv::Scalar(0, 0, 255));
  cv::rectangle(matSrc, cv::Rect(point1, point0), cv::Scalar(0, 0, 255), 2);
  cv::imshow("locate", matSrc);
  cv::waitKey(0);
  return 0;
}

输出如下:
C++利用zxing识别二维码

参考:

https://blog.csdn.net/qq_24915933/article/details/88934970

https://xiulian.blog.csdn.net/article/details/60467090