zbar--对zbar开源二维码解码库的分析

前言

鉴于网上对zbar这一开源二维码解码库的中文文档较少,刚好做了点这个库的调用,写了点分析笔记,如果有错,望指出批评。

正题

源码内容较多,还多涉及图像算法的内容,于是从其头文件的各注释和函数分析。

zbar.h

在安装路径下,include中有个zbar.h文件,首先从这个头文件入手。

文件最开始:

*版权所有2007-2009(c)Jeff Brown<spadix@users.sourceforge.net>
*
*此文件是ZBar条形码读取器的一部分。
*
*ZBar代码阅读器是免费软件;您可以重新发布它
*和/或根据GNU Lesser Public License的条款将其修改为
*由自由软件基金会发布;版本2.1
*许可证,或(由您选择)任何更高版本。
*
*ZBar代码读取器的发布希望
*有用,但没有任何保证;甚至没有隐含的保证
*指适销性或对特定目的的适用性。见
*GNU小公共许可证获取更多详细信息。
*
*你应该已经收到了一份GNU Lesser Public License的副本
*与ZBar条码阅读器一起使用;如果没有,请免费写入
*软件基金会,51 Franklin St,Fifth Floor,
*美国马萨诸塞州波士顿市,邮编:02110-1301
*
*http://sourceforge.net/projects/zbar

这是版权、版本等信息,主要了解到这个库是开源免费的。

还有很大一块注释信息:
主要介绍zbar中开启窗口、自带的图像视频处理接口,由于一般不用,所以不介绍,其中红色框中的信息比较重要。
红色框中:介绍扫描器和解码器两个重要的底层接口

命名空间

zbar中的接口c和c++都可以调用,如果使用c++规则,加上using namespace zbar
__cplusplus是c++中的宏,提醒编译器使用c++的规则进行编译。

解码相关数据结构

zbar_color_t:二维码、条形码是二进制编码,黑白区域分别表示0、1,这里的ZBAR_SPACE表示白色区域,编码为0;ZBAR_BAR表示黑色区域,编码为1。
zbar_symbol_type_t:条形码、二维码的编码类型。里面的是zbar支持的解码类型,后边可以作为扫描器的参数使用,禁用某几类或只使能对某种类型的码的解码,提高效率。

码的类型用途或特点
EAN、UPC(条形码)商品条码,用于在世界范围内唯一标识一种商品。我们在超市中最常见的就是EAN和UPC条码
Code39(条形码)因其可采用数字与字母共同组成的方式而在各行业内部管理上被广泛使用
ISBN(条形码)主要用于图书标记
PDF14(二维码)可表示数字、字母或二进制数据,也可表示汉字,最大的优势在于其庞大的数据容量和极强的纠错能力(九级纠错能力,级别越高,纠错能力越强)
QR Code(二维码)可表示数字、字母或二进制数据,也可表示汉字,高速识读,全方位识读

错误类型

用于判断出错类型,调试

解码器的初始化设置

常用函数(不使用zbar自带的window、video处理)

zbar.h中包含了几个头文件,不使用zbar自带的window、video处理,只有Decoder.h、Scanner.h、Symbol.h、Image.h、ImageScanner.h这几个头文件需要看。Exception.h中是关于错误处理的类,如果程序抛错,可以去研究这个文件。

对文件都进行简化,提高阅读性(不保证严格的语法规范,只是为了了解功能)

Image.h

#ifndef _ZBAR_IMAGE_H_
#define _ZBAR_IMAGE_H_

namespace zbar {
    class SymbolIterator : public zbar::SymbolIterator {
    public:
        /// default constructor.
        SymbolIterator ()
            : zbar::SymbolIterator()
        { }

        /// constructor.
        SymbolIterator (const SymbolSet &syms)
            : zbar::SymbolIterator(syms)
        { }

        /// copy constructor.
        SymbolIterator (const SymbolIterator& iter)
            : zbar::SymbolIterator(iter)
        { }
    };//迭代器类,遍历图像信息
    
    ///返回一个适合开始迭代的symbolicator。
    SymbolIterator symbol_begin () const ;
    ///返回一个适合结束迭代的symbolicator。
    SymbolIterator symbol_end () const;//
    
class Image {
public:
    /// 构造函数
    /// 使用指定的参数创建新图像,zbar需要的是单Y通道的图像,可以使用后面的格式转化函数,也可以用OpenCV转化为单Y通道的图像
    Image (unsigned width = 0,//图像的宽
           unsigned height = 0,//图像的高
           const std::string& format = "",//一般指定Y800格式
           const void *data = NULL,//用于构建image的data
           unsigned long length = 0)//width*height 
			);

    /// 图像的格式转化,转化图像为format规定的格式,返回格式化后的图像
    Image convert (unsigned long format) constprivate:
    zbar_image_t *_img;
};

}

#endif
ImageScanner.h
#ifndef _ZBAR_IMAGE_SCANNER_H_
#define _ZBAR_IMAGE_SCANNER_H_

namespace zbar {
class ImageScanner {
public:
    /// 构造函数
    ImageScanner (zbar_image_scanner_t *scanner = NULL);
    
    /// 配置ImageScanner
    int set_config (zbar_symbol_type_t symbology,//设置解码类型,zbar_symbol_type_t为zbar的支持解码类型,默认ZBAR-NONE,解所有码
                    zbar_config_t config,//解码器的初始化
                    int value);//解析次数
                    
    /// 扫描提供的图像中的符号。
    int scan (Image& image);//传入图片,return码的个数
private:
    zbar_image_scanner_t *_scanner;
};

}
#endif

Decoder.h解码器中Scanner扫描器为Decoder友元类,函数方法设置扫描器状态、获取扫描器数据,其中有两个方法

zbar_symbol_type_t get_type () const;//返回码的类型,返回类型为zbar_symbol_type_t
string get_type_name () const;//返回码的类型,返回类型为string

const std::string get_data() const;//返回码的数据

zbar例程中Image中迭代器可以用来遍历图像,获取数据

 Image::SymbolIterator it;//实例化一个图像迭代器,遍历多个二维码
 it->get_type();//获取当前迭代器所指二维码的类型
 it->get_data();//获取当前迭代器所指二维码的数据

所以总结其使用:

  • 构建zbar需要的单Y通道(Y8 or Y800)的图像;
  • 将图像送入扫描器,扫描器储存多个码的信息为SymbolIterator迭代器可以处理的数据;
  • 将每个码的信息调用解码器解码,获取数据、类型等信息;
  • 超出作用域,所有类都有相应的析构函数销毁资源,一般不用担心内存管理的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值