人脸检测+调整分辨率+调整帧率

  1. 初始检测:只在视频的前几秒内进行一次人脸检测,以确定主持人的大致位置。
  2. 计算裁剪框:基于检测到的主持人位置,计算一个以主持人面部为中心的固定裁剪框。
  3. 视频裁剪:使用计算出的裁剪框对整个视频进行裁剪,将视频分辨率调整为512x512。 帧率调整:将视频帧率调整至25fps。
  4. 音频保留:确保裁剪和帧率调整后的视频音频与原视频同步。

以下是优化后的代码:

import cv2
import numpy as np
import face_recognition
from moviepy.editor import VideoFileClip, AudioFileClip
from tqdm import tqdm

def find_host_face_location(video_path):
    """ 在视频的前几秒内检测并返回主持人面部的大致位置 """
    cap = cv2.VideoCapture(video_path)
    found_face = False
    
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break
        
        # 缩小帧尺寸以加快处理速度
        small_frame = cv2.resize(frame, (0, 0), fx=0.25, fy=0.25)
        rgb_small_frame = small_frame[:, :, ::-1]
        
        # 检测人脸
        face_locations = face_recognition.face_locations(rgb_small_frame)
        
        if face_locations:
            # 取第一张脸的位置,假设主持人位于视频画面的中心位置附近
            host_face_location = face_locations[0]
            # 将位置放大回原始大小
            host_face_location = (host_face_location[0]*4, host_face_location[1]*4, host_face_location[2]*4, host_face_location[3]*4)
            found_face = True
            break
        
        # 如果已经处理了前10秒的视频,且没有找到人脸,则退出循环
        if cap.get(cv2.CAP_PROP_POS_MSEC) > 10000:
            break
    
    cap.release()
    return host_face_location if found_face else None

def calculate_cropping_box(face_location, frame_shape):
    """ 根据主持人面部位置计算裁剪框 """
    top, right, bottom, left = face_location
    center_x, center_y = (left + right) // 2, (top + bottom) // 2
    half_width, half_height = 256, 256
    
    left_cropped = max(center_x - half_width, 0)
    top_cropped = max(center_y - half_height, 0)
    right_cropped = min(center_x + half_width, frame_shape[1])
    bottom_cropped = min(center_y + half_height, frame_shape[0])
    
    return (top_cropped, right_cropped, bottom_cropped, left_cropped)

def process_video(input_path, output_path):
    """ 处理视频,裁剪并调整帧率 """
    # 检测主持人面部位置
    host_face_location = find_host_face_location(input_path)
    if host_face_location is None:
        print(f"No face detected in video {input_path}")
        return
    
    # 读取视频,获取视频的宽度和高度
    clip = VideoFileClip(input_path)
    frame_shape = clip.size[::-1]  # 电影剪辑的尺寸是(width, height),我们需要(height, width)
    
    # 计算裁剪框
    cropping_box = calculate_cropping_box(host_face_location, frame_shape)
    
    # 裁剪视频
    cropped_clip = clip.crop(x1=cropping_box[3], y1=cropping_box[0], x2=cropping_box[1], y2=cropping_box[2])
    cropped_clip = cropped_clip.resize((512, 512))
    
    # 调整帧率
    cropped_clip = cropped_clip.set_fps(25)
    
    # 保存最终视频
    cropped_clip.write_videofile(output_path, codec='libx264', audio_codec='aac')
    
    # 清理资源
    cropped_clip.close()

if __name__ == "__main__":
    for i in tqdm(range(1, 75), desc="Processing videos"):
        input_path = f"data/{i}/{i}.mp4"
        output_path = f"data/{i}/{i}_fc1.mp4"
        process_video(input_path, output_path)

代码解释

  1. find_host_face_location 函数:这个函数负责在视频的前几秒内查找主持人面部的大致位置。我们假设主持人在视频开始时就已经出现在画面中,并且通常位于画面的中心位置附近。

  2. calculate_cropping_box 函数:根据主持人面部的位置计算出一个裁剪框,使得裁剪后的视频以主持人面部为中心。

  3. process_video 函数:此函数执行视频的裁剪和帧率调整。首先,我们使用find_host_face_location函数找到主持人面部的位置。接着,使用calculate_cropping_box函数计算裁剪框。然后,我们使用moviepy库来裁剪视频、调整尺寸和帧率,并保存最终的视频。

注意事项

  • 我们假定主持人在视频开始时就已经出现并且位置相对固定。如果主持人在视频中移动或有多个主持人,此方法可能需要进一步的调整。
  • 使用moviepy进行视频处理可以简化代码并提高效率,但请注意moviepy对视频文件的读写操作可能会消耗较多资源。

确保在运行此代码之前,已经安装了face_recognitionmoviepy库及其依赖项。如果在执行过程中遇到任何问题,如资源限制或库版本冲突,请相应地调整配置或更新库版本。

相关推荐

  1. 人脸检测+调整分辨率+调整

    2024-07-12 15:06:04       26 阅读
  2. 调整视频分辨率

    2024-07-12 15:06:04       30 阅读
  3. 视频调整分辨率+音画同步

    2024-07-12 15:06:04       29 阅读
  4. 批量调整图片分辨率

    2024-07-12 15:06:04       22 阅读
  5. ffmpeg 改变分辨率,时长等命令

    2024-07-12 15:06:04       55 阅读
  6. CSS根据屏幕分辨率自动调整样式

    2024-07-12 15:06:04       31 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 15:06:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 15:06:04       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 15:06:04       58 阅读
  4. Python语言-面向对象

    2024-07-12 15:06:04       69 阅读

热门阅读

  1. python-torch加载c++与内核函数

    2024-07-12 15:06:04       17 阅读
  2. 如何将canvas画布变成一张img图片

    2024-07-12 15:06:04       21 阅读
  3. 力扣第230题“二叉搜索树中第K小的元素”

    2024-07-12 15:06:04       23 阅读
  4. Gradio聚类

    2024-07-12 15:06:04       17 阅读
  5. Node.js 模块系统

    2024-07-12 15:06:04       17 阅读
  6. 模板方法模式的实现

    2024-07-12 15:06:04       21 阅读
  7. Android.mk中LOCAL_SDK_VERSION的作用是什么?

    2024-07-12 15:06:04       21 阅读
  8. C++:右值引用

    2024-07-12 15:06:04       22 阅读