Skip to content

条形码检测与解码

在本章中,我们将熟悉 OpenCV 中可用的条形码检测和解码方法。

条形码是在现实生活中识别商品的主要技术。常见的条形码是由黑条和白条按反射率差异极大的方式排列而成的平行线图案。条形码识别是在水平方向上扫描条形码,得到一串由不同宽度和颜色的条组成的二进制码,即条形码的编码信息。通过与各种条形码编码方式进行匹配,可以解码条形码的内容。目前,我们支持 EAN-8、EAN-13、UPC-A 和 UPC-E 标准。

参见 https://en.wikipedia.org/wiki/Universal_Product_Code 和 https://en.wikipedia.org/wiki/International_Article_Number

相关论文:[Xiangmin2015research] , [kass1987analyzing] , [bazen2002systematic]

引入了几种用于条形码识别的算法。

编码时,我们首先需要创建一个 cv::barcode::BarcodeDetector 对象。它主要有三个成员函数,将在下面介绍。

用户可以选择使用超分辨率模型构建条形码检测器,该模型应从 https://github.com/WeChatCV/opencv_3rdparty/tree/wechat_qrcode 下载(sr.caffemodel、sr.prototxt)。

我们需要创建变量来存储输出。

cv::barcode::BarcodeDetector::detect 方法使用一种基于方向相干性的算法。首先,我们计算每个像素的平均平方梯度,[bazen2002systematic] 。然后我们将图像划分为方形图块,并计算每个图块的梯度方向相干性和平均梯度方向。然后,我们连接所有具有高梯度方向相干性和相似梯度方向的图块。在此阶段,我们使用多尺度图块来捕获多尺寸条形码的梯度分布,并应用非极大值抑制来过滤重复的提议。最后,我们使用 cv::minAreaRect 来包围 ROI,并输出矩形的角点。

检测输入图像中的条码,并输出检测到的矩形的角点:

cv::barcode::BarcodeDetector::decode 方法首先(可选地)对图像进行超分辨率放大(如果它小于阈值),对图像进行锐化,然后通过 OTSU 或局部二值化对其进行二值化。然后,它通过匹配指定条形码图案的相似性来读取条形码的内容。

cv::barcode::BarcodeDetector::detectAndDecode 在一次调用中结合了 detect 和 decode。下面的简单示例展示了如何使用此函数:

可视化结果:

原始图像:

检测之后:

barcode_book.jpg barcode_book_res.jpg