OpenCV识别视频中物体运动并截取保存
功能很简单:输入原始视频,输出视频中有画面变化的部分
适合理解基本框架,可以在这个基础上增加各种酷炫时髦的功能 [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.release
output_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)