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

首尾帧人脸差异检测

代码概述

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

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

总结

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

相关推荐
深度研习笔记14 小时前
OpenCV工业视觉实战09|项目EXE打包+工控机无环境部署+后台常驻运行,彻底脱离Python环境,完成项目最终交付
python·opencv·webpack
深度研习笔记20 小时前
OpenCV工业视觉实战06|ROI区域截取+局部精细化检测,锁定作业区域、屏蔽无效背景,大幅提升YOLO检测准确率
人工智能·opencv·yolo
蝉蜕日记21 小时前
视频压缩 v1.1.31:高效压缩,无损画质,释放存储空间
音视频·生活·视频编解码·视频·软件需求
fai厅的秃头姐!21 小时前
OpenCV-基础篇
人工智能·opencv·计算机视觉
lumengabc1 天前
视频制作流程MP4旁白语音生成裁剪视频压缩python处理ppt转视频M4a格式
音视频
丨白色风车丨1 天前
OpenCV 基于 HSV 颜色空间实时颜色分割(摄像头蓝色识别)
人工智能·opencv·计算机视觉·hsv颜色识别·python计算机视觉
深度研习笔记1 天前
OpenCV工业视觉实战10|违规语音播报+弹窗告警+重复告警过滤,打造智能声光预警系统(项目加分必备)
人工智能·opencv·计算机视觉
AI人工智能+1 天前
银行回单识别技术通过AI驱动的智能文档理解方案,实现财务处理的革命性升级
深度学习·计算机视觉·自然语言处理·ocr·银行回单识别
音视频牛哥1 天前
AI浪潮下,实时音视频SDK正在经历怎样的价值重构?
人工智能·音视频·实时音视频·rtmp推流·低延迟rtsp播放器·低延迟rtmp播放器·rtsp转rtmp推流
乐橙开放平台1 天前
明厨亮灶笔记:乐橙轻应用 H5 + 小程序插件,一套 BFF 出两张播放凭证
人工智能·笔记·物联网·小程序·音视频·notepad++