引言
好友跟我说有些不能识别的条码,我对这个很感兴趣,因为我知道除了条码图像本身质量问题,有些条码不能识别是因为预处理的原因,做好预处理,还可以提升一波识别率的,另外一个吐槽的地方就是识别的时间特别漫长,一张图需要1秒多,它们每张图的大小是2736x2736,所以我让他把不能识别的图像都发我一些,他总计给了我 54张。这里要特别交代一下它们用的库是一个国内的商业收费条码识别库!
所以这个事情面临两个问题:一个是识别率不满意,二个速度慢,第三个还得花钱!
提升方法效果
先看一下数据,截图如下:
然后我一波疯狂预处理变成这样:
看到那些二值化之后的白色区域了吗?它就是条码所在区域,只要获取条码所在区域,然后扔到ZXing的decode方法中就会有结果了?理论上是这样,先要把条码区域扣出来,这个就涉及到二值图像分析的轮廓处理,经过一番轮廓分析之后,我得到了每张图上每个可疑条码所在区域,然后我就送到ZXing解码函数中,完成解码,这段代码如下:
types.push_back(CODE_TYPE::DATA_MATRIX);
types.push_back(CODE_TYPE::MAXICODE);
types.push_back(CODE_TYPE::QR_CODE);
types.push_back(CODE_TYPE::AZTEC);
types.push_back(CODE_TYPE::CODABAR);
types.push_back(CODE_TYPE::CODE_128);
types.push_back(CODE_TYPE::CODE_39);
types.push_back(CODE_TYPE::CODE_93);
reader.initConfig(types, cv::Mat());
reader.decode_ver2(image, txtInfo, 5, true);
然后从txtInfo中接受返回结果:
txtInfo.status 返回0表示识别,-1表示未识别
txtInfo.code 返回识别字符串
运行结果如下:
54张商业库不能识别的,我们成功识别出31张!关键是速度平均都在40毫秒左右!实现了速度、识别率双提升!这个就是我用OpenCV+ZXing给出的初步结果,我看了图像,发现还有继续优化预处理的空间!有些还应该被识别!
原文:OpenCV学堂
作者:gloomyfish
推荐阅读