OpenCV 4.11.0
开源计算机视觉库
|
兼容性 | OpenCV >= 4.8 |
本章我们将学习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
已经引入了几种条形码识别算法。
编码时,首先需要创建一个 cv::barcode::BarcodeDetector 对象。它主要有三个成员函数,将在下面介绍。
用户可以选择使用超分辨率模型构造条形码检测器,该模型应从 https://github.com/WeChatCV/opencv_3rdparty/tree/wechat_qrcode (sr.caffemodel
, sr.prototxt
) 下载。
catch
(const
std::exception& e)我们需要创建变量来存储输出。
cv::barcode::BarcodeDetector::detect 方法使用基于方向一致性的算法。首先,我们计算每个像素的平均平方梯度, [21] 。然后我们将图像划分为方形块,并计算每个块的**梯度方向一致性**和**平均梯度方向**。然后,我们将所有具有**高梯度方向一致性**和**相似梯度方向**的块连接起来。在这个阶段,我们使用多尺度块来捕捉多尺寸条形码的梯度分布,并应用非最大抑制来过滤重复的建议。最后,我们使用 cv::minAreaRect 来绑定 ROI,并输出矩形的角点。
检测输入图像中的代码,并输出检测到的矩形的角点
cv::barcode::BarcodeDetector::decode 方法首先(可选)对小于阈值的图像进行超比例缩放,锐化图像,然后通过 OTSU 或局部二值化对其进行二值化。然后,它通过匹配指定条形码图案的相似性来读取条形码的内容。
cv::barcode::BarcodeDetector::detectAndDecode 将detect
和decode
组合在一个调用中。下面的一个简单示例展示了如何使用此函数
可视化结果
for
(size_t
i = 0; i < corners.size(); i += 4)const
size_t
idx = i / 4;const
bool
isDecodable = idx < decode_info.size()const
Scalar lineColor = isDecodable ? greenColor : redColor;const
vector< vector<Point> > contours {contour};for
(size_t
j = 0; j < 4; j++)if
(isDecodable)原始图像
检测后