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

article/2025/10/16 11:30:21

今天学习运动物体检测
一:帧差法
捕获摄像头的运动的手

import cv2
import numpy as np# 如果我们想捕获一些运动的物体,每一帧图像中,不动的部分称之为背景,运动的物体称之为前景
# 假如我们的视频捕捉窗口是不动的,比如摄像头放着不动,保证了背景是基本不发生变化的,但是我们怎么捕获前景和背景啊?
# 第一部分: 帧差法
# 通过前后两帧的差值来捕捉运动的物体(一般用时间t的帧减去时间t-1的帧),超过某个阈值,则判断是前景,否则是背景
# 这个方法很简单,但是会带来巨大的噪声(微微震动,零星点)和空洞(运动物体非边缘部分也被判断成了背景)cap = cv2.VideoCapture(0)  # 其参数0表示第一个摄像头,一般就是笔记本的内建摄像头。
# cap = cv2.VideoCapture('images/kk 2022-01-23 18-21-21.mp4')  # 来自vedio视频的# 获取第一帧
ret, frame = cap.read()
frame_prev = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 将彩色图像转成灰度图kernel1 = np.ones((5, 5), np.uint8)  # 为了开运算使用
while (1):# 获取每一帧ret, frame = cap.read()if frame is None:print("camera is over...")breakframe = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 将彩色图像转成灰度图diff = frame - frame_prev  # 肯定有一些是负数,全是灰度值的相减diff_abs = cv2.convertScaleAbs(diff)  # 取绝对值,保留我们的差异值_, thresh1 = cv2.threshold(diff_abs, 100, 255, cv2.THRESH_BINARY)  # 二值化处理MORPH_OPEN_1 = cv2.morphologyEx(thresh1, cv2.MORPH_OPEN, kernel1)  # 开运算,去除噪声和毛刺# erosion_it2r_1 = cv2.dilate(MORPH_OPEN_1, kernel1, iterations=2)  # 膨胀操作# cv2.imshow("capture", thresh1)  # 展示该图像cv2.imshow("capture", MORPH_OPEN_1)  # 展示该图像frame_prev = frame  # 更新前一帧# 进行等待或者退出判断if cv2.waitKey(1) & 0xFF == 27:break
cap.release()
cv2.destroyAllWindows()

请添加图片描述

请添加图片描述

捕捉视频的帧,捕获坤坤的打篮球和跳舞

import cv2
import numpy as np# 如果我们想捕获一些运动的物体,每一帧图像中,不动的部分称之为背景,运动的物体称之为前景
# 假如我们的视频捕捉窗口是不动的,比如摄像头放着不动,保证了背景是基本不发生变化的,但是我们怎么捕获前景和背景啊?
# 第一部分: 帧差法
# 通过前后两帧的差值来捕捉运动的物体(一般用时间t的帧减去时间t-1的帧),超过某个阈值,则判断是前景,否则是背景
# 这个方法很简单,但是会带来巨大的噪声(微微震动,零星点)和空洞(运动物体非边缘部分也被判断成了背景)cap = cv2.VideoCapture('images/kk 2022-01-23 18-21-21.mp4')  # 来自vedio视频的# 获取第一帧
ret, frame = cap.read()
frame_prev = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 将彩色图像转成灰度图# kernel1 = np.ones((5, 5), np.uint8)  # 为了开运算使用
while (1):# 获取每一帧ret, frame = cap.read()if frame is None:print("camera is over...")breakframe = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 将彩色图像转成灰度图diff = frame - frame_prev  # 肯定有一些是负数,全是灰度值的相减diff_abs = cv2.convertScaleAbs(diff)  # 取绝对值,保留我们的差异值_, thresh1 = cv2.threshold(diff_abs, 100, 255, cv2.THRESH_BINARY)  # 二值化处理# MORPH_OPEN_1 = cv2.morphologyEx(thresh1, cv2.MORPH_OPEN, kernel1)  # 开运算,去除噪声和毛刺# erosion_it2r_1 = cv2.dilate(MORPH_OPEN_1, kernel1, iterations=2)  # 膨胀操作cv2.imshow("capture", diff_abs)  # 展示该图像# cv2.imshow("capture", thresh1)  # 展示该图像# cv2.imshow("capture", MORPH_OPEN_1)  # 展示该图像frame_prev = frame  # 更新前一帧# 进行等待或者退出判断if cv2.waitKey(24) & 0xFF == 27:break
cap.release()
cv2.destroyAllWindows()

效果如下:
请添加图片描述
请添加图片描述

总体而言,帧差法的效果真的是不忍直视。

二:高斯混合模型(GMM)
在进行前景检测前,先进行背景的学习和训练,对图像的每一个背景采用一个GMM进行模拟,每个背景的混合高斯模型是可以训练的,是自适应的。在测试阶段,对新来的像素进行GMM检测,如果像素值匹配某个高斯模型(进行概率值计算,看看和哪个高斯模型接近,或者看看和均值的偏离程度),则认为是背景,否则认为是前景(剧烈变化的像素,属于异常而原理GMM模型)。由于整个过程中GMM模型在不断的更新学习,多以对动态背景有一定的鲁棒性。

