在使用Zbar的过程中,有时会遇到二维码/条形码倾斜45%时识别不出来的情况,然而这并不是Zbar的Bug,下面给出两种解决办法。
通过修改Zbar的扫描密度设置(推荐)
Zbar在对图像识别时会逐行逐列地扫描,扫描初始化设置里提供了X轴和Y轴的扫描密度的设置,将密度值设置为1,即不跨行扫描,就可以正常识别倾斜的二维码/条形码。
1 |
|
注意,这里涉及到一个识别速度的问题,很多人将这个值设置为2甚至3,就是为了可以加快识别一帧图像的速度。因为设置为2时,每2行才扫描1行,识别时间更短了,但这也会丢失细节,导致倾斜二维码识别不出来。大部分情况下,Zbar识别一帧图像的时间小于1秒,为了加快一倍的识别速度,丢失识别成功率是不值得的。
使用JNI调用Zbar的情况,要注意检查Java和C代码里对Zbar的初始化设置有没有问题。
通过图像处理矫正再识别
将图像矫正再丢给Zbar识别,也是可以的。很多人会使用OpenCV进行图像矫正,这里提供一个处理过程:
resize(图像尺寸缩小)->threshold(二值化)->erode(几次膨胀腐蚀)->HoughLines(寻找直线)->筛除出二维码/一维码的边线,计算出边线的倾斜角度->warpAffine(对原图像进行仿射变换)
处理后再将图像丢给Zbar识别即可,OpenCV相关代码网上很多,这里就不贴了。
综上所述,这里还是推荐第一种方式。如果还是识别不出来,也许就是图像帧的质量问题,毕竟你觉得清晰的图像,Zbar并不一定觉得细节清晰。