自学内容网 自学内容网

人像视频帧率调整和视频裁剪(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)!