OpenCV-Python视频分析(移动物体检测,物体追踪)

article/2025/10/16 11:29:19

1.概述

该文章介绍OpenCV-Python中关于视频分析的两个主要内容,分别为:

  • 🐟背景差分法移动物体检测
  • 🐟Meanshift和Camshift算法物体追踪

PS:视频分析还要一个重要的内容:光流法运动轨迹绘制,在以后的文章中介绍。

2.原理介绍

2.1背景差分法移动物体检测

静态摄像机拍摄的画面,大部分场景是没有变化的,并且这部分一般不需要被特别关注。与此对应的视频中的动态物体更值得关注和分析。

背景差分法原理上非常简单,就是将当前的画面与背景做减法,减去没有变化的背景,留下场景中变化的物体(一般是运动的),借用官网的一张图片便于理解。

 

因此该算法较为关键的一部分就是背景图片的构建,它包含两部分,分别为①初始化背景,②背景更新。但是这两步在OpenCV-Python中都不需要自己书写代码,createBackgroundSubtractor()就可以生成相关算法的对象,下面两句是在不同算法下的背景蒙版分别为MOG2和KNN,他们用法相同,使用apply()方法逐帧输入图片即可,从结果来看,KNN效果要更好一点。

#下面两行二选一
#backSub = cv.createBackgroundSubtractorMOG2()
backSub = cv.createBackgroundSubtractorKNN()
fgMask = backSub.apply(frame)

提取背景蒙版之后,使用简单的代码就可以完成目标的提取也就是:

Deobject=cv.add(frame,frame,mask=fgMask)

相关步骤显示效果如:

 

 

原图

背景蒙版

目标提取

2.2Meanshift和Camshift算法对物体追踪

Meanshift可以翻译为均值偏移,Camshift全称为Continuously Apative Mean-Shift,是Meanshift改进。

首先介绍Meanshift,它实际上是以要追踪物体的直方图作为参照,在每个图形的下一帧,搜索物体附近区域,如果找到与该物体直方图相似度很大的区域,就把他判定为该物体继续追踪。因此在该算法中,需要经过一下几个步骤。如下图:

  • 在第一帧中选定要追踪物体的区域
  • 将色彩转化为HSV,然后生成直方图
  • 在下一帧中找到与当前直方图相似的区域,将该区域划定为要追踪的物体。这一步用到了cv.CamShift(probImage, window, criteria),它的三个参数分别为直方图反投影、物体所在窗口,算法停止标准
  • 继续下一帧搜索追踪。

下面介绍Camshift,它主要解决了Meanshift的一个问题,就是Meanshift的窗口大小是固定的,由于视频的物体都有近大远小的特点,因此如果物体在镜头前后移动,算法识别准确率不高,Camshift考虑到了这一问题,它会在Meanshift匹配率低的时候,对窗口大小进行调整,详细步骤在代码中介绍。

效果对比:

初始图像

算法

跟踪结果

 

Meanshift

 

Camshift

 

3.代码分析

环境配置见文章OpenCv-Python图像特征识别_Matrix_CS的博客-CSDN博客

3.1背景差分法移动物体检测

该方法使用Open-CV中的BackgroundSubtractor,自动进行背景生成和背景更新,最后使用背景蒙版和原始图像做运算,将运动物体提取出来。

from __future__ import print_function
import cv2 as cv
import argparse'''
该代码尝试使用背景差分法,完成了固定摄像头中,动态物体的提取。
'''
#有两种算法可选,KNN和MOG2,下面的代码使用KNN作为尝试
algo='KNN'
if algo == 'MOG2':backSub = cv.createBackgroundSubtractorMOG2()
else:backSub = cv.createBackgroundSubtractorKNN()
#打开一个视频文件
capture = cv.VideoCapture(cv.samples.findFileOrKeep('vtest.avi'))
#判断视频是否读取成功
if not capture.isOpened():print('Unable to open')exit(0)
#逐帧读取视频,进行相关分析
while True:#读取视频的第一帧ret, frame = capture.read()if frame is None:break#使用定义的backSub对象,输入新的一帧frame,生成背景蒙版fgMask = backSub.apply(frame)#将原视频的当前帧和蒙版做相加运算,将前景物体提取出来Object=cv.add(frame,frame,mask=fgMask)#展示视频中的物体,三个窗口分别表示原视频、背景、移动目标cv.imshow('Frame', frame)cv.imshow('FG Mask', fgMask)cv.imshow('Object',Object)#每帧展示结束,等待30毫秒keyboard = cv.waitKey(30)#按q推出程序if keyboard == 'q' or keyboard == 27:break

