开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 6488|回复: 3
收起左侧

[技术专题] Opencv学习笔记 条形码识别器

[复制链接]
结帖率:89% (79/89)
发表于 2021-6-24 14:44:23 | 显示全部楼层 |阅读模式   江苏省苏州市
作者:梁峻豪,王天麒,孙中夏 (南方科技大学计算机科学与工程系)
最近,我们为OpenCV贡献了一维条形码识别模块,代码收录在:
https://github.com/opencv/opencv_contrib/tree/master/modules/barcode
我们收集的数据集(数据集地址:https://github.com/SUSTech-OpenCV/BarcodeTestDataset,共250张条码图片)上进行了测试,我们的识别算法正确率达到了96%,速度为20ms每张图像。作为对比,我们也测试了ZXing在该数据集上的表现,其正确率为64.4%,速度为90ms每张图像。
注:测试速度不包含初始化以及读图时间。同时,我们的算法是C++实现,ZXing是Java实现。另外,对于用图片数据集进行的测试,ZXing99%的时间是在做彩色图到灰度图的转换。

本文将对此模块的原理和使用方式进行介绍。

条形码介绍
条形码是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符,如下图所示:
v2-fe085e93660eba1dee5c8445c59a02ca_720w.jpg
条码区域与其他图像相比有如下两个重要特点:第一,条码区域内的条空是平行排列的,方向趋于一致;第二,为 了条码的可识读性,条码在制作时条和空之间有着较大的反射率差,从而条码区域内的灰度对比度较大,而且边缘信息丰富。

基于方向一致性的条码定位算法
  • 根据条形码方向趋于一致的特点,我们可以将图像分块,通过计算每个块内梯度方向的一致性,来滤除那些低一致性的块。下图是筛选过后剩下的块:
  • v2-700da60589667c60b3155474253e252d_720w.jpg
  • 2. 由于包含条码区域的块一定连续存在的特性,我们可以通过对这些图像块再进行一个改进的腐蚀操作过滤掉部分背景图像块。下图是滤除部分背景图像块后剩余的块:
  • v2-a2c6be29c75dff728a656649b3f82e66_720w.jpg
  • 3. 得到这些块之后,我们再根据每个图像块内的平均梯度方向进行连通。因为如果是相邻的图像块都属于同一个条码的话,那么他们的平均梯度方向也一定相同。
    4. 得到连通区域之后我们再根据条码图像的特性进行筛选,比如连通区域内的梯度大于阈值的点的比例,组成连通区域的图像块数量等。
    5. 最后,用最小外接矩形去拟合每个连通区域,并计算外界矩形的方向是否和连通区域内的平均梯度方向一致,过滤掉差距较大的连通区域。将平均梯度方向作为矩形的方向,并将矩形作为最终的定位框。
  • v2-b8cb276e00b49bb402a3ffd398bbb124_720w.jpg
    条形码解码
    目前我们支持了三种类型的条码解码,它们分别是EAN13、 EAN8 和UPC-A。(下图为EAN13 条码示例
  • v2-46f7828150b511430664795d34a18d4d_720w.jpg
  • 条码的识别主要流程如下图:
  • 其中:

    • 优化的超分辨率策略指的是对较小的条码进行超分辨率放大,不同大小条码做不同处理。
    • 解码算法的核心是基于条码编码方式的向量距离计算。因为条码的编码格式为固定的数个"条空",所以可以在约定好"条空"间隔之后。将固定的条空读取为一个向量,接下来与约定好的编码格式向匹配,取匹配程度最高的编码为结果。
    • 在解码步骤中,解码的单位为一条线,由于噪点,条空的粘连等原因,单独条码的解码结果存在较大的不确定性,因此我们加入了对多条线的扫码,通过对均匀分布的扫描与解码,能够将二值化过程中的一些不完美之处加以抹除。
      具体实现为:首先在检测线上寻找起始符,寻找到起始符之后,对前半部分进行读取与解码,接着寻找中间分割符,接着对后半部分进行读取与解码,最后寻找终结符,并对整个条码进行首位生成与校验(此处以EAN13格式举例,不同格式不尽相同)。最后,每条线都会存在一个解码结果,所以对其进行投票,只将最高且总比例在有效结果50%以上的结果返回。这一部分我们基于ZXing的算法实现做了一些改进(投票等)。
    • 更换二值化和解码器指的是在为解码成功遍历使用每种解码器和二值化尝试解码。
  • 易语言使用方式
  •   
    窗口程序集名保 留  保 留备 注
    窗口程序集_启动窗口   
    变量名类 型数组备 注
    检测器条码检测器  
    图片多维矩阵  

    子程序名返回值类型公开备 注
    __启动窗口_创建完毕  
    检测器.初始化 (编辑框1.内容, 编辑框2.内容)
    子程序名返回值类型公开备 注
    _按钮1_被单击  
    变量名类 型静态数组备 注
    顶点二维坐标向量f 
    信息文本向量 
    类型条码类型向量 
    视觉_图像读取 (图片.指针, 编辑框3.内容, 1)
    检测器.探测 (图片.指针, 顶点.指针)
    检测器.解码 (图片.指针, 顶点.指针, 信息.指针, 类型.指针)
    ' 检测器.检测和解码 (图片.指针, 信息.指针, 类型.指针)
    编辑框4.内容 = 信息.取数据 (0)


    i支持库列表   支持库注释   
    cv(未知支持库)
    链接:https://pan.baidu.com/s/1VSYkILerRQsoDiIhl-6eTQ 提取码:4ypk




结帖率:40% (2/5)

签到天数: 2 天

发表于 2022-6-11 22:19:37 | 显示全部楼层   浙江省嘉兴市
我下载试了,不准,识别的单号完全不对
回复 支持 反对

使用道具 举报

结帖率:89% (79/89)

签到天数: 11 天

 楼主| 发表于 2022-6-10 08:36:42 | 显示全部楼层   江苏省苏州市
riwsh 发表于 2022-6-9 20:00
这个是免费用,还是要收费使用啊

免费测试
回复 支持 反对

使用道具 举报

结帖率:40% (2/5)

签到天数: 2 天

发表于 2022-6-9 20:00:37 | 显示全部楼层   浙江省杭州市
这个是免费用,还是要收费使用啊
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表