解决Zbar倾斜二维码/条形码识别不出来的情况

解决Zbar倾斜二维码/条形码识别不出来的情况

在使用Zbar的过程中,有时会遇到二维码/条形码倾斜45%时识别不出来的情况,然而这并不是Zbar的Bug,下面给出两种解决办法。


通过修改Zbar的扫描密度设置(推荐)

Zbar在对图像识别时会逐行逐列地扫描,扫描初始化设置里提供了X轴和Y轴的扫描密度的设置,将密度值设置为1,即不跨行扫描,就可以正常识别倾斜的二维码/条形码。

1
2
ImageScanner.setConfig(0, ZBAR_CFG_X_DENSITY, 1);
ImageScanner.setConfig(0, ZBAR_CFG_Y_DENSITY, 1);

注意,这里涉及到一个识别速度的问题,很多人将这个值设置为2甚至3,就是为了可以加快识别一帧图像的速度。因为设置为2时,每2行才扫描1行,识别时间更短了,但这也会丢失细节,导致倾斜二维码识别不出来。大部分情况下,Zbar识别一帧图像的时间小于1秒,为了加快一倍的识别速度,丢失识别成功率是不值得的。

使用JNI调用Zbar的情况,要注意检查Java和C代码里对Zbar的初始化设置有没有问题。


通过图像处理矫正再识别

将图像矫正再丢给Zbar识别,也是可以的。很多人会使用OpenCV进行图像矫正,这里提供一个处理过程:

resize(图像尺寸缩小)->threshold(二值化)->erode(几次膨胀腐蚀)->HoughLines(寻找直线)->筛除出二维码/一维码的边线,计算出边线的倾斜角度->warpAffine(对原图像进行仿射变换)

处理后再将图像丢给Zbar识别即可,OpenCV相关代码网上很多,这里就不贴了。

 
综上所述,这里还是推荐第一种方式。如果还是识别不出来,也许就是图像帧的质量问题,毕竟你觉得清晰的图像,Zbar并不一定觉得细节清晰。

#
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×