C/C++ 使用zbar库识别解析条形码与二维码(最全 附代码、踩坑及解决方案)

C/C++ 使用zbar库识别解析条形码与二维码(最全附代码、踩坑及解决方案)

1、图形编码类别

1.1 条形码

条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。

常见的条码有:Code39码(标准39码)、Codabar码(库德巴码)、Code25码(标准25码)、ITF25码(交叉25码)、Matrix25码(矩阵25码)、UPC-A码、UPC-E码、EAN-13码(EAN-13国际商品条码)、EAN-8码(EAN-8国际商品条码)、中国邮政码(矩阵25码的一种变体)、Code-B码、MSI码、Code11码、Code93码、ISBN码、ISSN码、Code128码(Code128码,包括EAN128码)、Code39EMS(EMS专用的39码)等一维条码和PDF417等二维条码。更多条形码知识可以参考:https://zhuanlan.zhihu.com/p/582084617 常见的商品条形码为code128

1.2 二维码

二维码又称二维条码,常见的二维码为QR Code,QR全称Quick Response,是一种编码方式。它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型。

二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的、黑白相间的、记录数据符号信息的图形;在代码编制上巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图象输入设备或光电扫描设备自动识读以实现信息自动处理:它具有条码技术的一些共性:每种码制有其特定的字符集;每个字符占有一定的宽度;具有一定的校验功能等。同时还具有对不同行的信息自动识别功能、及处理图形旋转变化点。

二维码具有信息量大、易识别、成本低等特点,因而 在扫码支付、商业活动、网络链接、电商平台等许多领域都得到广泛的应用。

2、二维码识别解析常用库简介

二维码识别解析常用主流库推荐有两个,一是Quirc,二是ZBar,两者都是C/C++库,跨平台一直方便,且速度较快。个人使用比较更推荐ZBar,运行识别速度比Quirc更快一点。

2.1 Quirc

QR 码是一种高密度矩阵条码,Quirc是一个基于C/C++的一个二维码库 ,从图像中提取和解码QR 码。其部分功能还需依赖OpenCV库共同实现,比如quirc-demo-opencv(即图形的显示);inspect-opencv(测试)。
特点:

  1. 足够快,可以用于实时视频:在现代x86内核上,从VGA帧提取和解码大约需要50毫秒。
  2. 具有鲁棒且宽容的识别算法。 可以正确识别和解码旋转和/或倾斜于相机的QR码。 它还可以区分和解码同一图像中的多个代码。
  3. 易于使用,并且在单个带注释的头文件中描述了一个简单的API 。
  4. 它很小,易于嵌入,除了标准C函数外没有任何依赖关系。
  5. 它的内存占用非常小:每个图像像素一个字节,再加上每个解码器对象几kB。
  6. 不使用全局可变状态,并且可以在多线程应用程序中安全使用。
  7. BSD许可,几乎没有关于使用和/或修改的限制。 除了库之外,该发行版还附带了一些测试程序。

简单的来概括Quirc的特点就是:简单,方便移植,识别准确率高。具体使用方法可参考其官网:https://github.com/dlbeer/quirc

2.2 ZBar

ZBar 是一个开源软件套件,用于读取来自各种来源的条形码,例如视频流、图像文件和原始强度传感器。它支持许多流行的符号系统(条形码类型),包括 EAN-13/UPC-A、UPC-E、EAN-8、Code 128、Code 39、Interleaved 2 of 5 和 QR 码。

灵活的分层实施有助于任何应用程序的条码扫描和解码:与随附的 GUI 和命令行程序独立使用,轻松将条码扫描小部件集成到您的 Qt、GTK+ 或 PyGTK GUI 应用程序中。

特征

  1. 跨平台 - Linux/Unix、Windows、iPhone®、嵌入式…
  2. 高速 - 实时扫描视频流
  3. 内存占用小
  4. 不限于图像,无浮点运算
  5. 适用于嵌入式应用,使用价格低廉 处理器/硬件
  6. 模块化组件可以一起使用,也可以单独使用

3、Zbar库的安装

    1. Zbar库默认提供的是32位的库文件,其下载安装地址为:ZBar bar code reader - Download (sourceforge.net),windows用户在官网安装以下连接进行下载。如图找到Windows安装下载,点击下载。
      在这里插入图片描述
  1. 下载的文件名为zbar-0.10-setup.exe,双击安装,注意勾选Development Headers and Libraries和更改安装路径

在这里插入图片描述

  1. 安装好软件后,需要在系统环境变量path中添加F:\Program Files\nuget\packages\ZBar\bin路径(自己的安装路径)。

