视频去畸变
更新时间:2026-07-29
简介
视频去畸变算子,用标准 opencv 通用畸变模型(针孔 pinhole + 鱼眼 fisheye)对视频逐帧去畸变。兼容性优先,无 opencv-contrib 依赖,可与 AIHC 现有算子共存于统一环境。
功能描述
• 支持 pinhole(针孔,径向 + 切向畸变)与 fisheye(鱼眼)两种相机模型,覆盖绝大多数客户标定场景。
• 从输入内参 K、畸变系数(可选新内参)构建去畸变重映射表,用 cv2.remap 逐帧去畸变。
• 通过 subprocess 调系统 ffmpeg 分片编码(libx264),再 concat 合成 mp4,无 ffmpeg-python 依赖。
• 输出去畸变后视频路径,可选回传 BOS;内置计数器,单行失败时按 fail_on_error 决定抛异常或返回 None。
算子参数
输入
transform 入参顺序:(video, intrinsics, distortion_coefficients, intrinsics_new)。
| 输入 | 含义 |
|---|---|
| video | 视频(bos/http url、base64 或 binary,由 video_src_type 决定) |
| intrinsics | 3x3 相机内参矩阵 K |
| distortion_coefficients | 畸变系数;pinhole 为 [k1,k2,p1,p2(,k3)](长度 4 或 5),fisheye 为 [k1,k2,k3,k4](长度 4)。可选,缺省为零畸变 |
| intrinsics_new | 新相机内参(去畸变后目标内参);可选,None 时用原 K |
输出
| 输出 | 含义 |
|---|---|
| result | pa.large_string(),去畸变后视频的路径(本地或 BOS);失败为 None |
参数
| 参数名称 | 类型 | 默认值 | 描述 |
|---|---|---|---|
| video_src_type | str | "video_url" | 视频输入类型,可选 "video_url"/"video_base64"/"video_binary" |
| camera_model | str | "pinhole" | 相机畸变模型,可选 "pinhole"(针孔)/"fisheye"(鱼眼) |
| output_video_dir | str | "/tmp/aihc_undistort" | 去畸变视频的本地输出目录 |
| output_bosdir | str | "" | 非空时去畸变视频回传该 BOS 目录并返回 BOS 路径 |
| batch_size_each_video | int | 1000 | 每个临时 TS 分片的帧数 |
| crf | int | 22 | FFmpeg 编码质量(值越小质量越高) |
| fail_on_error | bool | False | 单行失败时是否立即抛异常,默认 False 返回 None;pipeline 建议显式设 True |
调用示例
Python
1from __future__ import annotations
2
3import os
4
5import daft
6from daft import col
7
8from daft.aihc.common.udf import aihc_udf
9from daft.aihc.functions.video.video_undistort import VideoUndistort
10
11VIDEO = "bos://your-bucket/sample.mp4" # MOCK
12OUTPUT_DIR = "/tmp/aihc_undistort" # MOCK
13
14os.environ.setdefault("BOS_ENDPOINT", "http://bj.bcebos.com")
15os.environ.setdefault("BOS_REGION", "bj")
16
17if __name__ == "__main__":
18 if os.getenv("DAFT_RUNNER", "native") == "ray":
19 import ray
20
21 ray.init(ignore_reinit_error=True)
22 daft.set_runner_ray()
23 daft.set_execution_config(actor_udf_ready_timeout=6000, min_cpu_per_task=0)
24
25 # 3x3 内参 + 畸变系数(示例值,真实使用替换为标定结果)
26 # pinhole: distortion = [k1, k2, p1, p2(, k3)]
27 samples = {
28 "video": [VIDEO],
29 "intrinsics": [[[300.0, 0.0, 320.0], [0.0, 300.0, 240.0], [0.0, 0.0, 1.0]]],
30 "distortion_coefficients": [[-0.2, 0.05, 0.0, 0.0, 0.0]],
31 "intrinsics_new": [None],
32 }
33 ds = daft.from_pydict(samples)
34 ds = ds.with_column(
35 "result",
36 aihc_udf(
37 VideoUndistort,
38 construct_args={
39 "video_src_type": "video_url",
40 "camera_model": "pinhole",
41 "crf": 22,
42 "output_video_dir": OUTPUT_DIR,
43 },
44 num_cpus=1,
45 concurrency=1,
46 batch_size=1,
47 )(
48 col("video"),
49 col("intrinsics"),
50 col("distortion_coefficients"),
51 col("intrinsics_new"),
52 ),
53 )
54 ds.show()
评价此篇文章
