import cv2
import face_recognition
import os
import subprocess
from tqdm import tqdm
def process_video(input_path, output_path, temp_dir=“temp_frames”):
# 创建临时帧存储目录
os.makedirs(temp_dir, exist_ok=True)
# 初始化视频捕获
cap = cv2.VideoCapture(input_path)
if not cap.isOpened():
raise ValueError("无法打开视频文件")
# 获取视频参数
fps = cap.get(cv2.CAP_PROP_FPS)
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
print(f"视频参数:{width}x{height} @ {fps}fps,总帧数:{total_frames}")
# 创建进度条
pbar = tqdm(total=total_frames, desc="处理进度")
# 逐帧处理
saved_frames = 0
frame_count = 0
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 转换颜色空间 BGR -> RGB
rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# 人脸检测(使用HOG模型,可改为CNN提升准确率)
face_locations = face_recognition.face_locations(rgb_frame)
# 如果没有检测到人脸,保存帧
if not face_locations:
frame_filename = os.path.join(temp_dir, f"frame_{saved_frames:08d}.jpg")
cv2.imwrite(frame_filename, frame)
saved_frames += 1
frame_count += 1
pbar.update(1)
cap.release()
pbar.close()
print(f"处理完成,保留帧数:{saved_frames}/{total_frames}")
# 合并保留的帧为视频
print("合并视频...")
output_temp = "temp_output.mp4"
(
ffmpeg
.input(f'{temp_dir}/frame_%08d.jpg', pattern_type='sequence', framerate=fps)
.output(output_temp, vcodec='libx264', pix_fmt='yuv420p')
.overwrite_output()
.run()
)
# 合并原始音频
print("合并音频...")
final_output = output_path
(
ffmpeg
.output(
ffmpeg.input(output_temp).video,
ffmpeg.input(input_path).audio,
final_output,
vcodec='copy',
acodec='copy',
shortest=None
)
.overwrite_output()
.run()
)
# 清理临时文件
shutil.rmtree(temp_dir)
os.remove(output_temp)
print(f"处理完成!输出文件:{final_output}")
if name == “main”:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-i", “–input”, required=True, help=“输入视频路径”)
parser.add_argument("-o", “–output”, required=True, help=“输出视频路径”)
args = parser.parse_args()
# 检查ffmpeg可用性
try:
import ffmpeg
except ImportError:
raise ImportError("请先安装ffmpeg-python:pip install ffmpeg-python")
process_video(args.input, 以下是使用`face-recognition`库实现的完整视频人脸镜头删除+合并解决方案:
import cv2
import face_recognition
import os
import subprocess
from tqdm import tqdm
def process_video(input_path, output_path, temp_dir="temp_frames"):
# 创建临时帧存储目录
os.makedirs(temp_dir, exist_ok=True)
# 初始化视频捕获
cap = cv2.VideoCapture(input_path)
if not cap.isOpened():