4、ZBar配置VS2019环境

  1. 使用VS2019新建一个项目

  2. 在工程的视图目录其它窗口下打开属性管理器,在属性管理器的Debug/release目录上点击添加新项目属性表,命名为BaseOnZbar(名称可自定义)

  3. 双击刚才新建的BaseOnZbar属性表,开始IDE环境配置

    • 通用属性->VC++目录->包含目录:添加目录Zbar\include(自己的安装位置路径)
    • 通用属性->VC++目录->库目录:添加目录Zbar\lib(自己的安装位置路径)
    • 通用属性->链接器->输入->附加依赖项:添加库文件libzbar-0.lib(自己的安装位置路径)
  4. 由于官网下载的安装包是32位的,所以上述3步就完成了32位ZBar配置,若要使用64位的ZBar则需要一些补丁,看下面步骤。

  5. 下载64位压缩包。下载地址:https://github.com/dani4/ZBarWin64 https://github.com/noselhq/ZBarWin64

  6. 将下载的ZBarWin64-master解压,配置x64环境:

    • 将 ZBarWin64-master\lib 文件夹下 libzbar64-0.lib 文件复制到ZBar安装路径下的 lib 文件夹;
    • 将 ZBarWin64-master\lib 文件夹下 libzbar64-0.dll 文件复制到ZBar安装路径下的 bin 文件夹;
    • 将ZBarWin64-master\zbar\libiconv\dll_x64文件夹下 libiconv.dll 复制到ZBar安装路径下的bin 文件夹;
    • 在VS项目属性表中,打开 通用属性->链接器->输入->附加依赖项 再添加一条:libzbar64-0.lib;
  7. 到此,ZBar的64位库配置完成

5、C++使用ZBar库对二维码或条形码进行识别

在主函数中添加如下代码:

// BaseOnZbar.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include "zbar.h"
#include <opencv2/opencv.hpp>

int main()
{
    zbar::ImageScanner scanner;
    scanner.set_config(zbar::ZBAR_NONE, zbar::ZBAR_CFG_ENABLE, 1);
    cv::Mat image = cv::imread("F:/syk/acer/20241012/20241012171717785.jpg"); // 二维码和条形码图片
    cv::Mat imageGray;
    cv::cvtColor(image, image, cv::COLOR_BGR2GRAY);
    int width = image.cols;
    int height = image.rows;
    uchar* raw = (uchar*)image.data;
    zbar::Image imageZbar(width, height, "Y800", raw, width * height);
    scanner.scan(imageZbar); //扫描条码  
    zbar::Image::SymbolIterator symbol = imageZbar.symbol_begin();
    if (imageZbar.symbol_begin() == imageZbar.symbol_end())
    {
        std::cout << "查询条码失败,请检查图片!" << std::endl;
    }
    for (; symbol != imageZbar.symbol_end(); ++symbol)
    {
        std::cout << "类型:" << symbol->get_type_name() << std::endl;
        std::cout << "条码:" << symbol->get_data() << std::endl;
    }
cv:imshow("Source Image", image);
    cv::waitKey(0);
    return 0;
}

此项目还使用了opencv库,具体的安装配置可以查看opencv 一 基本运行环境配置(下载安装、编写代码、配置环境)

运行成功!

在这里插入图片描述

6、可能会遇到的坑以及解决办法

6.1问题1:无法打开源文件 "stdafx.h”

解决办法:打开项目 ->项目属性(最后一个)-> C/C++ ->常规,在附加包含目录后面填入 $(ProjectDir) ,再将代码中的 #include "stdafx.h"删除。改完的代码如下:

// BaseOnZbar.cpp : 定义控制台应用程序的入口点。
//

#include <iostream>
#include "zbar.h"
#include <opencv2/opencv.hpp>

int main()
{
    zbar::ImageScanner scanner;
    scanner.set_config(zbar::ZBAR_NONE, zbar::ZBAR_CFG_ENABLE, 1);
    cv::Mat image = cv::imread("F:/syk/acer/20241012/20241012171717785.jpg"); // 二维码和条形码图片
    cv::Mat imageGray;
    cv::cvtColor(image, image, cv::COLOR_BGR2GRAY);
    int width = image.cols;
    int height = image.rows;
    uchar* raw = (uchar*)image.data;
    zbar::Image imageZbar(width, height, "Y800", raw, width * height);
    scanner.scan(imageZbar); //扫描条码  
    zbar::Image::SymbolIterator symbol = imageZbar.symbol_begin();
    if (imageZbar.symbol_begin() == imageZbar.symbol_end())
    {
        std::cout << "查询条码失败,请检查图片!" << std::endl;
    }
    for (; symbol != imageZbar.symbol_end(); ++symbol)
    {
        std::cout << "类型:" << symbol->get_type_name() << std::endl;
        std::cout << "条码:" << symbol->get_data() << std::endl;
    }
cv:imshow("Source Image", image);
    cv::waitKey(0);
    return 0;
}

