一、前言

在日常的拍摄、制作过程中,绿幕视频是非常高频的操作。后期的处理中,经常需要手工抠图,添加背景。

二、在剪映中,如何实现绿幕视频

在剪映中,色素抠图非常强大,所见即所得。

为了方便剪切,我们经常将绿幕视频 + 背景做成复合片段

这样,在后续的处理中,就可以方便地进行其它的操作,比如做个蒙板、上下屏...

无论怎样,就一个流程:

1. 色素抠像,调整参数

2. 添加背景(图片或视频)

3. 制作成复合片段

4. 使用片段

三、使用程序中绿幕的实现

duo-video的前期项目需求,需要对同一个绿幕素材进行大批量的视频制作,并通过抖音的首发、优质检测。

我们引入了AI协助进行处理,切分镜、添加字幕、包装画面、添加各种特效...这些内容将在后续的其它章节里讲解。这里只专注于绿幕的处理。

模拟人工在剪映上的操作流程。

第一步:制定色素抠像调整

我拆分为两个步骤完成:绿幕颜色 + 抠像参数调整。以目前的多模态模型,将 绿幕颜色 + 抠像参数调整 一步完成,我并没有调整出比较满意的提示语。不是颜色不太准,就是抠像参考不太好。总之最终的效果不太好。所以我将它拆成了两步完成:

1. 绿幕颜色

这一步可以使用python cv2完成

import cv2
import numpy as np

# 读取图片
image = cv2.imread("green_screen.jpg")
if image is None:
    raise ValueError("图片读取失败")

# 转 HSV
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

# 拆分通道
h, s, v = cv2.split(hsv)

# 先粗略筛选“可能是绿色”的像素
# H 在 35~85 之间,一般涵盖大多数绿幕
mask_green = (h >= 35) & (h <= 85) & (s > 50) & (v > 50)

# 取出这些像素的 HSV 值
green_pixels = hsv[mask_green]

if len(green_pixels) == 0:
    raise ValueError("未检测到绿色区域")

# 计算 HSV 范围(可用均值 + 偏移)
h_mean, s_mean, v_mean = np.mean(green_pixels, axis=0)

# 可调节的容差(很关键)
h_tol = 10
s_tol = 40
v_tol = 40

lower_green = np.array([
    max(0, h_mean - h_tol),
    max(0, s_mean - s_tol),
    max(0, v_mean - v_tol)
], dtype=np.uint8)

upper_green = np.array([
    min(179, h_mean + h_tol),
    min(255, s_mean + s_tol),
    min(255, v_mean + v_tol)
], dtype=np.uint8)

print("识别到的绿幕 HSV 范围:")
print("Lower:", lower_green)
print("Upper:", upper_green)

# 测试:生成绿幕 mask
mask = cv2.inRange(hsv, lower_green, upper_green)

# 保存结果方便查看
cv2.imwrite("green_mask.png", mask)

2. 抠像参数

抠像参数使用一个支持图片识别的大模型来做(建议在dify 或 coze 上面来做,可以方便切换各种模型来验证效果)

直接上提示语:

[角色设定 | Role]
你是一位顶级 AI 视频后期特效师,在色彩科学、像素级图像分析与色度抠像(Chroma Key)领域具备专家级能力。
你的核心职责是:在任何情况下优先保护主体完整性,并基于真实图像像素数据提供安全、保守、可实际使用的抠像初始参数方案。

[背景说明 | Context]
用户提供了一张从绿幕视频中截取的 JPG 图片。
最终目标是在视频剪辑或后期特效软件中,使用你给出的参数,将人物主体与绿色背景稳定、干净地分离。

已知高风险问题包括:
- 参数过于激进,导致主体(衣物、皮肤、道具)被错误抠除
- 返回理论上的或臆测的“绿幕颜色”,而非图片中的真实颜色

任何未基于图像真实像素数据的颜色推断,均视为严重错误。

[输入 | Input]
- image:一张 JPG 格式的图像(绿幕视频帧)

[核心任务指令 | Task Instructions]
你必须严格按照以下步骤顺序执行分析,不得跳步、合并或省略。

1. 像素级颜色提取与校验
Pixel-Level Color Extraction & Validation

- 所有颜色分析必须严格基于该图像的真实像素数据
- 禁止使用任何先验假设,如:
  - 典型绿幕颜色
  - 常见 HSV 范围
- 返回的 hexColor 必须是图像中绿幕区域真实存在的主导颜色
- 不得返回图像中不存在的颜色值

2. 抠像强度分析与确定
Keying Strength Analysis

