欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

食品上面的条形码是干嘛的?看我用Open CV来检测一下!

程序员文章站 2022-03-18 16:53:14
当然,媒体也无济于事,他们将危言耸听每一个小场景。从冻伤的家庭在寒风中露营整晚,到瞒姗老太在大门打开后被蜂拥而入的低价抢购人群踩踏,就像侏罗纪公园中似鸡龙的蹂躏。这所有的一切只是因为她想为9岁的孙女蒂米买到最新的光晕游戏,而蒂米的父母,在去年的这个时候离世了,就在沃尔玛,在这黑色星期五。 用 Pyt ......

食品上面的条形码是干嘛的?看我用Open CV来检测一下!

食品上面的条形码是干嘛的?看我用Open CV来检测一下!

当然,媒体也无济于事,他们将危言耸听每一个小场景。从冻伤的家庭在寒风中露营整晚,到瞒姗老太在大门打开后被蜂拥而入的低价抢购人群踩踏,就像侏罗纪公园中似鸡龙的蹂躏。这所有的一切只是因为她想为9岁的孙女蒂米买到最新的光晕游戏,而蒂米的父母,在去年的这个时候离世了,就在沃尔玛,在这黑色星期五。

食品上面的条形码是干嘛的?看我用Open CV来检测一下!

食品上面的条形码是干嘛的?看我用Open CV来检测一下!

用 Python 和 OpenCV 检测图片上的的条形码

这篇博文的目的是应用计算机视觉和图像处理技术,展示一个条形码检测的基本实现。我所实现的算法本质上基于* 上的这个问题,浏览代码之后,我提供了一些对原始算法的更新和改进。

首先需要留意的是,这个算法并不是对所有条形码有效,但会给你基本的关于应用什么类型的技术的直觉。

假设我们要检测下图中的条形码:

食品上面的条形码是干嘛的?看我用Open CV来检测一下!

图1:包含条形码的示例图片

现在让我们开始写点代码,新建一个文件,命名为detect_barcode.py,打开并编码:

食品上面的条形码是干嘛的?看我用Open CV来检测一下!

我们首先做的是导入所需的软件包,我们将使用NumPy做数值计算,argparse用来解析命令行参数,cv2是OpenCV的绑定。

然后我们设置命令行参数,我们这里需要一个简单的选择,–image是指包含条形码的待检测图像文件的路径。

现在开始真正的图像处理:

食品上面的条形码是干嘛的?看我用Open CV来检测一下!

12~13行:从磁盘载入图像并转换为灰度图。

17~18行:使用Scharr操作(指定使用ksize = -1)构造灰度图在水平和竖直方向上的梯度幅值表示。

21~22行:Scharr操作之后,我们从x-gradient中减去y-gradient,通过这一步减法操作,最终得到包含高水平梯度和低竖直梯度的图像区域。

上面的gradient表示的原始图像看起来是这样的:

食品上面的条形码是干嘛的?看我用Open CV来检测一下!

食品上面的条形码是干嘛的?看我用Open CV来检测一下!

25行:我们要做的第一件事是使用9*9的内核对梯度图进行平均模糊,这将有助于平滑梯度表征的图形中的高频噪声。

26行:然后我们将模糊化后的图形进行二值化,梯度图中任何小于等于255的像素设为0(黑色),其余设为255(白色)。

模糊并二值化后的输出看起来是这个样子:

食品上面的条形码是干嘛的?看我用Open CV来检测一下!

食品上面的条形码是干嘛的?看我用Open CV来检测一下!

29行:我们首先使用cv2.getStructuringElement构造一个长方形内核。这个内核的宽度大于长度,因此我们可以消除条形码中垂直条之间的缝隙。

30行:这里进行形态学操作,将上一步得到的内核应用到我们的二值图中,以此来消除竖杠间的缝隙。

现在,你可以看到这些缝隙相比上面的二值化图像基本已经消除:

食品上面的条形码是干嘛的?看我用Open CV来检测一下!

食品上面的条形码是干嘛的?看我用Open CV来检测一下!

我们这里所做的是首先进行4次腐蚀(erosion),然后进行4次膨胀(dilation)。腐蚀操作将会腐蚀图像中白色像素,以此来消除小斑点,而膨胀操作将使剩余的白色像素扩张并重新增长回去。

如果小斑点在腐蚀操作中被移除,那么在膨胀操作中就不会再出现。

经过我们这一系列的腐蚀和膨胀操作,可以看到我们已经成功地移除小斑点并得到条形码区域。

食品上面的条形码是干嘛的?看我用Open CV来检测一下!

食品上面的条形码是干嘛的?看我用Open CV来检测一下!

食品上面的条形码是干嘛的?看我用Open CV来检测一下!

食品上面的条形码是干嘛的?看我用Open CV来检测一下!

图6:成功检测到示例图像中的条形码

下一部分,我们将尝试更多图像。

成功的条形码检测

要跟随这些结果,请使用文章下面的表单去下载本文的源码以及随带的图片。

一旦有了代码和图像,打开一个终端来执行下面的命令:

$python detect_barcode.py --image images/barcode_02.jpg

食品上面的条形码是干嘛的?看我用Open CV来检测一下!

图7:使用OpenCV检测图像中的一个条形码

检测椰油瓶子上的条形码没有问题。

让我们试下另外一张图片:

$ python detect_barcode.py --image images/barcode_03.jpg

食品上面的条形码是干嘛的?看我用Open CV来检测一下!

食品上面的条形码是干嘛的?看我用Open CV来检测一下!

食品上面的条形码是干嘛的?看我用Open CV来检测一下!

食品上面的条形码是干嘛的?看我用Open CV来检测一下!

食品上面的条形码是干嘛的?看我用Open CV来检测一下!

图10:使用计算机视觉和图像处理检测包裹上的条形码

我们的算法再次成功检测到条形码。

最后,我们再尝试一张图片,这个是我最爱的意大利面酱—饶氏自制伏特加酱(Rao’s Homemade Vodka Sauce):

$python detect_barcode.py --image images/barcode_06.jpg

食品上面的条形码是干嘛的?看我用Open CV来检测一下!

食品上面的条形码是干嘛的?看我用Open CV来检测一下!

源码下载:http://pan.baidu.com/s/1jGMfcBs

欢迎关注我的博客哦:https://home.cnblogs.com/u/sm123456/

 欢迎加入千人交流,资源共享群:125240963