自动视频打码要解决两件事:找到脸,以及确认每一帧都遮住了需要隐藏的区域。MediaPipe 可提供人脸框,下面把检测区域用实心块覆盖,并输出供人工复查的静音视频。未运行检测,不保证自动检测覆盖所有侧脸或远处人物。
选择短片并定义遮挡范围
使用 own.mp4 和按官方页面取得的 Face Detector 模型 face_detector.task。先列出片中需要遮挡的人、出现时间和侧脸情况。模型输入与输出区域应映射回原画面,不要只在缩略图上画框后直接套到原片。声音、衣服和环境也可能识别人,遮住脸不等于完整匿名。

逐帧检测,扩大边缘后覆盖
import cv2, mediapipe as mp
from mediapipe.tasks import python
from mediapipe.tasks.python import vision
cap = cv2.VideoCapture("own.mp4")
fps = cap.get(cv2.CAP_PROP_FPS)
w,h = [int(cap.get(k)) for k in [cv2.CAP_PROP_FRAME_WIDTH,cv2.CAP_PROP_FRAME_HEIGHT]]
if not cap.isOpened() or fps<=0: raise RuntimeError("无法读取视频")
out = cv2.VideoWriter("masked_silent.mp4", cv2.VideoWriter_fourcc(*"mp4v"), fps, (w,h))
if not out.isOpened(): raise RuntimeError("无法创建输出")
opts = vision.FaceDetectorOptions(base_options=python.BaseOptions(model_asset_path="face_detector.task"), running_mode=vision.RunningMode.IMAGE)
missing=[]; n=0
with vision.FaceDetector.create_from_options(opts) as detector:
while True:
ok,frame=cap.read()
if not ok: break
rgb=cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)
result=detector.detect(mp.Image(image_format=mp.ImageFormat.SRGB,data=rgb))
if not result.detections: missing.append(n)
for d in result.detections:
b=d.bounding_box; pad=int(max(b.width,b.height)*0.15)
x1=max(0,b.origin_x-pad); y1=max(0,b.origin_y-pad)
x2=min(w,b.origin_x+b.width+pad); y2=min(h,b.origin_y+b.height+pad)
frame[y1:y2,x1:x2]=0
out.write(frame); n+=1
cap.release(); out.release()
print("decoded_frames",n,"zero-detection frames",missing)
这份简单示例逐帧使用 IMAGE 模式,没有加入追踪;15% 是边缘余量示例,不是匿名保障。OpenCV 输出不带原音轨,文件名明确标为 silent。可变帧率原片需要另行处理时间戳,否则输出时间可能变化。
无检测帧不等于无需遮挡
逐段播放输出,重点检查侧身、遮挡、快速移动、人物进出画面的时刻。missing 列表只能找到“没有检测到任何脸”的帧,画面中两张脸只检测到一张仍不会进入列表,所以必须全片检查。漏帧时在剪辑器人工补遮挡并延长覆盖区间。
交付前核对声音与完整时长
比较输入输出首尾、帧数和观看时长,确认没有截断或反复帧。是否保留声音由匿名任务决定;需要声音时另行审查可识别信息后才合成音轨。保存复查记录与最终文件,暂存的自动输出不能作为已完成匿名的公开版本。下一步用目标播放器再次完整回放。
参考资料
依据 2026-10-03 读取的官方资料整理:官方文档 1;官方文档 2;官方文档 3。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/33139.html