人像视频帧率调整和视频裁剪(cpu版)
这段代码主要用于处理视频,包括人脸检测、帧率调整和视频裁剪等功能。下面是对每个部分的详细解释:
import cv2
import os
from tqdm import tqdm # 进度条
# 加载人脸检测模型
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
这部分代码导入了所需的库,并加载了OpenCV的人脸检测模型。
def contains_face(frame):
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
return len(faces) > 0
contains_face
函数用于检测给定帧中是否包含人脸。
def crop_center(frame, crop_width, crop_height):
height, width = frame.shape[:2]
start_x = width//2 - crop_width//2
start_y = height//2 - crop_height//2
return frame[start_y:start_y+crop_height, start_x:start_x+crop_width]
crop_center
函数用于从给定帧的中心裁剪出指定大小的区域。
def process_video(path, out_path, fps=25):
print(f'[INFO] ===== process video from {path} to {out_path} =====')
# 创建VideoCapture对象
cap = cv2.VideoCapture(path)
# 检查是否成功打开视频
if not cap.isOpened():
print("Error opening video file")
return
process_video
函数用于处理视频。首先,它创建一个cv2.VideoCapture
对象来读取输入视频。
frame_rate = cap.get(cv2.CAP_PROP_FPS)
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) # 获取视频的总帧数
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) # 获取视频的宽度
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 获取视频的高度
print("原视频帧率=", frame_rate, "fps")
print("原视频帧数=", total_frames)
print("原视频尺寸=", frame_width, "x", frame_height)
if frame_rate != fps:
cap.set(cv2.CAP_PROP_FPS, fps)
frame_rate = fps
然后,它获取视频的帧率、总帧数、宽度和高度,并打印这些信息。如果视频的帧率不等于指定的帧率,它将视频的帧率设置为指定的帧率。
# 创建VideoWriter对象
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter(out_path, fourcc, fps, (512, 512))
接下来,它创建一个cv2.VideoWriter
对象,用于写入处理后的视频。
frame_count = 0
# 创建一个tqdm进度条
pbar = tqdm(total=total_frames, ncols=70, unit='frame')
while cap.isOpened():
ret, frame = cap.read()
if ret:
if contains_face(frame) and frame_count % (frame_rate // fps) == 0:
frame = crop_center(frame, 512, 512)
out.write(frame)
frame_count += 1
pbar.update(1) # 更新进度条
else:
break
pbar.close() # 关闭进度条
cap.release()
out.release()
然后,它开始读取视频的每一帧。对于每一帧,如果该帧包含人脸并且满足抽帧条件,它将从帧的中心裁剪出指定大小的区域,并将裁剪后的帧写入到输出视频中。
print(f'[INFO] ===== processed video =====')
# 打开处理后的视频,获取总帧数、帧率和视频尺寸
cap_out = cv2.VideoCapture(out_path)
total_frames_out = int(cap_out.get(cv2.CAP_PROP_FRAME_COUNT))
frame_rate_out = cap_out.get(cv2.CAP_PROP_FPS)
frame_width = int(cap_out.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap_out.get(cv2.CAP_PROP_FRAME_HEIGHT))
print(f'处理后的视频帧率: {frame_rate_out} fps')
print(f'处理后的视频帧数: {total_frames_out}')
print(f'处理后的视频尺寸: {frame_width}x{frame_height}')
cap_out.release()
最后,它打开处理后的视频,获取总帧数、帧率和视频尺寸,并打印这些信息。
if __name__ == "__main__":
# 获取当前Python文件的路径
current_path = os.path.dirname(os.path.realpath(__file__))
# 构造mp4文件的路径
input_path = os.path.join(current_path, '..', 'video.mp4')
output_path = os.path.join(current_path, '..', 'video.mp4')
process_video(input_path, output_path)
如果直接运行这个Python文件,它将处理指定的输入视频,并将处理后的视频保存到指定的输出路径。
原文地址:https://blog.csdn.net/Ppandaer/article/details/140146263
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!