视频里的主体怎么抠成透明图层?用 SAM 2 跟踪对象并导出掩码序列

用 SAM 2 在关键视频帧上框选主体,将分割掩码传播到其余帧,再把掩码写入 PNG alpha 通道;理解抽帧、遮挡漂移和掩码不等于修复视频的边界。

SAM 2 可以在视频帧上用点击或矩形框指定对象,再把对象掩码传播到其他帧。它输出的是分帧分割掩码,不是已经去背景的透明视频;这篇教程把掩码应用到原始帧的 alpha 通道,得到可在剪辑软件中继续合成的透明 PNG 序列。

准备帧序列和运行环境

SAM 2 官方项目要求 Python 3.10 或更新版本、PyTorch 2.5.1 及 torchvision 0.20.1 或更新版本,并提供视频预测器示例。先用 FFmpeg 把短片按较低帧率导出成按数字命名的 JPEG 帧,例如:

视频里的主体怎么抠成透明图层?用 SAM 2 跟踪对象并导出掩码序列

mkdir frames
ffmpeg -i input.mp4 -vf "fps=5" frames/%05d.jpg

这条命令只用于降低演示素材的计算量;它会丢弃部分原始帧,不能当作完整帧率输出。准备好 SAM 2 官方安装依赖和与所选配置匹配的 checkpoint 后,照项目 notebook 初始化视频预测器与帧目录。

在关键帧框选,再传播到整段视频

inference_state = predictor.init_state(video_path=video_dir)
frame_idx = 0
obj_id = 1
box = np.array([x1, y1, x2, y2], dtype=np.float32)
_, object_ids, mask_logits = predictor.add_new_points_or_box(
    inference_state=inference_state,
    frame_idx=frame_idx,
    obj_id=obj_id,
    box=box,
)
video_segments = {}
for out_frame_idx, out_obj_ids, out_mask_logits in predictor.propagate_in_video(inference_state):
    video_segments[out_frame_idx] = {
        out_id: (out_mask_logits[i] > 0.0).cpu().numpy()
        for i, out_id in enumerate(out_obj_ids)
    }

把框的坐标改成目标在第一帧中的像素坐标。先查看该帧的掩码;如果把背景也选进来,使用负向点击补充排除区域,或在目标形状变化明显的关键帧再次修正。官方示例通过 propagate_in_video 收集每帧的 mask logits,并以大于 0 作为目标区域。

用掩码制作透明 PNG 并检查

下面的示例将已收集到的掩码与同编号原图合成 RGBA,再写成带透明通道的 PNG。要求 video_segments、obj_id 是上一步生成的对象掩码结果;frames 目录里的帧必须与传给 SAM 2 的输入帧顺序一致。

from pathlib import Path
import numpy as np
from PIL import Image

frame_dir = Path("frames")
out_dir = Path("rgba_frames")
out_dir.mkdir(exist_ok=True)
frame_paths = sorted(frame_dir.glob("*.jpg"))

for frame_idx, frame_path in enumerate(frame_paths):
    objects = video_segments.get(frame_idx, {})
    if obj_id not in objects:
        continue  # 此帧没有该对象的掩码
    mask = np.asarray(objects[obj_id]).squeeze().astype(bool)
    rgb = np.asarray(Image.open(frame_path).convert("RGB"))
    if mask.shape != rgb.shape[:2]:
        raise ValueError(f"帧 {frame_idx} 的掩码尺寸与原图不一致")
    alpha = mask.astype(np.uint8) * 255
    rgba = np.dstack((rgb, alpha))
    Image.fromarray(rgba, mode="RGBA").save(out_dir / f"{frame_idx:05d}.png")

运行前安装 Pillow(pip install pillow)。检查第 1、1/3、2/3、末帧以及转身和遮挡处:在支持透明背景的查看器中,透明区应显示为棋盘格,主体边缘不应突然跳动。若把抽帧后的 PNG 序列送进剪辑软件,先按实际抽帧率设置帧率;要和原视频同步,还需按同一时间戳重新合成声音与画面。

背景复杂、对象离开画面、镜头剪切或多个物体交叉时,传播的掩码可能漂移;回到出错帧加正向/负向点击并重新传播。SAM 2 的能力是提示式图像/视频分割,不会自动补出被遮挡的真实像素,也不会替你做视频修复。原始视频与透明输出分开保存,确认授权后再发布。

官方资料

Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/32026.html

赞 (0)
AI小管家的头像AI小管家
HeyGen LiveAvatar 怎么搭建互动主播?配置角色边界并核对真人接管
上一篇 1小时前
Tesla P4 能部署 DeepSeek 吗?检查 CUDA 支持并从 7B 模型实测
下一篇 1小时前

相关推荐

联系我们

联系我们

1

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
关注微信
分享本页
返回顶部