基于OpenCV的条形码检测
发布时间:2021-05-27 15:02:29
在日常生活中,经常会看到条形码的应用,比如超市买东西的生活,图书馆借书的时候... ...
那么这些东西是如何做到准确检测出条形码的位置呢?
这就是今天要介绍的内容了。
这篇文章的目标是演示使用计算机视觉和图像处理技术实现条形码的检测。
通过本篇文章的学习,我们能学到的内容包括:
1、图像处理中常用的一些操作流程,包括滤波、阈值化处理、膨胀、腐蚀和轮廓查找等
2、更重要的一点,希望通过这个案例,能够帮助大家建立分析问题和处理问题的思路
需要注意的是,这个算法并不适用于所有的条形码,但是它应该能给你一个基本的直觉,告诉你应该应用什么类型的技术。
对于下面这个例子,我们将检测下图中的条形码:
目标:
找到条形码的位置,而去除掉干扰的因素。
思路:
利用条形码的自身特点,一般都是矩形形状,而且条码的条带是黑色的,矩形区域是白色的。
首先,需要搭建好需要的开发环境,Opencv,Qt5.9或Vs2017。
接下来写代码:
首先将需要的头文件添加到项目中,并将要识别的图片路径添加进来。
接下来进行实际的图像处理:
首先我们先读入图片并将其转换为灰度图;
然后我们使用Scharr操作符去构造图片在水平和垂直方向上的梯度幅值表示。
这里,我们用Scharr算子的x方向梯度减去y方向的梯度。通过这个相减操作,我们就只剩下了高水平梯度和低垂直梯度的图像区域。
我们上述原始图像的梯度表示如下图所示
请注意梯度操作是如何检测出图片的条形码区域的。接下来的步骤是如何过滤掉图片中的噪声,重点关注条形码区域。
我们做的第一件事是使用一个卷积核大小为9x9的均值滤波作用于梯度图片。对图片进行这个操作将有助于平滑图片中的高频噪声。
然后我将模糊化后的图片进行阈值化,在梯度图片中,所有的像素点的灰度值低于120的将设为0(黑色),其余设为255(白色)。
模糊和阈值化处理后的输出结果如下:
然而,正如你所看到的上图阈值化图片,在条形码的垂直方向上存在这间隙。为了缩小这些间隙,并使得我们的算法更加容易的检测出条形码的“斑点”状区域,我们需要执行一些基础的形态学操作:
我们通过使用函数cv2.getStructuringElement构造一个矩形核。这个核的宽度大于高度,因此允许我们缩小条形码垂直条带之间的间隙。
当然,现在图片中非条形码的区域存在着很多斑点,这将会干扰轮廓的检测。
现在,我们继续尝试移除这些小的斑点。
我们现在要做的是进行6次腐蚀操作,然后再进行6次膨胀操作。腐蚀操作将会“腐蚀”掉图片中的白色像素点,因此将会清除这些小的斑点,而膨胀操作将会“扩张”剩余的白色像素,并使白色区域变长。
如果在腐蚀过程中去除了小的斑点,则在膨胀的过程中不会再次出现。
在一系列的腐蚀和膨胀操作之后,这些小斑点已经被成功的移除了,只剩下条形码的区域。
最后寻找一下图片中条形码的区域的轮廓。
幸运的是,OpenCV中提供了相应的接口,可以很容易地找到图像中的最大轮廓,如果我们正确地完成了图像处理步骤,它应该会对应于条形码区域。
然后,我们确定最大轮廓的最小的边界框,并最后显示检测到的条形码。
正如我们下图所示,我们已经成功的检测到条形码
这样,条形码的检测就已经完成了!
想了解更多嵌入式知识就来西安盛图科技!
- 上一篇:Android 界面布局-LinearLayout
- 下一篇:什么是去中心化