OpenCV识别视频中物体运动并截取保存

news/2025/1/15 12:57:45/

功能很简单:输入原始视频,输出视频中有画面变化的部分

适合理解基本框架,可以在这个基础上增加各种酷炫时髦的功能 [doge]

※注释非常保姆级※

import cv2
import numpy as np
import os
from datetime import datetime# 检测两帧之间变化
def detect_motion(frame1,frame2,threshold):# 计算两帧之间的绝对差异  diff=cv2.absdiff(frame1,frame2)# 将差异图像转换为灰度图gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)  # 对灰度图进行高斯模糊,减少噪声  blur=cv2.GaussianBlur(gray,(5,5),0)# 对模糊后的图像进行二值化处理,设置阈值  # thresh为二值化后的差异图像,其中运动物体为白色(255),背景为黑色(0)_,thresh=cv2.threshold(blur,threshold,255,cv2.THRESH_BINARY)return thresh# 保存运动帧
# 参数threshold为差异阈值,当像素差异大于此值时,认为是运动,可自行调整
def save_motion_frames(video_path,output_folder,threshold=25):# 打开视频文件  cap=cv2.VideoCapture(video_path)# 截取视频文件名,去掉扩展名如.mp4等,命名输出文件时用video_name=video_path[-14:-4]# 时-分-秒,命名输出文件时用edit_time=datetime.now().strftime("%H-%M-%S")# 获取视频的帧率和分辨率  # PS:这个参数是每秒有多少帧,可以自己设定,数值增大相当于视频加速fps = cap.get(cv2.CAP_PROP_FPS)  width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))  height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))  # 使用XVID编解码器  fourcc = cv2.VideoWriter_fourcc(*'XVID')  # 创建VideoWriter对象out = cv2.VideoWriter(os.path.join(output_folder, f'{video_name}-{edit_time}.avi'), fourcc,fps, (width, height)) # 读取第一帧# cap.read()可以类比吃豆人,吃掉就向前进,下一口是新的帧ret,prev_frame=cap.read()# 循环读取视频的每一帧  while ret:# 读取下一帧ret,curr_frame=cap.read()# 如果读完则跳出循环if not ret:break# 检测两帧之间有没有变化(即motion中有非零像素)  motion=detect_motion(prev_frame,curr_frame,threshold)# 如果有变化,则把后一帧写入VideoWriter对象if np.any(motion):out.write(curr_frame)# 读取框往后移动一帧,继续循环prev_frame=curr_frame# 释放视频文件out.release()cap.releaseoutput_folder = r"C:\Users\86171\Documents\Temp"  # 输出文件夹路径  
source=input('source file: ') #需要处理的视频文件夹路径
#遍历获取需要处理的视频
videos=[]
for root,dirs,files in os.walk(source):for file in files:file_path = os.path.join(root,file)  videos.append(file_path)
for video_path in videos: 
# 调用函数,保存包含运动的视频片段  save_motion_frames(video_path, output_folder)


http://www.ppmy.cn/news/1347415.html

相关文章

关于数字图像处理考试

我们学校这门科目是半学期就完结哦,同学们学习的时候要注意时间哦。 选择题不用管,到时候会有各种版本的复习资料的。 以下这些东西可能会是大题的重点: 我根据平时代码总结的,供参考 基本操作: 1.读图:…

jmeter-06常用的几种断言方式

文章目录 一、jmeter常用的几种断言二、响应断言1.设置介绍1.1apply to1.2测试字段1.3模糊匹配1.4 测试模式2.举例二、json断言1、响应数据2、断言设置2、postman对比3、断言成功与断言失败的结果图四、持续时间断言1、为什么要做持续时间断言?2、举例

谈谈mybatis的理解(一)

mybatis不允许方法的重载,因为ID不能重复 mybatis 为什么要使用mybatis? JDBC的弊端: 硬编码:SQL语句存在Java代码中,不能很好的分离数据库语句和Java语句,造成代码不易维护 代码重复度高:大量重复的…

Bee V2.2 分库分表 Sharding+MongoDB ORM 稳定版发布 (更新 Maven)

Hibernate/MyBatis plus Sharding JDBC Jpa Spring data GraphQL App ORM (Android, 鸿蒙) Bee 小巧玲珑!仅 860K, 还不到 1M, 但却是功能强大! V2.2 (2024.1.1・LTS 版) 1.Javabean 实体支持继承 (配置 bee.osql.openEntityCanExtendtrue) 2. 增强批…

【杂谈】年尾做了这件事,我后悔了.......

文章目录 前言1. 花钱1.1 购买并安装幻兽帕鲁1.2 阿里云服务器 2. 配置3. 游玩4. 总结与感悟4.1 总结4.2 感悟 后记 幻兽帕鲁多人服务器部署 趁着过年放假,一本正经地玩游戏学习服务器部署啦! 但是,部署完我就后悔了… 前言 作为一名 游戏…

5-4、S加减单片机程序【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】,查看本系列全部文章 摘要:本节介绍实现步进电机S曲线运动的代码 一、目标功能 实现步进电机转动总角度720,其中加减速各90 加速段:加速类型:S曲线  加速角度:角度为90  起步速度…

matlab去图像畸变

Input_path ‘C:\Users\Dell\Desktop\毕业设计\去畸变\Image\1’; Output_path‘C:\Users\Dell\Desktop\毕业设计\去畸变\Image\2’; namelist dir(strcat(Input_path,‘*.jpg’)); %获得文件夹下所有的 .jpg图片 len length(namelist); for i1:len namenamelist(i).name; …

Quicker读取浏览器的书签(包括firefox火狐)

从edge换了火狐,但是quicker不能读取本地的bookmarks文件了,就研究了一下。 方法1:读取本地Bookmarks文件(仅谷歌内核浏览器) 谷歌内核的浏览器本地会有Bookmarks文件,放了所有的书签数据,直接…