使用Python和OpenCV的视频中的实时条形码检测

您所在的位置:网站首页 Python条形码检测 使用Python和OpenCV的视频中的实时条形码检测

使用Python和OpenCV的视频中的实时条形码检测

2024-06-03 22:53| 来源: 网络整理| 查看: 265

点击此处下载到此帖子的源代码

今天的帖子是之前一篇(非常受欢迎的)文章的后续使用Python和OpenCV检测图像中的条形码.

在前一篇文章中,我们探讨了如何检测和找到条形码图片.但今天我们要重新推荐代码来检测条形码视频.

举个例子,看看下面的截图(用我的网络摄像头拍摄的视频),我拿着这本书的封底现代战争3.成功检测到条形码。

图1:使用Python和OpenCV检测视频流中的条形码。 图1:使用Python和OpenCV检测视频流中的条形码。

注意:非常感谢杰森他在最初的帖子上评论,并提到条形码检测应用于视频将会非常酷。谢谢你的建议!你是100%正确的,看到条码检测应用到视频中真的很酷。

例如,让我们假装我们在12月26日在Gamestop工作。在我们的商店外面有一系列儿童十个街区 - 所有这些都希望返回或交换游戏(显然,他们的父母或亲戚没有正确购买)。

为了加速交换过程,我们被聘请进入青少年海域并通过扫描条形码开始返回/交换过程。但我们有问题 - 寄存器处的激光枪被连接到寄存器的计算机。和弦将无法达到10块长线!

然而,我们有一个计划。我们只需使用我们的智能手机!

使用我们的可信Iphone(或Androids),我们打开我们的相机应用程序,将其设置为视频模式,并进入深渊。

每当我们在相机前面使用条形码的视频游戏盒时,我们的应用程序将检测到它,然后将其转回寄存器。

听起来好得令人难以置信?

好。也许是。毕竟,您可以使用激光条码读取器和无线连接完成相同的任务。当我们在这篇文章中看到我们的方法只有在某些条件下工作。

但我仍然认为这是如何利用OpenCV和Python读取视频中的条形码的良好教程 - 更重要的是,它向您展示了如何将OpenCV函数一起用于构建真实世界的应用程序。

无论如何,继续阅读,学习如何使用OpenCV和Python在视频中检测条形码!

寻找此帖子的源代码? 直接跳到下载部分 使用Python和OpenCV视频中的实时条形码检测

这是我们的计划。我们的视频系统中的条码检测可以分为两个部分:

组件#1:一个处理图像(或在本例中,视频帧)中的条形码检测的模块。幸运的是,我们已经有了这个.我们只需将代码清理一下并将其重新格式化到我们的目的。 组件#2:一种驱动程序,它获得对视频的访问并运行条形码检测模块。

我们将继续使用第一个组件,以检测视频的单帧中的条形码的模块。

组件1:视频帧中的条形码检测

我不会对这个组件进行完整和详尽的代码审查,这在我之前关于图像中的条形码检测的文章中已经处理过了。

但是,我将以完整性提供快速审查(并查看几个小更新)。打开一个新文件,名称它simple_barcode_detection.py.,让我们获得编码:

#导入导入numpy作为np导入cv2导入cv2导入imutils def检测(图像):#将图像转换为灰度灰色= cv2.cvtcolor(图像,cv2.color_bgr2gray)#计算两者中图像#的schar梯度幅度表示#使用opencv 2.4 ddepth = cv2.cv.cv_32f的x和y方向如果imutils.is_cv2()els cv2.cv_32f gradx = cv2.sobel(灰色,ddepth = ddepth,dx = 1,dy = 0,ksize = -1)格雷迪= cv2.Sobel(灰色,ddepth = ddepth,DX = 0,DY = 1,ksize = -1)#从x梯度梯度= cv2.subtract(gradX,格雷迪)梯度= CV2减去y-梯度。转换架构(梯度)#模糊和阈值图像模糊= CV2.BLUR(梯度,(9,9))(_,阈值)= CV2.Threshold(模糊,225,255,CV2.Thresh_Binary)#构建一个关闭内核和关闭内核和它适用于阈值的图像内核= cv2.getStructuringElement(cv2.MORPH_RECT,(21,7))闭合= cv2.morphologyEx(THRESH,cv2.MORPH_CLOSE,内核)#执行一系列腐蚀和膨胀的闭合= cv2.erode(关闭,无,它erations = 4)closed = cv2.dilate(关闭,无迭代= 4)#在阈值图像cnts = cv2.findcontours(closed.copy(),cv2.retr_external,cv2.chain_akprox_simple)中找到cnts = imutils中的轮廓。grab_contours(cnts)#如果没有找到轮廓,如果len(cnts)== 0:返回none#否则,按区域对轮廓进行排序并计算最大轮廓的旋转#界限c =排序(CNT,键= cv2.contourArea,反向=真)[0] = RECT cv2.minAreaRect(c)中框= cv2.cv.BoxPoints(矩形)如果imutils.is_cv2()否则cv2.boxPoints(RECT)BOX = np.int0(框)#返回条形码返回框的边界框

