桃园实景素材锻造
把城市实景视频变成《桃源深处有人家》实机画风的游戏素材:建筑、道路、路灯、树木保留并风格化,行人、车辆、电线杆等现代杂物自动清掉,最后切成游戏能直接用的规格。
你产出的不是 prompt,是素材文件。
完整指令是工具无关的,放在同目录:
| 文件 | 作用 |
|---|---|
| PROTOCOL.md | 七阶段执行协议——先读这个 |
| STYLE.md | 画风配方库:九条铁律 + 实测色卡 + 天光变体 T01–T08.1 + 素材类型 T11–T20 |
| ELEMENTS.md | 元素处置词典:保留 K / 去除 S1–S6 / 现代→中式替换表 |
| ASSETS.md | 素材规格:等距网格、尺寸档位、相对高度、命名、透明底、切片、交付清单 |
scripts/ |
管线脚本(纯 Python,可离线跑) |
一、画风底线(先记住这三条,就不会跑偏)
本风格最容易被做错的地方,不是配色,是这三条:
- 全画无描边 —— 轮廓只能靠"本色深一档"的色阶或色块切分表达。出现黑线就废了。
- 明亮暖调、高调平光 —— 不是水墨、不是低饱和、不是暗调。平均亮度约 155/255,暗部只比本色深一两档,没有硬边投影。
- 2.5D 斜俯视(俯角约 55°) —— 屋顶要看得见顶面,地面占画面主体,没有天空、没有地平线、没有透视汇聚。
配色锚点:暖奶油 #F3E7CA、麦秆黄 #E5BB88、草绿 #8FA666、薄荷绿 #91A782、松墨绿 #73865D、淡青绿 #AADBDA、岩棕 #946451、樱粉 #EFA9A0、砖橙 #DC8F73。
禁忌:纯黑(最暗只能用 #6B5B4A)、纯白(最亮只能到 #F4F2C5)、荧光色、饱和原色、金属镜面高光。
二、什么时候用
出现下面任一情形,立刻加载本 Skill:
| 用户说 | 走什么 |
|---|---|
| 「这是我在街上拍的视频,想做成游戏素材」 | 全流程(先做阶段 0 机位判档) |
| 「要桃源深处有人家 / 桃园深处有人家那个画风」 | 阶段 3–4,用 STYLE.md 配方 |
| 「把视频里的人、车去掉」 | 阶段 2A 多帧中位数堆叠 |
| 「电线杆、招牌太丑了,删掉」 | 阶段 2B 掩码 + 补全 |
| 「要能直接摆进游戏的建筑/地块/树」 | 阶段 5–6 落档切图 |
| 「要透明底的素材」 | 阶段 6 --mode bgremove |
| 「这个风格对不对?」 | scripts/style_audit.py 量化审计 |
必须最先问清三件事(猜错全部返工):
- 机位:固定不动还是手持走动?俯角大概多少?——决定能走 V1/V2/V3 哪条路;
- 地块网格:一格多少像素?菱形比例多少?——决定素材能不能对上你的地块;
- 目标尺寸档位:S 档(单件)还是 G 档(地块)还是 P 档(场景)。
三、七阶段速览
阶段0 机位判档 ← 闸门,判错了后面全白做 intake_analyze.py 量化判档
V1 高空斜俯视(45-60°) → 可直接出游戏素材
V2 半高空(25-40°) → 可出建筑单体与远景层,顶面需补
V3 平视(<15°) → 不能直接出素材,只能做背景板或重绘
↓
阶段1 抽帧选帧 extract_frames.py 视频 → 候选帧
↓
阶段2 净化 动态物 denoise_dynamic.py 多帧中位数堆叠,人车自动消失(零成本)
静态物 apply_mask.py 掩码 + inpaint / 挖洞交生图(零成本或低)
↓
阶段3 视角重塑 VIEW LOCK + STRUCTURE LOCK + SIMPLIFY LOCK → 重画成 55° 斜俯视
↓
阶段4 画风转译 build_prompt.py → 生图 STYLE.md 配方(类型 T11-T20 × 天光 T01-T08.1)
→ 立刻 style_audit.py 回测
↓
阶段5 游戏化 gamify_scale.py 尺寸落档 + 底边对齐
↓
阶段6 切图交付 slice_assets.py 网格切片 / 抠底透明 / 平铺接缝检验
+ style_audit.py 画风审计 + 交付清单
输入是单张照片时的路径差异(协议默认假设视频输入):
| 阶段 | 视频输入 | 单张照片输入 |
|---|---|---|
| 1 抽帧 | 需要 | 跳过 |
| 2A 中位数堆叠去人车 | 需要,且这是最省力的手段 | 不适用(没有时间轴)。改为靠生成时的负面词 + 出图后逐张目视 |
| 2B 掩码去静态杂物 | 需要 | 同样需要(拍到电线杆仍然要删) |
| 3 ~ 6 | 相同 | 相同 |
单帧路径的交付清单必须写明"未走 2A 堆叠",这是别人判断这批素材可信度的依据。
硬约束(详见 PROTOCOL.md 结尾):
1. 不动原件:用户给的视频图片只读,产出全部写进工作目录
2. 遮挡 >75% 的元素废弃,不许"造结构"
3. 画面里不许出现任何人、动物、车辆(哪怕远景一个小人影)
4. 不许现代工业件(电线、外机、卷帘门、塑料、金属、玻璃)
5. 现代→中式替换必须逐条登记(见 ELEMENTS.md)
6. 风格不靠手感:每批产出都跑 style_audit.py,用数字说话
7. 拿不到图像模型时必须声明是降级交付(只给干净底帧 + prompt)
四、环境准备
pip install -r scripts/requirements.txt
四个包:opencv-python-headless、numpy、imageio、imageio-ffmpeg。
只有阶段 3/4 需要生图能力,其余阶段全程离线可跑。
装完先自检:
python scripts/selfcheck.py
它会合成一段带行人、汽车、电线杆的测试视频,把整条净化管线跑一遍并校验数值;
再看一眼画风审计能不能识别跑偏的图:
python scripts/make_audit_samples.py
python scripts/style_audit.py --dir examples/evidence/style-audit
两张反例(水墨暗调 / 矢量高饱和)都应该被报 WARN。若它们被报 PASS,说明阈值坏了。
五、标准工作流
Step 1 · 机位判档(阶段 0)
问清机位固定与否、俯角多少,归档 V1/V2/V3。结论要写进交付清单,不能只在对话里说。
有首帧或图片时先量化,别靠眼睛估:
python scripts/intake_analyze.py 首帧.png work/00_intake
同时产出结构网格参考图,供阶段 3 之后并排核对构图。
Step 2 · 抽帧
python scripts/extract_frames.py --video 街景.mp4 --out work/01_frames --fps 2 --drop-blurry
固定机位建议 --fps 2–5(堆叠要够帧数,最好 25+)。
Step 3 · 净化
# 2A:移动的人车自动消失
python scripts/denoise_dynamic.py --frames work/01_frames --out work/02a_median --sample 25
# 2B:静止的杂物靠掩码(白=去掉,黑=保留)
python scripts/apply_mask.py --image work/02a_median/median.png \
--mask work/masks/mask_01.png --out work/02b_clean/clean.png --fill inpaint --dilate 6 --preview
看 coverage.png——红黄区域就是"始终被遮挡、堆叠没救回来"的地方,得换帧或走 2B。
Step 4 · 视角重塑 + 风格化
python scripts/build_prompt.py --type T11 --variant T01 \
--kv "建筑类型=a single-storey rural house with a deep thatched roof" \
--kv "层数=one" \
--kv "特征物=turned-up eaves, exposed timber posts, a lattice window and a plank door" \
--lock-structure --view-lock --iso-grid 64 --append-negative \
--out work/03_prompts/house.txt
拿到 prompt 后走图生图,输入用净化后的底帧(别用带人的原图)。
--view-lock 是关键:它把平视画面重画成 55° 斜俯视;--lock-structure 保住构图与体量。
Step 5 · 立即审计
python scripts/style_audit.py --dir work/03_styled --strict --json work/03_styled/audit.json
WARN 的图回去改 prompt 重做,不要手工修图(手工修的会和批量产出那批不齐)。
偏暗 = 做成水墨了;饱和偏高 = 做成矢量卡通了;出现近黑像素 = 黑描边没去掉。
Step 6 · 游戏化 + 切图
python scripts/gamify_scale.py --in work/03_styled --out work/04_gamified --tile 64 --align bottom
python scripts/slice_assets.py --in work/04_gamified --out work/05_assets --mode bgremove --tol 28 --feather 1
python scripts/slice_assets.py --in work/04_gamified --out work/05_assets --mode grid --grid 4x2 --trim
Step 7 · 交付
按 ASSETS.md §6 出交付清单,含"替换登记"和"未保留清单"——哪些东西没抢救回来、为什么、建议怎么办,必须写清楚,不能藏。
六、目录
taoyuan-scene-forge/
├── SKILL.md 本文件
├── PROTOCOL.md ★ 七阶段执行协议(核心指令)
├── STYLE.md ★ 画风配方库(T01-T08.1 天光 + T11-T20 类型,21 条)
├── ELEMENTS.md ★ 元素处置词典(KEEP / STRIP / SWAP / 补面清单)
├── ASSETS.md 素材规格(等距网格 / 档位 / 高度 / 命名 / 透明底 / 切片)
├── AGENTS.md 跨工具适配层
├── README.md 给人看的说明
├── scripts/
│ ├── tyio.py 共用 I/O(解决中文路径坑)
│ ├── intake_analyze.py 阶段0 机位判档 + 原图量化 + 结构网格参考图
│ ├── extract_frames.py 阶段1 抽帧选址
│ ├── denoise_dynamic.py 阶段2A 多帧堆叠去动态物
│ ├── apply_mask.py 阶段2B 掩码去静态杂物
│ ├── build_prompt.py 阶段3-4 组装 prompt(视角锁 / 网格锁 / 暗部下限)
│ ├── gamify_scale.py 阶段5 游戏化落档
│ ├── slice_assets.py 阶段6 切片 / 抠底 / 接缝检验
│ ├── style_audit.py 画风审计(10 项指标量化校验)
│ ├── make_audit_samples.py 生成审计用的正反样本
│ ├── selfcheck.py 管线自检
│ └── requirements.txt
└── examples/
├── *.txt 10 份可直接复制的示例 prompt
├── evidence/ 净化管线实跑证据图 + 画风审计验证报告 + 反例
└── renders/ ★ 端到端实跑样图 + 交付清单 + 修正档实验记录
七、和「手绘画风图鉴」的分工
同一套「编号配方 + 工具无关协议」的骨架,但目标完全不同:
| 手绘画风图鉴(hand-drawn-styles-atlas) | 本 Skill | |
|---|---|---|
| 输入 | 一段文字 | 实景视频 |
| 产出 | 生图 prompt | 处理好的素材文件 |
| 风格数 | 63 种画风随便挑 | 1 种风格(桃源)深耕 |
| 核心难点 | 画风还原 | 元素净化 + 视角重塑 + 风格量化审计 |
要别的画风用图鉴;要把真实场景变成能用的游戏素材用本 Skill。