C++利用zxing识别二维码

C++利用zxing识别二维码


Win10-x64+VS2015/VS2019

下载编译

1.下载zxing包,并解压,下载地址:https://github.com/glassechidna/zxing-cpp
在这里插入图片描述
build文件夹是后面建立的

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

32位系统下执行:

> cmake -G "Visual Studio 14" ..

64位系统下执行:

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

在这里插入图片描述
注意看命令行提示信息,Cmakelist找不到OpenCV下提供的OpenCVConfig.cmake或者opencv-config.cmake。实际上这是因为zxing库需要依赖OpenCV,我们打开build上级目录下的CMakeLists.txt,在第48行添加OpenCV库的路径,该路径下包含了所需的cmake文件。
在这里插入图片描述
修改完成后,重新执行命令(注意清空build文件夹生成的文件),成功找到opencv!
在这里插入图片描述
这里注意,因为我们的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。编译完成
在这里插入图片描述
编译成功后,build文件夹下的内容如下:
在这里插入图片描述
3.使用VS2015打开zxing.sln项目,设置成debug x64模式,右键zxing的解决方案(包含6个项目),生成解决方案!
在这里插入图片描述
注意!解决方案下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文件夹里面。
在这里插入图片描述
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;
}

输出如下:
在这里插入图片描述

参考:

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

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

  • 8
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
ZXing 是一种开源的二维码识别库。通过使用 ZXing 库,我们可以在 Android 或者 Java 应用程序中实现对二维码识别功能。在识别二维码过程中,我们首先需要使用手机摄像头捕获二维码的图像,然后将这个图像传递给 ZXing 库进行解码。ZXing 库会对图像进行处理,提取出其中的二维码信息,并返回给我们。 使用 ZXing 库进行二维码识别需要一些基本的步骤。首先,我们需要在项目中引入 ZXing 库的相关依赖,可以通过 Maven 或者直接下载库文件的方式引入。接下来,我们需要初始化识别器,并设置一些参数,例如识别图像的格式、识别所用的字符编码等等。然后,我们可以通过调用 ZXing 库的识别方法来识别二维码识别方法将返回一个 Result 对象,其中包含了二维码的内容、二维码的格式等信息。 在识别二维码的过程中,我们还可以对识别器进行一些额外的操作。例如,可以设置识别器在识别过程中的一些回调方法,以便在识别过程中进行一些特殊操作。此外,我们还可以对识别图像进行一些处理,例如旋转、裁剪等等,以提高识别的准确度。 总之,ZXing 是一个功能强大的开源二维码识别库。通过使用这个库,我们可以轻松地实现对二维码识别功能,并可以根据需要进行一些额外的操作。无论是在 Android 还是 Java 应用程序中,ZXing 都是一个值得使用的优秀工具。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值