3.2 Meanshif算法对物体追踪

使用Meanshif算法对物体进行追踪,根据要追踪物体的直方图特征,查询运动物体周围图像,进行匹配,返回移动后的物体位置。

import numpy as np
import cv2 as cv
import argparse
'''
使用Meanshift算法,对视频中的指定物体进行追踪
'''cap = cv.VideoCapture('slow_traffic_small.mp4')
#对显示窗口命名
cv.namedWindow('image')
#读取视频第一帧
ret,frame = cap.read()
#定义一个范围作为要追踪的物体,在这选取的是一辆车
x, y, w, h = 306, 194, 80, 40
track_window = (x, y, w, h)
# 从第一帧frame中,把范围中的图片提取出来
roi = frame[y:y+h, x:x+w]
# 转化为hsv颜色,因为画直方图一般会用这个色彩格式
hsv_roi =  cv.cvtColor(roi, cv.COLOR_BGR2HSV)
#生成一个蒙版,把不在范围内的颜色筛去
mask = cv.inRange(hsv_roi, np.array((0., 60.,32.)), np.array((180.,255.,255.)))
#生成直方图
roi_hist = cv.calcHist([hsv_roi],[0],mask,[180],[0,180])
#进行直方图归一化
cv.normalize(roi_hist,roi_hist,0,255,cv.NORM_MINMAX)
# 设置终止标准,10 次迭代或移动至少 1 像素
term_crit = ( cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 1 )
while(1):#读取视频下一帧ret, frame = cap.read()#ret用来判断视频是否读取成功if ret == True:#保持跟上面一致的色彩格式hsvhsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)#这一步计算hist的反投影,是为了下面作为输入便于读取dst = cv.calcBackProject([hsv],[0],roi_hist,[0,180],1)# 使用meanShift找到匹配的窗口ret, track_window = cv.meanShift(dst, track_window, term_crit)#下面的代码就是用一个矩形框把识别到的物体圈出来x,y,w,h = track_windowimg2 = cv.rectangle(frame, (x,y), (x+w,y+h), 255,2)cv.imshow('image',img2)#等待30毫秒,按ESC退出k = cv.waitKey(30) & 0xffif k == 27:breakelse:break

3.3 Camshift算法对物体追踪

该方法是对Meanshif算法的改进,窗口大小可以根据物体移动进行调整,代码和Meanshif算法十分类似。

import numpy as np
import cv2 as cv
import argparse
'''
使用CamShift算法跟踪物体,该算法改进了MeanShift,它的窗口大小会进行自定义调整
'''
#打开视频
cap = cv.VideoCapture('slow_traffic_small.mp4')
#读取视频第一帧
ret,frame = cap.read()
#定义一个范围作为要追踪的物体,在这选取的是一辆车
x, y, w, h = 306, 194, 80, 40 # simply hardcoded the values
track_window = (x, y, w, h)
# 从第一帧frame中,把范围中的图片提取出来
roi = frame[y:y+h, x:x+w]
# 转化为hsv颜色,因为画直方图一般会用这个色彩格式
hsv_roi =  cv.cvtColor(roi, cv.COLOR_BGR2HSV)
#生成一个蒙版,把不在范围内的颜色筛去
mask = cv.inRange(hsv_roi, np.array((0., 60.,32.)), np.array((180.,255.,255.)))
#生成直方图
roi_hist = cv.calcHist([hsv_roi],[0],mask,[180],[0,180])
#进行直方图归一化
cv.normalize(roi_hist,roi_hist,0,255,cv.NORM_MINMAX)
# 设置终止标准,10 次迭代或移动至少 1 像素
term_crit = ( cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 1 )
while(1):#读取视频下一帧ret, frame = cap.read()#ret用来判断视频是否读取成功if ret == True:# 保持跟上面一致的色彩格式hsvhsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)# 这一步计算hist的反投影,是为了下面作为输入便于读取dst = cv.calcBackProject([hsv],[0],roi_hist,[0,180],1)# 使用CamShift找到匹配的窗口ret, track_window = cv.CamShift(dst, track_window, term_crit)#下面的代码就是用一个四边形把识别到的物体框出来pts = cv.boxPoints(ret)pts = np.int0(pts)img2 = cv.polylines(frame,[pts],True, 255,2)cv.imshow('img2',img2)k = cv.waitKey(30) & 0xff# 等待30毫秒,按ESC退出if k == 27:breakelse:break