我们的视频中的每一帧的像素点不可能是一成不变的(理想很丰满),总会有空气密度导致的变化,吹一吹风,或者摄像头的微微抖动。但是正常情况下,我们都认为背景中的像素点都是满足一个高斯分布,在一定的概率下抖动是正常的。

我们的背景实际上也应当是多个高斯分布的混合分布,且每个高斯模型也是可以带权重的。因为背景有蓝天,建筑,树木花草,马路等。这些都是一些分布。

至于GMM和EM算法的内容和关系,我们在之前学习过,这里就不再讲述了。EM算法是求解GMM的一个方法。

运用在图像中的话,是怎么做的呢?步骤如下:
1:首先初始化每个高斯模型矩阵参数,初始的方差都是假设的(比如设置为5)。
2:先给T帧图像进行训练GMM,来了第一个像素后把他当成第一个高斯分布,比如作为均值。
3:后面再来一个像素,和当前的高斯分布作对比,如果该像素值和与当前的高斯模型的均值的差值在3倍的方差以内,就认为是属于该高斯分布,并对高斯分布参数进行更新。
4:如果该像素不满足该高斯分布。则用这个新的像素建立一个新的高斯分布(用它做均值,假设一个方差(比如设置为5))。但是一个像素位置不要太多个高斯分布,太多了会造成计算量巨大。3~5个基本够了。

GMM测试步骤:
对于新来的像素值,和GMM的的多个高斯分布的均值分别作比较,其差值在2倍的方差之内,则认为是背景,否则是前景。前景像素点设置为255,背景像素点设置为0,行成了一个二值图像。

import cv2
import numpy as npcap = cv2.VideoCapture('images/kk 2022-01-23 18-21-21.mp4')  # 来自vedio视频的kernel1 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
mog = cv2.createBackgroundSubtractorMOG2()  # 创建混合高斯模型来用于北京建模while (1):# 获取每一帧ret, frame = cap.read()if frame is None:print("camera is over...")breakfmask = mog.apply(frame)  # 判断哪些是前景和背景MORPH_OPEN_1 = cv2.morphologyEx(fmask, cv2.MORPH_OPEN, kernel1)  # 开运算,去除噪声和毛刺contours, _ = cv2.findContours(fmask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)  # 只检测外边框for cont in contours:# 计算各个轮廓的面积len = cv2.arcLength(cont, True)if len > 300:  # 去除一些小的噪声点# 找到一个轮廓x,y,w,h = cv2.boundingRect(cont)# 画出这个矩形cv2.rectangle(frame, (x,y), (x+w, y+h), color=(0,255,0), thickness=3)# 画出所有的轮廓cv2.imshow('frame', frame)cv2.imshow('fmask', fmask)# 进行等待或者退出判断if cv2.waitKey(24) & 0xFF == 27:breakcap.release()
cv2.destroyAllWindows()

效果如下:
请添加图片描述
请添加图片描述
请添加图片描述

三:KNN
也是根据每个像素点的历史信息进行统计额比较,来判断新来的像素值是不是背景。具体的原理后面补充。

import cv2
import numpy as npcap = cv2.VideoCapture('images/kk 2022-01-23 18-21-21.mp4')  # 来自vedio视频的kernel1 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
knn = cv2.createBackgroundSubtractorKNN()  # 创建KNN模型while (1):# 获取每一帧ret, frame = cap.read()if frame is None:print("camera is over...")breakfmask = knn.apply(frame)  # 判断哪些是前景和背景MORPH_OPEN_1 = cv2.morphologyEx(fmask, cv2.MORPH_OPEN, kernel1)  # 开运算,去除噪声和毛刺contours, _ = cv2.findContours(fmask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)  # 只检测外边框for cont in contours:# 计算各个轮廓的面积len = cv2.arcLength(cont, True)if len > 200:  # 去除一些小的噪声点# 找到一个轮廓x,y,w,h = cv2.boundingRect(cont)# 画出这个矩形cv2.rectangle(frame, (x,y), (x+w, y+h), color=(0,255,0), thickness=3)# 画出所有的轮廓cv2.imshow('frame', frame)cv2.imshow('fmask', fmask)# 进行等待或者退出判断if cv2.waitKey(24) & 0xFF == 27:breakcap.release()
cv2.destroyAllWindows()

效果如下:
请添加图片描述
请添加图片描述
请添加图片描述


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

相关文章

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) 您可以通…

100多万个视频短片数据集来啦!

本文经授权转载自 IEEE电气电子工程师学会(ID: IEEE_China) 想象一下,如果我们必须向外星人解释地球上发生的所有行为。我们可以为他们提供非小说类书籍或BBC纪录片。我们可以尝试口头解释什么是电臀舞。但是,实际上,没…

大数据视频课程汇总

1.由于未经视频版权方授权,很可能会被下架,请各位需要的同仁及时下载,如果被下架,请留言说明。 2.视频为大数据梅峰谷整理,所有视频不加密,不收费,不做机构的宣传品,(因为微信和各大…

视频分类数据集介绍

视频分类数据集 在视频分类项目中,有很多经典的公开数据集,目前主要的数据集如列表所示: 重点介绍三个中等规模的数据集。 1. UCF101 动作识别数据集,从youtube收集而得,共包含101类动作。其中每类动作由25个人做动作…