如果你读了上一篇关于图像中的条码检测的文章这段代码看起来应该非常熟悉。

我们要做的第一件事就是导入我们需要的软件包 - Numpy用于数字处理和cv2对于我们的OpenCV绑定。

从这里我们定义探测函数第6行.这个函数接受一个参数图像(或视频的帧)我们想要检测条形码。

第8行转换我们的图像灰度,而行12 - 18找到具有高水平渐变和低垂直渐变的图像区域(再次,如果您在这部分代码上更详细信息,请参阅上一篇关于条码检测的文章)。

然后我们模糊和阈值的图像第21行和22行所以我们可以将形态运作应用于图像第25-30行.这些形态操作用于显示条形码的矩形区域,而忽略图像的其余内容。

现在我们知道条形码的矩形区域,我们发现它的轮廓(或简单地,它的“轮廓”)第33-35行.

如果找不到大纲,那么我们假设图像中没有条形码(第38和39行)。

但是,如果我们在图像中找到轮廓,那么我们将通过它们的区域对轮廓进行排序行43(面积最大的等高线出现在列表的前面)。同样,我们假设面积最大的轮廓是框架的条形码区域。

最后,我们取轮廓并计算其边界框(第44-46行)。这会给我们(x, y)条形码区域的坐标,它将返回给调用函数线49.

现在简单的条形码检测器已经完成,让我们继续讨论组件#2,这个驱动程序将所有东西粘在一起。

组件#2:访问我们的相机以检测视频中的条形码

让我们继续前进以构建驱动程序以检测视频中的条形码。打开一个新文件,名称它detect_barcode.py,并让我们创建第二个组件:

从imutils中导入simple_barcode_detection。视频import VideoStream import argparse import time import cv2 # construct the argument parse and parse the arguments ap = argparse.ArgumentParser() ap.add_argument("-v", "--video", help="path to the (optional) video file") args = vars(ap.parse_args()) # if the video path was not supplied, grab the reference to the # camera if not args.get("video", False): vs = VideoStream(src=0).start() time.sleep(2.0) # otherwise, load the video else: vs = cv2.VideoCapture(args["video"])

再次,我们将通过导入我们需要的包来开始我们的。我放了我们的simple_barcode_detection功能pyimagesearch组织目的模块。然后,我们导入argparse.用于解析命令行参数和cv2对于我们的OpenCV绑定。

行9 - 12处理解析我们的命令行参数。我们需要一个(可选)的开关,——视频,这是桌面视频文件的路径,其中包含我们想要检测的条形码。

注意:此交换机可用于运行此博客文章的源代码中提供的示例视频。通过省略这一点开关您将能够利用笔记本电脑或桌面的网络摄像头。

行16 - 22处理抓取引用到我们的vs喂它是网络摄像头(行16日至18日)或录像档案(第21行和22行)。

既然设置完成了,我们可以继续应用我们的实际条形码检测模块:

#是在框架上保持循环,而true:#获取当前帧,然后掌握帧返回#从“videocapture”或'videoStream'对象,#分别为帧= vs.read()帧=帧[1]如果args.get(“视频”,false)else帧#检查我们是否已到达#视频的末尾,如果帧是无:break#检测图像框中的条形码= simple_barcode_detection.detect(帧)#找到条形码,如果框不是无:cv2.drawContours(帧,[box],-1,(0,255,0),2)#显示帧和记录如果用户则绘制一个边界框按下一个键cv2.imshow(“帧”,帧)键= cv2.waitkey(1)&0xFF#如果按下“Q”键,则停止循环如果键== ORD(“q”):break#if我们没有使用视频文件,如果没有args.get(“视频”,false):vs.stop()#否则,释放相机指针别的:vs.release()#关闭所有Windows CV2.destroyallwindows()

在第25行我们在视频的帧上开始循环 - 此循环将继续运行,直到(1)视频从框架中运行或(2)我们按下问:键盘上的键,并从循环中断。

我们查询我们的vs在第29行,它返回一个2元组。我们处理是否使用VideoStream或者cv2.videocapture.在第30行.

如果帧未成功抓取(例如当我们到达视频文件的末尾),我们将从循环中断第34行和35行.

现在我们已经有了框架,我们可以利用条形码检测模块来检测其中的条形码——这个可以处理第38行我们的边界盒就回到了我们这里。

我们围绕条形码区域绘制结果边界框行42并在屏幕上显示我们的框架线45.

最后,行46-50如果是,请处理从我们的循环中断问:钥匙被按下我们的键盘时第53-61行清除指针指向视频流对象。

所以你可以看到,我们的司机脚本还有很多!

让我们执行这段代码并查看一些结果。

在视频中成功的条形码检测

让我们尝试一些例子。打开终端并发出以下命令:

$ python detect_barcode.py - 视频视频/ video_games.mov

此帖子顶部的视频演示了我们脚本的输出。以下是视频游戏中三个成功的条形码检测中的每一个的屏幕截图:

图2:在视频流中成功检测到三个XBox视频游戏的条形码。 图2:成功检测到视频流中三个XBox游戏的条码。

让我们看看能不能检测到衣服优惠券上的条形码:

