Zbar是一个很强大的开源二维码/条码识别库,但使用时也有几个需要注意的点,以下列出我在使用Zbar 1.0.0版本时得出的经验。
Zbar的使用建议
1.减少一帧的识别时间
这里不去谈设备性能的差异。单从识别角度说,Zbar识别一帧的时间跟图像帧里码复杂度、帧尺寸大小、需要判断的码类型数量有关,越复杂的二维码/条码和越大尺寸的图像,识别就会越花时间,建议如下:
- 将二维码和条码从图像帧中截取出来
- 缩小Camera预览返回的帧尺寸
- 在Zbar ImageScanner的初始化设置减少识别的条码类型
- 将Camera预览调成黑白(有可能对识别彩色二维码有影响)
- 如果机器是多核CPU,可以开多几个线程进行识别操作
另外注意zbar编译时别选择debug版的,debug版的会比release版的慢很多。
2.提高识别成功率
Zbar的识别成功率跟图像帧本身的质量有很大关系,图像帧里二维码/条码越是清晰突出,识别成功率越高,同时要避免减低成功率的操作,建议如下:
- 将Zbar ImageScanner的X、Y轴扫码密度改为1,这同时会加长识别时间
1
2ImageScanner.setConfig(0, ZBAR_CFG_X_DENSITY, 1);
ImageScanner.setConfig(0, ZBAR_CFG_Y_DENSITY, 1); - 提高Camera预览的图像对比度
- 对图像帧进行一些处理,如去除噪点,锐化,这里不提二值化因为Zbar自身带了二值化处理
提高图像帧的质量,突出二维码/条码对Zbar识别是很有帮助的,但有些处理也挺耗时的,所以一旦图像处理时间
远超Zbar识别时间而且无法接受,那你就得考虑优化处理或者不做处理。
Zbar存在的Bug
识别校验码错误的条形码时会返回错误的结果
有些类型的条形码是有校验码,比如Code128类型的。绝大部分时候我们扫码时的条码校验码是没问题的,但一旦真的出现校验码错误的条码时,Zbar能保证完全不出错吗,答案是不能保证。Zbar多次识别校验码错误的条码会返回错误的结果,下面举个例子。
我们可以通过修改ZXing的Code128Writer.java类生成校验码错误的Code128条码。
比如下面这张图片是内容为 “66281303A60.2#$@” 的Code128类型条码图:
而这一张是同样内容但校验码错误的条码图:
如果你用Zbar轮流识别这两张图,会发现识别校验码错误图时有概率会返回结果(实际校验码错误就不应该返回任何结果,而Zbar在解析条码也是有判断校验码的),比如会返回 “66281303A60.1#$@” 或者其他数字组合,不但返回了结果还是返回错误内容的结果。但Zbar也会告诉你quality只有1,所以你也可以根据quality不拿这个结果当是正确的结果,但很多时候Zbar的识别不够突出的条码时返回的也是1。
解决方式:其实Zbar一开始识别校验码错误的条码是不会出BUG的,但是反复识别就很容易出现,我们可以过一段时间甚至每次识别就重新初始化Scanner和Image,也需要重新设置初始化选项,这样就大大减少出这个BUG的概率。