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

首尾帧人脸差异检测

代码概述

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

  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 函数处理视频文件。

总结

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

相关推荐
看到我,请让我去学习1 小时前
OpenCV编程- (图像基础处理:噪声、滤波、直方图与边缘检测)
c语言·c++·人工智能·opencv·计算机视觉
Antonio91510 小时前
【音视频】HLS简介与服务器搭建
运维·服务器·音视频
开发者工具分享10 小时前
文本音频违规识别工具排行榜(12选)
人工智能·音视频
蹦蹦跳跳真可爱58910 小时前
Python----OpenCV(图像増强——高通滤波(索贝尔算子、沙尔算子、拉普拉斯算子),图像浮雕与特效处理)
人工智能·python·opencv·计算机视觉
开开心心_Every12 小时前
便捷的Office批量转PDF工具
开发语言·人工智能·r语言·pdf·c#·音视频·symfony
Chef_Chen12 小时前
从0开始学习计算机视觉--Day08--卷积神经网络
学习·计算机视觉·cnn
CoovallyAIHub1 天前
YOLO模型优化全攻略:从“准”到“快”,全靠这些招!
深度学习·算法·计算机视觉
karmueo461 天前
视频序列和射频信号多模态融合算法Fusion-Vital解读
算法·音视频·多模态
昨日之日20061 天前
Video Background Remover V3版 - AI视频一键抠像/视频换背景 支持50系显卡 一键整合包下载
人工智能·音视频
彭祥.1 天前
Jetson边缘计算主板:Ubuntu 环境配置 CUDA 与 cudNN 推理环境 + OpenCV 与 C++ 进行目标分类
c++·opencv·分类