http://chatgpt.dhexx.cn/article/oLeNGA2n.shtml

相关文章

百度EasyDL物体检测在安卓上测试

EasyDL:EasyDL定制化模型 1.创建模型。 2.创建数据集,上传图片。 3.标注图片 。 4.训练数据 5.发布模型 6.APP部署测试 7.APP上测试

基于OpenCV实战:动态物体检测

点击上方“小白学视觉”,选择加"星标"或“置顶” 重磅干货,第一时间送达最近,闭路电视安全系统运行着多种算法来确保安全,例如面部识别,物体检测,盗窃检测,火灾警报等。我们在运动检测…

【opencv学习】【运动物体检测】

今天学习运动物体检测 一:帧差法 捕获摄像头的运动的手 import cv2 import numpy as np# 如果我们想捕获一些运动的物体,每一帧图像中,不动的部分称之为背景,运动的物体称之为前景 # 假如我们的视频捕捉窗口是不动的,…

K210物体检测(利用Maixpy、在线模型训练、串口通信)

无论从性能还是价格上,K210都给我带来了很多惊喜。搭载了Maixpy的K210开发非常便利,加上Maixhub的加持,使得K210的生态更加完善。Maixpy完全兼容openmv,在拥有openmv的基础上,短时间内就可以上手K210。 目录 前言一、烧…

小样本物体检测

Few-shot Object Detection via Feature Reweighting(MetaYOLO) 出发点:不同属性以不同的权重组合,可以定义一个类别,所以检测特征是否属于某一类,只要检测特征对属性的响应度就可以。特征 —> 属性 —…

自动驾驶:MOD 移动物体检测概述

MOD全称为Moving Object Detection,中文“移动物体检测”。主要的作用是泊车时,周围有人或物体经过探测区域被检测到给驾驶员声音和视觉提醒。 以NISSAN MOD为例说明下基于环视相机的MOD系统: nissan 官网:​​​​​​Moving O…

UGUI射线检测与普通物体检测

UGUI物体检测与普通物体检测有所不同(UGUI射线检测已经被封装好): 1.Graphic Raycaster 主要用于UI上的射线检测,挂有这个组件的物体,必须要挂上Canvas这个组件(当挂上Graphic Raycaster时Canvas也会自动挂上)。 Ig…

多物体检测 RCNN

基于R-CNN的物体检测 原文地址:http://blog.csdn.net/hjimce/article/details/50187029 作者:hjimce 一、相关理论 本篇博文主要讲解2014年CVPR上的经典paper:《Rich feature hierarchies for Accurate Object Detection and Segmentation》…

自动驾驶感知——激光雷达物体检测算法

文章目录 1. 基于激光雷达的物体检测1.1 物体检测的输入与输出1.2 点云数据库1.3 激光雷达物体检测算法1.3.1 点视图1.3.1.1 PointNet1.3.1.2 PointNet1.3.1.3 Point-RCNN1.3.1.4 3D-SSD1.3.1.5 总结和对比 1.3.2 俯视图1.3.2.1 VoxelNet1.3.2.2 SECOND1.3.2.3 PIXOR1.3.2.4 AF…

