AI学习者 · 2021年09月03日

实战-OpenCV+ZXing开源实现工业级条码识别

引言

好友跟我说有些不能识别的条码,我对这个很感兴趣,因为我知道除了条码图像本身质量问题,有些条码不能识别是因为预处理的原因,做好预处理,还可以提升一波识别率的,另外一个吐槽的地方就是识别的时间特别漫长,一张图需要1秒多,它们每张图的大小是2736x2736,所以我让他把不能识别的图像都发我一些,他总计给了我 54张。这里要特别交代一下它们用的库是一个国内的商业收费条码识别库!

image.png

所以这个事情面临两个问题:一个是识别率不满意,二个速度慢,第三个还得花钱!

提升方法效果

先看一下数据,截图如下:

image.png

然后我一波疯狂预处理变成这样:

image.png

看到那些二值化之后的白色区域了吗?它就是条码所在区域,只要获取条码所在区域,然后扔到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 返回识别字符串

运行结果如下:

image.png

54张商业库不能识别的,我们成功识别出31张!关键是速度平均都在40毫秒左右!实现了速度、识别率双提升!这个就是我用OpenCV+ZXing给出的初步结果,我看了图像,发现还有继续优化预处理的空间!有些还应该被识别!

原文:OpenCV学堂
作者:gloomyfish

推荐阅读

推荐阅读
关注数
18758
内容数
1316
嵌入式端AI,包括AI算法在推理框架Tengine,MNN,NCNN,PaddlePaddle及相关芯片上的实现。欢迎加入微信交流群,微信号:aijishu20(备注:嵌入式)
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息