对换脸、动嘴生成的视频做初筛

首尾帧人脸差异检测

代码概述

本脚本实现了一个简单的视频筛查系统,主要功能是通过比较视频首帧和尾帧中的人脸差异来判断视频是否合格。如果视频中没有人脸或存在其他异常情况,视频将被移动到错误目录中。具体来说,系统包含以下几个主要步骤:

  1. 加载视频文件:尝试打开视频文件,并读取首帧和尾帧。
  2. 人脸检测:使用OpenCV的Haar级联分类器检测视频首帧和尾帧中的人脸。
  3. 人脸提取与标准化:从检测到的人脸区域中提取并标准化脸部图像。
  4. 差异计算:计算首帧和尾帧中脸部区域的差异,并与预设的阈值进行比较。
  5. 视频处理:根据差异判断视频是否合格,并将视频移动到相应的目录。
代码步骤详解
  1. 导入必要的库

    python 复制代码
    import cv2
    import numpy as np
    import os
    import shutil
  2. 加载预训练的人脸检测模型

    python 复制代码
    face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
  3. 定义人脸检测函数

    python 复制代码
    def detect_face(image):
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30), flags=cv2.CASCADE_SCALE_IMAGE)
        return faces

    此函数将输入图像转换为灰度图,并使用预训练的Haar级联分类器检测人脸。

  4. 定义人脸提取与标准化函数

    python 复制代码
    def extract_face(image, face, face_size=(100, 100)):
        x, y, w, h = face
        face_region = image[y:y+h, x:x+w]
        face_region = cv2.resize(face_region, face_size)
        return face_region

    此函数从检测到的人脸区域中提取脸部图像,并将其标准化为固定尺寸。

  5. 定义视频分析函数

    python 复制代码
    def analyze_video(video_path, threshold=1000000):
        cap = cv2.VideoCapture(video_path)
        
        if not cap.isOpened():
            print("Error opening video file:", video_path)
            return None
    
        frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
        
        ret, first_frame = cap.read()
        if not ret:
            print("Failed to grab first frame:", video_path)
            return None
    
        cap.set(cv2.CAP_PROP_POS_FRAMES, frame_count - 1)
        ret, last_frame = cap.read()
        if not ret:
            print("Failed to grab last frame:", video_path)
            return None
    
        cap.release()
    
        first_faces = detect_face(first_frame)
        last_faces = detect_face(last_frame)
        
        if len(first_faces) == 0 or len(last_faces) == 0:
            print("No face detected in video:", video_path)
            return None
    
        first_face = extract_face(first_frame, first_faces[0])
        last_face = extract_face(last_frame, last_faces[0])
    
        diff = cv2.absdiff(first_face, last_face)
        gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)
        _, thresh = cv2.threshold(gray, 30, 255, cv2.THRESH_BINARY)
        non_zero_count = cv2.countNonZero(thresh)
        
        return non_zero_count >= threshold

    此函数执行以下操作:

    • 打开视频文件并读取首帧和尾帧;
    • 检测首帧和尾帧中的人脸;
    • 提取并标准化脸部图像;
    • 计算脸部区域的差异,并与阈值进行比较;
    • 返回布尔值表示视频是否合格。
  6. 定义视频处理函数

    python 复制代码
    def process_videos(input_dir, output_dir, error_dir, threshold=1000000):
        if not os.path.exists(output_dir):
            os.makedirs(output_dir)
        
        if not os.path.exists(error_dir):
            os.makedirs(error_dir)
        
        for root, dirs, files in os.walk(input_dir):
            for file in files:
                if file.endswith(('.mp4', '.avi', '.mkv', '.mov', '.wmv')):
                    video_path = os.path.join(root, file)
                    
                    result = analyze_video(video_path, threshold)
                    
                    if result is None:
                        print(f"Moving video {video_path} due to errors.")
                        shutil.move(video_path, os.path.join(error_dir, file))
                    elif result:
                        print(f"Video {video_path} is not up to standard.")
                        shutil.move(video_path, os.path.join(output_dir, file))

    此函数遍历输入目录中的所有视频文件,并逐一进行分析:

    • 创建输出目录和错误目录;
    • 对每个视频文件执行分析;
    • 根据分析结果将视频移动到相应目录。
  7. 主程序入口

    python 复制代码
    if __name__ == '__main__':
        input_dir = '.'  # 输入视频所在的文件夹
        output_dir = 'not_up_to_standard'  # 不达标视频输出的文件夹
        error_dir = 'errors'  # 存放检测错误的视频
        threshold = 1000000  # 需要根据实际情况调整这个阈值
        
        process_videos(input_dir, output_dir, error_dir, threshold)

    主程序入口定义了输入目录、输出目录和错误目录,并调用 process_videos 函数处理视频文件。

总结

本脚本提供了一个简单但实用的工具,用于自动筛查视频文件,特别适用于需要检测视频首尾帧中人脸差异的应用场景。通过调整阈值和优化人脸检测参数,可以进一步提高系统的准确性和鲁棒性。

相关推荐
量子-Alex33 分钟前
【多模态聚类】用于无标记视频自监督学习的多模态聚类网络
学习·音视频·聚类
Eric.Lee20212 小时前
Paddle OCR 中英文检测识别 - python 实现
人工智能·opencv·计算机视觉·ocr检测
audyxiao0013 小时前
AI一周重要会议和活动概览
人工智能·计算机视觉·数据挖掘·多模态
mo47764 小时前
Webrtc音频模块(四) 音频采集
音视频·webrtc
icy、泡芙4 小时前
T527-----音频调试
linux·驱动开发·音视频
易我数据恢复大师4 小时前
怎么提取音频保存到本地?电脑音频提取方法
音视频·软件·音频提取
野蛮的大西瓜4 小时前
开源呼叫中心中,如何将ASR与IVR菜单结合,实现动态的IVR交互
人工智能·机器人·自动化·音视频·信息与通信
橙子小哥的代码世界5 小时前
【计算机视觉基础CV-图像分类】01- 从历史源头到深度时代:一文读懂计算机视觉的进化脉络、核心任务与产业蓝图
人工智能·计算机视觉
小陈phd6 小时前
OpenCV学习——图像融合
opencv·计算机视觉·cv
嘟嘟实验室7 小时前
微信小程序xr-frame透明视频实现
微信小程序·ffmpeg·音视频·xr