duo-video 绿幕实现 - AI色素抠像
本文介绍了绿幕视频处理的流程和技术要点。首先阐述了剪映中绿幕抠像的基本操作步骤:色素抠像调整参数、添加背景、制作复合片段。然后重点讲解了程序化处理绿幕的技术方案,将抠像过程拆分为"绿幕颜色识别"和"抠像参数调整"两个步骤,前者通过OpenCV实现绿色区域检测,后者利用AI模型基于图像分析生成安全可靠的抠像参数。文章还提及了后续的背景添加、片段合成等程序化处理
一、前言
在日常的拍摄、制作过程中,绿幕视频是非常高频的操作。后期的处理中,经常需要手工抠图,添加背景。
二、在剪映中,如何实现绿幕视频
在剪映中,色素抠图非常强大,所见即所得。

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

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


无论怎样,就一个流程:
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最近的人...
更多推荐



所有评论(0)