---
title: "88 张老照片的 4K 竖屏之旅：人脸安全区与像素级验收"
date: 2026-10-01
description: "88 张家庭老照片的 4K 竖屏渲染流水线：YuNet 人脸安全区约束 Ken Burns 裁切视窗，PIL 修正 EXIF 方向，先降采样再 warpAffine 把单帧压到 48ms，最后用 ffmpeg 流拷贝合音频、抽帧 absdiff 做像素级验收。"
canonical_url: "https://yijinlee.com/articles/article-72"
tags:
  - "AI Coding"
  - YuNet
  - OpenCV
  - PIL
  - FFmpeg
  - "Ken Burns"
  - BT.709
topic: "AI 外骨骼"
---

METRICS: 88|老照片 · 2160×3840|4K 竖屏 · 30fps|帧率 · 48ms|单帧渲染 · 2.097/255|抽检均值差

任务看起来像剪映一键套模板：88 张老照片按时间正序，加 Ken Burns 推拉、配上音乐，导出 9:16、2160×3840 @ 30fps 的视频。唯一要求：全程本地离线跑脚本。

但真跑过 4K 管线的人都知道：高分辨率加无人值守，温情相册瞬间会变成排雷现场。文首的演示可以直观对比两种裁切策略。

### 一、三个工程暗坑

#### 1. 竖屏裁横图，人脸被"斩首"

老照片多是横向合影，裁成 9:16 竖屏再做推拉平移，极易把人脸切出画面。这事不能靠玄学居中——推拉过程中视窗不断移动缩放，固定中心点随时可能越界。

解法：用轻量模型 YuNet 抓取所有人脸，算出包围盒的 Union 框，裁切视窗每一帧都锁死在 [原图边界 ∩ 人脸框外扩安全区] 内。算不出合法区间时，宁可牺牲推拉幅度，也不切到下巴额头。

#### 2. 手机照片的"玄学方向"

不同手机拍的 EXIF 旋转矩阵（Orientation）各不相同——它才是照片真实方向的唯一事实源。OpenCV 原生读取常把竖拍图读成横置。最省事的解法是改用 PIL 的 `ImageOps.exif_transpose`，在读取源头就把 90°、270° 翻转掰正，不用手写矩阵变换（顺带用 `np.fromfile` 两行绕开中文路径读取的坑）。

#### 3. 4K 逐帧渲染的性能黑洞

4K 单帧 830 万像素，逐帧从原图做 Lanczos 重采样要 240ms，全片得跑大半个小时。

核心是**"先降采样，再仿射变换"**：先把原图缩到动效所需的最大底图，逐帧只对底图做 `cv2.warpAffine` 双线性插值。单帧降到 48ms；底图只比成片所需略大，双线性误差被摊薄到肉眼不可见。

### 二、AI 的角色：戴着镣铐的执行者

我们没指望 AI 一键做好看，而是把它当成算力极强、但必须戴着镣铐跳舞的执行者：

- **代码考古，不从头手搓**：旧管线 90% 组件可用，只补一个 EXIF/时间戳/mtime 三重时序拦截器和两行动效插值。最好的代码，是不用重写的代码。
- **几何代替审美**：压轴全家福选哪张？AI 跑完候选池的几何判定给出量化结论：最新横屏自拍无法保证人脸完整推镜，最终敲定老影楼竖版合影。审美问题翻译成几何约束，输出才有确定性。
- **解耦后处理，不重编视频**：音频对齐工具只处理音频流，最后 `ffmpeg -c:v copy` 无损缝合，几秒合成，画质零损失。

### 三、客观验收：数字不会骗人

怎么确认几千帧没有崩在色彩矩阵或平移上？抽帧做逐像素比对：

```bash
# 抽检特定帧与内存帧进行像素级 absdiff
ffmpeg -ss 00:01:30 -i output.mp4 -vframes 1 test_frame.png
```

H.264（CRF 16）有损压缩与 YUV420p 色度抽样必然带来差异，追求 0 违反物理规律。验收标准定为像素差均值 < 3/255，用来卡死色彩矩阵错误——误把 BT.709 当 BT.601、全幅误压成限幅这类系统性偏差。最终抽检 2.097/255，收工。

### 总结

别迷信 AI 能替你把控艺术感。AI 最舒服的姿势：人定义物理边界（人脸框、性能底线、色彩矩阵），AI 在盒子里填满无差错代码。把"帮我做高级点"翻译成"人脸安全区的空间交集"，事情才算做成。

## 参考文章：相关链接

- [OpenCV Zoo · YuNet 人脸检测模型](https://github.com/opencv/opencv_zoo/tree/main/models/face_detection_yunet)（官方文档）— 轻量级人脸检测模型官方实现，是人脸 Union 框计算的模型来源。
- [Pillow · ImageOps.exif_transpose](https://pillow.readthedocs.io/en/stable/reference/ImageOps.html)（官方文档）— 解码源头按 EXIF Orientation 掰正 90°/270° 翻转，替代手写旋转矩阵。
- [FFmpeg · Stream copy（-c:v copy）](https://ffmpeg.org/ffmpeg.html#Stream-copy)（官方文档）— 流拷贝只改容器不改编码，加背景音乐零重编、视频画质零损失。
- [ITU-R BT.709 · Parameter values for HDTV](https://www.itu.int/rec/R-REC-BT.709)（权威引文）— 高清色彩矩阵与传递函数的权威标准，像素级验收防止 BT.709/BT.601 混用。
- [如何降低 AI 代码的方差：主管视角的 Cursor 规则工程实践](https://yijinlee.com/articles/article-40)（站内深度）— 同样把人负责边界、AI 负责实现的协作方式落到工程约束上。