$ python detect_barcode.py - 视频视频/优惠券.mov

以下是视频流的截图示例:

图3:另一个使用Python和OpenCV成功的条码检测。 图3:使用Python和OpenCV检测另一个成功的条形码检测。

和输出的完整视频:

当然,就像我说这种方法只在最佳条件下工作(有关限制和缺点的详细说明,请参阅以下部分)。

这是条形码检测不起作用的位置的示例:

图4:不成功的条形码检测。条形码离相机太远。 图4:一个不成功的条形码检测。条形码离相机太远。

在这种情况下,条形码离相机太远,图像中有太多的“干扰”和“噪音”,比如视频游戏盒上的大块文本。

这个例子也显然是一个失败,我只是认为包括:

图5:我的耳朵显然不是条形码。 图5:我的耳朵显然不是条形码。

同样,这个条形码检测的简单实现并不是在所有情况下都有效。它不是一个健壮的解决方案,而是一个示例,说明了简单的图像处理技术如何能够提供令人惊讶的良好结果,前提是满足下一节中的假设。

限制和缺点

因此,正如我们在这篇博客文章中所看到的,我们在图像中检测条形码的方法效果很好如果我们对我们正在检测到条形码的视频进行了一些假设。

这第一次假设我们有一个静态摄像头,它以90度的角度“向下看”条形码。这将确保条形码图像的梯度区域将被我们简单的条形码检测器发现。

这第二个假设是,我们的视频具有条形码的“特写”,这意味着我们正在举行我们的智能手机,直接覆盖条形码,而不是将条形码从远离镜头上拿起。我们将条形码远离相机越远,我们的简单条形码探测器的成功越少。

那么,我们如何改进简单的条形码检测器呢?

好问题。

克里斯托弗·奥伯霍费尔提供了一个关于在QuaggaJS中如何实现健壮的条码检测的伟大回顾.我的朋友Tomasz Malisiewicz博士写了梦幻般的帖子关于如何使用机器学习训练条形码探测器的VMX软件。如果您正在寻找下一步,请务必查看这些帖子!

识别和解码条形码 图6:ZBAR与OpenCV和Python耦合,为Great Raspberry PI条码项目提供。我的名字“AdrianRoseBrock”在此代码128条形码中编码。

今天我们检测到条形码的存在。如果你希望实际上是识别和解码条形码,然后看看下面的博客文章:具有ZBAR的OpenCV条形码和QR码扫描仪.使用名为ZBAR的包,您将能够非常容易地将条形码解码为人类可读文本。

接下来是什么?我建议Pyimagesearch大学. 课程信息: 25总课程•37H 19M视频•上次更新:7/2011 ★★★★★4.84(128分

我强烈相信,如果你有正确的老师,你可以掌握计算机视觉和深度学习。

你认为学习计算机视觉和深度学习是费时的、压倒性的、复杂的吗?或者必须涉及复杂的数学和方程?或者需要计算机科学学位?

那是不是案子。

所有你需要掌握电脑愿景和深度学习的人都是有人向你解释的东西简单,直观条款。这正是我所做的.我的使命是改变教育以及如何教授复杂的人工智能主题。

如果你真的想学习计算机视觉,你的下一站应该是PyImageSearch University,最全面的计算机视觉、深度学习和OpenCV在线课程。在这里你将学习如何成功地和自信地将计算机愿景应用于您的工作,研究和项目。加入我的电脑愿景掌握。

在PyImageSearch University里面你会发现:

✓25课程关于基本的计算机视觉、深度学习和OpenCV主题 ✓完成25次证书 ✓37小时19米按需服务的视频 ✓全新的课程发布每个月,确保您可以跟上最先进的技术 ✓预配置的木星笔记本在谷歌Colab ✓在你的浏览器中运行所有代码示例-适用于Windows, macOS和Linux(不需要配置dev环境!) ✓访问集中式代码回购全部400多个教程在PyImageSearch ✓轻松一键盘下载用于代码、数据集、预训练模型等。 ✓访问移动,笔记本电脑,桌面等。

点击这里加入Pyimagesearch大学

总结

在本博客文章中,我们建造在我们身上之前的代码库检测图像中的条形码.我们将代码扩展为两个组件:

检测视频的单个帧中的条形码的组件。 以及访问摄像机或视频文件的视频feed的“驱动”组件。

然后我们应用我们简单的条形码检测器来检测视频中的条形码。

但是,我们的方法确实有一些假设:

首先假设是我们的静态相机视图,它以90度角在条形码上“俯视”。 第二个假设是我们在帧视图中没有其他干扰物体或噪声的条形码的“关闭”视图。

在实践中,这些假设可能是也可能是不能保证的。这完全取决于您正在开发的应用程序!

至少我希望本文能够向您展示图像处理的一些基础知识,以及如何利用这些图像处理技术来使用Python和OpenCV在视频中构建简单的条形码检测器。

下载源代码和免费的17页资源指南

在下面输入您的电子邮件地址以获得代码和a的.zip计算机愿景,OpenCV和深度学习的免费17页资源指南。里面你会发现我的手工采摘的教程,书籍,课程和图书馆来帮助你掌握CV和DL!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3