物体检测之YOLO系列

业界对于目标检测的热度只增不减,但目前的框架也难于逾越RCNN系列、SSD、YOLO系列这三座大山,很多新的方法也是在此基础上做一些改进,所以有必要做一些整理,方便自己后续查看,这里先对YOLO系列做一些整理。没看过文章的…

物体检测难点 (多尺度检测, 遮挡与拥挤)

目录 多尺度检测降低下采样率与空洞卷积Anchor 设计多尺度训练 (Multi Scale Training,MST)特征融合尺度归一化: SNIP (Scale Normalization for Image Pyramids)Image Classification at Multiple ScalesData Variation or Correct Scale?Object Detection on an …

点云物体检测简介

点击上方“3D视觉工坊”,选择“星标” 干货第一时间送达 本文由知乎作者Leon Wu授权转载,不得擅自二次转载。原文链接:https://zhuanlan.zhihu.com/p/81474133 深度学习的开始 人类的大脑是一个神秘的器官,它由无数的神经细胞组成…

物体检测

计算机视觉中目标检测、跟踪、识别是最基本的几个task,尤其又以检测最为重要和基础。同时基本上所有的检测任务都需要在给出物体的bounding box之后,给出物体的类别(也就是给识别物体),所以文章中不区分检测和识别任务…

实时3D物体检测

谷歌发布的MediaPipe Objectron,是一个可以实时检测3D物体检测的模型框架,先在2D图像上检测物体,然后估算出3D坐标。 尽管目前2D物体检测已经相对成熟,但3D检测仍然是个挑战性的问题,主要是缺少大量有效的数据用于训练…

物体检测实战:使用 OpenCV 进行 YOLO 对象检测

使用 OpenCV 进行 YOLO 对象检测 本文将教你如何使用YOLOV3对象检测器、OpenCV和Python实现对图像和视频流的检测。用到的文件有yolov3.weights、yolov3.cfg、coco.names,这三个文件的github链接如下: GitHub - pjreddie/darknet: Convolutional Neura…

传统物体检测

传统物体检测 1. 特征2. 模板匹配3. 颜色直方图4. 空间分拣5. 梯度特征6. HOG 特征7. 特征融合8. 搭建分类器8.1 数据标注8.2 数据预处理8.3 训练分类器8.4 交叉验证 9. 滑动窗口9.1 多尺度窗口9.2 Hog子采样窗口搜索(Hog Sub-sampling Window Search) 10. Multiple Detections…

计算机视觉之旅-进阶-物体检测

1. 物体检测概念 计算机视觉中的物体检测是指在图像中检测和定位特定目标对象,它是计算机视觉中一个基本而又重要的问题。 物体检测的目的就是在输入图像中检测所关心的目标对象,并给出其边界框和类别信息。典型的输出包括: - 边界框:表示目标对象在图像中的位置和大小。常用…

物体检测技术的简单介绍

1. 物体检测技术概念 物体检测技术,通常是指在一张图像中检测出物体出现的位置及对 应的类别,主要包括物体类别、 x m i n x_{min} xmin​、 y m i n y_{min} ymin​、 x m a x x_{max} xmax​与 y m a x y_{max} ymax​。它是一项非常基础的任 务&…

Opencv项目实战:05 物体检测

1,效果展示 为此,我专门还去查了查,怎么将视频转化为gif图,不知不觉中,我又多学会了一项技能。 OK!cool,效果很不错,今天需要搭配一些文件,都是可以从官网里找到的,那么我为了方便,专门去学习怎么在GitHub上托管项目,还下载了VScode和Git,我太难受了,如果不是要写…

百万youtube高清视频数据集采集

HD-VILA-100M是什么? HD-VILA-100M是一个大规模、高分辨率、多样化的视频语言数据集,有助于多模态表示学习。 数据统计 该数据集共包含330万个视频,视频质量较高,均衡分布在15个类别中。 下载(Download) 您可以通…