- 分析绿幕区域的颜色均匀度、亮度变化及阴影情况
- 同时识别主体上的绿色溢出(Spill)区域,如灰色衣物或反光区域
- strength 参数绝不能侵蚀主体上的任何非背景像素
- 目标是给出一个偏保守、可作为抠像初始值的强度参数

3. 边缘羽化分析与确定
Edge Feather Analysis

- 基于主体轮廓的清晰度、运动模糊情况及细节结构(头发、手指)
- 羽化的目标是柔化锯齿,但不能破坏或吞噬主体边缘

4. 边缘清除分析与确定
Edge Cleanup / Spill Suppression Analysis

- 分析主体边缘是否存在绿色反射或绿色溢色
- 此参数用于中和绿色溢出,而不是抠除主体边缘
- 当主体颜色(如灰色、白色)与绿色混合时,必须优先保留主体颜色

[安全阈值与限制 | Safety Thresholds & Limits]
以下限制为强制执行规则,用于最大限度保护主体完整性:

- strength ≤ 35
- edgeFeather ≤ 35
- edgeCleanup 范围:50 – 85
- 所有参数值必须为 0–100 之间的整数

当“背景完全干净”和“主体绝对完整”发生冲突时,必须始终选择“主体绝对完整”。

[输出约束 | Output Constraints]
- hexColor 必须为 #RRGGBB 格式字符串
- 不得输出任何解释、分析过程或额外文本
- 最终输出必须且只能是以下结构:

{
  "hexColor": "string",
  "strength": integer,
  "edgeFeather": integer,
  "edgeCleanup": integer
}

不要添加任何代码块标记或额外字符。

第二步:添加背景

第三步:制作复合背景

第四步:使用片段

这三步在程序里面都没有太大的差别,无非是按 draft_info.json 的规范组织内容。这一步还是比较繁琐的,捷径就是找个靠谱的 剪映草稿SDK。

四、duo-video的思考

经历三年的视频AI混剪开发,原来的流程不断调整、重构。第三版基于更简洁的视频工程定义,大量地简化了数据结构。让整个使用过程变得极其简单。

{
  "scripts": [
  	"segments": [
    	{
        "id": 296653948753219560,
        "time": {
          "start": 0,
          "duration": 3000
        },
        "materialId": 535010997887571021,
        "materialStart": 5000,
        "type": "video"
      },
      {
          "id": 296653948753219564,
          "time": {
            "start": 4000,
            "duration": 3000
          },
          "materialId": 535010997887571021, // 注意,多次复用时,会复用第一次出现时的构建复合片段
          "materialStart": 9000,
          "type": "video",
          "refs": {
            "296653948753219539": "mask"
          },
        }
	]
  ],
  "materials": [
    {
      "id": 535010997887571021, # 素材ID,是一个全局唯一的整数
      "url": "https://api.duoec.com/public/video/535010997887571021.mp4", 
      "type": "video",
      "time": { // 素材使用片段。可选,为空时表示整个视频
        "start": 0, 
        "duration": 86586
      },
      "greenBackground": { // 绿幕配置,当然也支持白幕、蓝幕。以下参数可以使用AI推荐(需要多模态支持)
        "materialId": 535010997887571022, // 绿幕素材,可以是图片、视频
        "baseBackgroundColor": "#4e8a1fff", // 绿幕颜色
        "strength": 20, // 强度。参考剪映里的 强度
        "edgeFeather": 10, // 边缘羽化。参考剪映
        "edgeCleanup": 10, // 边缘清理。参考剪映
    		"shadow": 0 // 阴影。参考剪映,旧版本不支持
      }
    },
	{ // 绿幕背景的素材
      "id": 535010997887571022,
      "url": "https://api.duoec.com/public/greenScreen/d8a0e31b50166b6219b1df1dbb90e284.png",
      "type": "image"
    }
  ]
}

这是一个完整的DEMO,仅定义了两个素材(绿幕视频 + 背景图片),其中 type=video的素材定义了绿幕,所以在生成时,会自动转换为复合片段。

这样在上面的 segments 里,就可以简单的使用 materialId: 535010997887571021 使用这个复合片段。

完整的剪映工程可以通过以下链接下载。这个是完全通过 duo-video 代码生成的剪映草稿

写在最后:AI的到来,给程序员造成了极大的挑战,挤掉了大量的程序员的工作。另一方面,作为程序员的大杀器,也可以极大地提高个人的单兵能力。

就是这个项目来说,如果没有AI的协助,我在构建整一个AI视频创作的时间将会大大地增加。在这过程中遇到的阻碍,也将花费大量的时间去搜索答案,去找到问题所在。得益于AI的能力加持,个体程序员将成为超级个体,成为一个研发团队。AI是趋势不可改变,拥抱AI,程序员将成为与AI协作最流畅、离AI最近的人...

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