使用Python,OpenCV在视频中进行实时条形码检测

  • 1. 步骤
  • 2. 适用场景及优化
  • 3. 总结
  • 4. 源码
  • 参考

上一篇博客介绍了如何检测和查找图像中的条形码。这篇博客将进行一些优化以检测实时视频中的条形码。

1. 步骤

  • 图像/视频帧中进行条形码检测
  • 驱动程序以访问视频流,并调用条形码检测程序

计算x梯度与y梯度的差值(由于是x减y的,故只能检测横向的条形码,算法并不通用)

2. 适用场景及优化

适用场景:

  1. 静态摄像头,以90度角“向下”看条形码。这将确保程序可以找到条形码图像的梯度区域。
  2. 视频带有条形码的正视角的特写,即智能手机直接放在条形码的上方,而不是将条形码远离镜头。将条形码移离相机的距离越远,简单条形码检测器的成功就越少。

该方法并不适用于所有的条形码检测,仅在最佳条件下有效,并且是横向条形码;
当条形码离相机太远,图像中有太多的“干扰”和“噪音”时,都不会奏效。

优化:
如果要实施更强大的条形码检测算法,则需要考虑图像的方向,或者更好的方法是应用机器学习技术(例如Haar级联或HOG +线性SVM)“扫描”图像以进行条形码区域扫描。

3. 总结

这篇博客拓展了上一篇检测图像中的条形码,主要分为俩部分:

  • 用于检测视频各个帧中的条形码的方法;
  • “驱动程序”,用于访问摄像机或视频文件的方法;

当将其应用于检测视频中的条形码时,并不通用。仅在:

  • 有一个静态相机视图,它以90度角在条形码上“向下看”。
  • 拥有较清晰的,近的条形码的“特写”视图,并且框架视图中没有其他干扰对象或噪声。
    下效果比较好。
    优化可以通过使用机器学习来训练更强壮的条形码检测器。

4. 源码

# USAGE
# python detect_real_barcode.py --video video/video_games.mov
# python detect_real_barcode.py# 导入必要的包
import argparse
import timeimport cv2
import imutils
import numpy as np
from imutils.video import VideoStream# 检测图像中的条形码
def detect(image):# 转换图像为灰度图gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 计算图像x,y方向上的Scharr梯度幅度表示ddepth = cv2.cv.CV_32F if imutils.is_cv2() else cv2.CV_32FgradX = cv2.Sobel(gray, ddepth=ddepth, dx=1, dy=0, ksize=-1)gradY = cv2.Sobel(gray, ddepth=ddepth, dx=0, dy=1, ksize=-1)# 计算x梯度与y梯度的差值(由于是x减y的,故只能检测横向的条形码,算法并不通用),获取到条形码的大致范围gradient = cv2.subtract(gradX, gradY)gradient = cv2.convertScaleAbs(gradient)# 高斯平滑(去掉高频噪音干扰) 阈值化图像(是的图像的黑白区域更加明显,阈值的设置很重要)blurred = cv2.blur(gradient, (9, 9))(_, thresh) = cv2.threshold(blurred, 225, 255, cv2.THRESH_BINARY)# 构建一个闭合内核应用在阈值化的图像上,使得条形码之间的细线空隙更小;kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (21, 7))closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)# 构建一系列腐蚀、膨胀操作(去掉条形码周围的小斑点的干扰,要么消亡,要么生长成为条形码区域;)closed = cv2.erode(closed, None, iterations=4)closed = cv2.dilate(closed, None, iterations=4)# 寻找轮廓cnts = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)cnts = imutils.grab_contours(cnts)# 如果没有轮廓,返回None,认为图像中不存在条形码if len(cnts) == 0:return None# 否则,根据外接圆面积排序,留下最大的轮廓认为是条形码区域c = sorted(cnts, key=cv2.contourArea, reverse=True)[0]rect = cv2.minAreaRect(c)box = cv2.cv.BoxPoints(rect) if imutils.is_cv2() else cv2.boxPoints(rect)box = np.int0(box)# 返回条形码区域的边界框return box# 构建命令行参数及解析
# --video,视频文件的路径
ap = argparse.ArgumentParser()
ap.add_argument("-v", "--video", help="path to the (optional) video file")
args = vars(ap.parse_args())# 如果提供了视频文件,则读取视频文件
if not args.get("video", False):vs = VideoStream(src=0).start()time.sleep(2.0)
# 否则,加载电脑自带的摄像头
else:vs = cv2.VideoCapture(args["video"])# 循环遍历帧
while True:# 获取当前帧# 如果是从视频中VideoStram获取则直接获取当前帧,否则,当前视频流VideoCapture中捕获下一帧frame = vs.read()frame = frame[1] if args.get("video", False) else frame# 检测是否到了视频尾部if frame is None:break# 检测视频帧的条形码box = detect(frame)# 如果检测到了条形码,在其上绘制绿色框if box is not None:cv2.drawContours(frame, [box], -1, (0, 255, 0), 2)# 展示帧,并记录用户是否有按键cv2.imshow("Frame", frame)key = cv2.waitKey(1) & 0xFF# 按下‘q’键,结束循环if key == ord("q"):break# 清除视频流对象的指针
# 如果未使用视频文件,停止视频文件流
if not args.get("video", False):vs.stop()
# 否则,释放摄像头指针
else:vs.release()# 关闭所有展示的窗口
cv2.destroyAllWindows()