6.2问题2:LNK1181 无法打开输入文件"libzbar64-0.lib"/“libiconv.dll”

这个问题按道理不会发生,但是有时有就是会有这样的bug,解决方法也很简单,到ZBar\bin和ZBar\lib中找到这两个文件,将其拷贝到C++可执行程序运行路径下(x64\Release或者x64\Debug)下,再去运行代码即可运行成功。

NK1181 无法打开输入文件"libzbar64-0.lib"/“libiconv.dll”

这个问题按道理不会发生,但是有时有就是会有这样的bug,解决方法也很简单,到ZBar\bin和ZBar\lib中找到这两个文件,将其拷贝到C++可执行程序运行路径下(x64\Release或者x64\Debug)下,再去运行代码即可运行成功。

在这里插入图片描述

### 回答1: 二维码识别工具v3.27是一款功能强大的软件程序,用于识别和解码二维码。 该工具使用先进的图像处理算法和识别技术,可以快速准确地读取和解码二维码。用户只需将相机对准二维码,该工具即可自动识别并提取二维码中的信息。无论是在产品包装上的二维码还是在广告海报上的二维码,该工具都能轻松解码。 二维码识别工具v3.27具有以下主要特点: 1. 快速高效:该工具使用高速图像处理算法,能够在几秒钟内完成二维码识别和解码,大大提高了工作效率。 2. 多格式支持:该工具不仅支持常见的二维码格式,如QR Code和Data Matrix,还支持其他二维码格式,如PDF417和MaxiCode,能够满足不同用户的需求。 3. 自动校正:该工具具备自动校正功能,能够根据图像的倾斜角度进行自动调整,确保二维码的准确识别。 4. 数据提取:除了识别和解码二维码外,该工具还能提取二维码中的信息并进行展示和导出,方便用户进行后续的数据处理和分析。 5. 用户友好:该工具界面简洁明了,操作简单方便,即使对于没有技术经验的用户也能够轻松上手使用。 总之,二维码识别工具v3.27是一款功能齐全、操作简单、效率高的二维码识别软件,广泛应用于各行各业,方便用户快速准确地读取和解码二维码中的信息。 ### 回答2: 二维码识别工具v3.27是一款功能强大的工具,主要用于快速识别和解码二维码。它具有以下几个特点和功能。 首先,它具有高效快速的识别速度。通过优化算法和硬件支持,该工具能够在瞬间识别并解码二维码,提供快速的反馈结果,大大节省了用户的时间。 其次,它支持多种类型的二维码。无论是普通的URL链接、文本信息、电话号码、电子邮件地址,还是名片、地图定位等复杂类型的二维码,该工具都能够准确识别并提供丰富的解码信息。 另外,该工具还具有强大的图像处理能力。无论是二维码在图像中的旋转、变形、模糊,还是光线不均匀、背景复杂等干扰因素,该工具都能够通过图像处理技术进行优化,提高识别准确度。 此外,二维码识别工具v3.27还提供了用户友好的操作界面。不仅界面简洁直观,操作便捷,而且还支持多语言切换和个性化设置,满足不同用户的需求。 最后,该工具还具有多平台兼容性。不论是在Windows、MacOS、Android还是iOS等操作系统上,该工具都能够稳定运行,为用户提供一致的使用体验。 总之,二维码识别工具v3.27是一款功能强大、操作简便、多平台兼容的工具,能够满足用户对于快速、准确解码二维码的需求。 ### 回答3: 二维码识别工具v3.27是一款用于扫描和解码二维码的工具软件。它具有快速、准确、稳定的特点。 首先,二维码识别工具v3.27具有快速的扫描速度。它使用先进的图像处理算法和高效的二维码识别引擎,可以在短时间内迅速完成对二维码的扫描解码。用户只需要用手机或者摄像头对准二维码,点击扫描按钮,即可在几秒钟内获得扫描结果。 其次,二维码识别工具v3.27具有准确的识别能力。它可以识别多种类型的二维码,包括普通二维码、动态二维码、彩色二维码等。不论二维码的尺寸大小、颜色多样性、形状复杂性如何,该工具都能够准确地识别,并解码成相应的信息。这使得用户在使用该工具时能够获得更加准确和可靠的识别结果。 最后,二维码识别工具v3.27具有稳定的性能。它经过了多次的测试和优化,保证在各种设备上都能稳定运行,并且不易出现崩溃或卡顿的情况。用户可以放心使用该工具进行二维码的扫描和解码,无需担心使用过程中会遇到各种问题。 综上所述,二维码识别工具v3.27是一款功能强大、快速准确、稳定可靠的工具软件,能够满足用户在不同场景下对二维码扫描和解码的需求。无论是个人用户还是企业用户,都可以通过使用该工具来提高工作效率和用户体验。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值