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

首尾帧人脸差异检测

代码概述

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

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

总结

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

相关推荐
FL162386312917 分钟前
C++基于opencv实现的暗通道的先验图像去雾
c++·opencv·计算机视觉
程序猿小D1 小时前
【完整源码+数据集+部署教程】 【零售和消费品&存货】【无人零售】自动售卖机饮料检测系统源码&数据集全套:改进yolo11-KernelWarehouse
python·yolo·计算机视觉·目标跟踪·数据集·yolo11·自动售卖机饮料检测系统
程序猿小D1 小时前
【完整源码+数据集+部署教程】 【零售和消费品&存货】条形码检测系统源码&数据集全套:改进yolo11-TADDH
python·yolo·计算机视觉·目标跟踪·数据集·yolo11·条形码检测系统
Python智慧行囊2 小时前
图像处理(三)--开运算与闭运算,梯度运算,礼帽与黑帽
人工智能·算法·计算机视觉
过往入尘土2 小时前
YOLOv3详解:实时目标检测的巅峰之作
人工智能·计算机视觉·目标跟踪
sali-tec2 小时前
C# 基于halcon的视觉工作流-章46-不匀面划痕
人工智能·算法·计算机视觉·c#
P P PHP3 小时前
Html播放m3u8视频
音视频
小影译片3 小时前
zmaify 职场成长平台宣传视频脚本(视频计划谁能做的更好?)
音视频
TechNomad3 小时前
十五、OpenCV中的图像浮雕技术
opencv
电棍2335 小时前
工程记录:使用tello edu无人机进行计算机视觉工作(手势识别,yolo3搭载)
人工智能·计算机视觉·无人机