参考

  • https://www.pyimagesearch.com/2014/12/15/real-time-barcode-detection-video-python-opencv/

使用Python,OpenCV在视频中进行实时条形码检测相关推荐

  1. 【小白目标检测】手把手教你做视频中的实时目标检测(基于Pelee算法)

    手把手教你做视频中的实时目标检测(基于Pelee算法) 0. 先看效果: 1. 算法详解: 2. 下载源码: 3. 运行检测: 有需求的大佬欢迎加入我的接单群,需求详情请群里戳群主 获取源码或数据集: ...

  2. python+opencv选出视频中一帧再利用鼠标回调实现图像上画矩形框

    最近因为要实现模板匹配,需要在视频中选中一个目标,然后框出(即作为模板),对其利用模板匹配的方法进行检测.于是需要首先选出视频中的一帧,但是在利用摄像头读视频的过程中我唯一能想到的方法就是: 1.在视 ...

  3. python红色的颜色表达式_50行Python代码实现视频中物体颜色识别和跟踪(必须以红色为例)...

    目前计算机视觉(CV)与自然语言处理(NLP)及语音识别并列为人工智能三大热点方向,而计算机视觉中的对象检测(objectdetection)应用非常广泛,比如自动驾驶.视频监控.工业质检.医疗诊断等 ...

  4. python opencv PIL 视频分割成图片 图片合成为视频 修改图片大小(抗锯齿)

    Python代码将原有的视频分割成图片,我的例子是一帧一帧的分割 用python+opencv完成视频的分割 import cv2 #导入opencv模块 print(2) #测试是否运行 vc=cv ...

  5. 数字图像处理二维码识别 python+opencv实现二维码实时识别

    数字图像处理二维码识别 python+opencv实现二维码实时识别 特点: (1)可以实现普通二维码,条形码: (2)解决了opencv输出中文乱码的问题 (3)增加网页自动跳转功能 (4)实现二维 ...

  6. 解决Python OpenCV 读取视频并抽帧出现error while decoding的问题

    解决Python OpenCV 读取视频抽帧出现error while decoding的问题 1. 问题 2. 解决 3. 源代码 参考 1. 问题 读取H264视频,抽帧视频并保存,报错如下: [ ...

  7. OpenCV视频中的人脸标志检测

    OpenCV视频中的人脸标志检测 视频中的人脸标志检测 简介 命令参数说明 源代码 视频中的人脸标志检测 简介 此应用程序使您可以检测视频中检测到的面部的地标.此应用程序首先检测当前视频帧中的面部,然 ...

  8. python图片转视频加特效_使用Python opencv实现视频与图片的相互转换

    因为最近要经常转换数据集进行实验,因此记录一下. 1.视频转图片 即为将视频解析为一帧一帧的图片: import cv2 vc=cv2.VideoCapture("/home/hqd/Pyc ...

  9. PC端视频中语音实时转文字

    PC端视频中语音实时转文字 Win系统语音功能设置 设置哪些软件可以使用麦克风 设置语音输入来源 全局设置 局部软件设置 总结 TOC PC端视频中语音实时转文字 我比较喜欢看视频来学习,特别是那些基 ...

最新文章

  1. 从零开始学OpenDaylight(碳版本)之三:Hello示例
  2. Shell脚本之反引号【``】和 $()
  3. android 8.0手机无法更新版本,安卓手机升级安卓8.0后 系统以后可能都无法回退
  4. CSS(1)——如何使用css选择器
  5. 数据库的显示、创建、使用 、用户授权管理及忘记root用户后重置密码
  6. Info.plist与Prefix.pch修改文件位置遇到的问题及解决方法
  7. 整型变量 默认输出 java_java数据类型详解
  8. java socket编程 聊天_基于java的socket简单聊天编程
  9. Ubuntu 64 测试ODB
  10. python如何编辑pdf_用Python实现一款永久免费的PDF编辑工具
  11. 百度AI市场热品试用 | 迪威泰超薄双目摄像机模组
  12. 物联网小课堂之NB-IoT无线通信中的发射功率和接收灵敏度
  13. 解决ValueError: Cannot run multiple SparkContexts at once; existing SparkContext
  14. progress中的数据库访问
  15. jQuery Cookbook中文版
  16. Django的models无法生成新加的表
  17. linux多系统引导管理,Linux 多重引导MBR与系统引导管理器GRUB.docx
  18. CMakeLists学习二、链接库搜索路径与ld
  19. 解决win10开机出现C:\WIndows\system32\config\systemprofile\Desktop不可用 问题
  20. 201671030109 韩艳艳 实验三作业互评与改进报告

热门文章

  1. 客快物流大数据项目(五十三):实时ETL模块开发准备
  2. 2021年大数据Flink(四十一):​​​​​​​Flink实现订单自动好评
  3. Cocos生命周期回调
  4. 2022-2028年中国即时通讯市场投资分析及前景预测报告
  5. SQL 全角半角转换-(摘抄)
  6. 源文件封装为IP的步骤
  7. Android 悬浮窗口
  8. innodb force recovery
  9. 设计模式之简单工厂模式
  10. Windows Phone 7 Tip (5) -- App liftcycle