本次分析使用 5 张去除画面水印的原始照片、2026-06-15-11-06-30-0.mp4 视频及 osd数据.txt。照片画面未叠加人员编号、经[坐标已隐藏]方位角或拍摄时间等文字,但文件内部仍完整保留 EXIF 和 DJI XMP 元数据;视频用于连续目标识别,并通过帧PTS与OSD建立时间对应关系。
照片、视频和 OSD 原文件均未修改。
原始照片属性
| 项目 | 结果 |
|---|---|
| 图像格式 | JPEG |
| 图像尺寸 | 4032 × 3024 |
| 相机/无人机型号 | DJI M4TD |
| 图像源 | ZoomCamera |
| 定位状态 | RTK |
| 高度类型 | RtkAlt |
| 无人机序列号 | 1581F8HGX252L00A01HD |
| 元数据 | 保留 EXIF 与 DJI XMP |
DJI XMP 中包含拍摄时间、经[坐标已隐藏]绝对高度、相对高度、无人机姿态、云台姿态、飞行速度和相机信息。因此,去除画面水印不会影响照片与 OSD 数据的精确匹配。
2. 匹配方法
- 读取照片 XMP 中的
CreateDate,作为照片的准确拍摄时间。 - 使用照片文件名中的时间进行一致性检查,5 张照片的文件名时间均与 XMP 时间完全一致。
- 在 OSD 中查找与照片拍摄时间最接近的记录。
- 使用照片 XMP 中的经[坐标已隐藏]绝对高度、飞行姿态和云台姿态与 OSD 进行交叉校验。
- OSD 约每 2 秒采样一次,因此照片时刻通常位于相邻两条 OSD 记录之间。
5 组照片与最近 OSD 记录的时间差均小于 0.6 秒,平面坐标差为 0.007 至 0.072 米,绝对高度差为 0.036 至 0.132 米,匹配结果可靠。
3. 照片原始元数据
| 编号 | 拍摄时间 | [坐标已隐藏][坐标已隐藏]绝对高度(米) | 相对高度(米) | 定位状态 | |---|---|---:|---:|---:|---:|---| | 0001 | 2026-06-15 11:11:01 | 114.127909198 | 30.861254631 | 146.117 | 51.326 | RTK | | 0002 | 2026-06-15 11:11:40 | 114.126828554 | 30.862544515 | 147.888 | 53.097 | RTK | | 0003 | 2026-06-15 11:12:21 | 114.128083783 | 30.863489101 | 145.006 | 50.215 | RTK | | 0004 | 2026-06-15 11:13:07 | 114.125727540 | 30.863714579 | 142.123 | 47.332 | RTK | | 0005 | 2026-06-15 11:13:54 | 114.125581324 | 30.861541427 | 142.127 | 47.336 | RTK |
照片姿态及云台数据
| 编号 | 飞行横滚角 | 飞行俯仰角 | 飞行偏航角 | 云台横滚角 | 云台俯仰角 | 云台偏航角 | X/Y/Z速度(m/s) | 拍摄方式 |
|---|---|---|---|---|---|---|---|---|
| 0001 | -1.70° | -2.00° | -39.50° | 0.00° | -45.00° | -39.00° | 0.0 / 0.0 / 0.0 | 悬停,约45°斜拍 |
| 0002 | -2.00° | -1.30° | -35.60° | 0.00° | -90.00° | -36.20° | 0.0 / 0.0 / -0.1 | 悬停,90°垂直俯拍 |
| 0003 | +0.30° | -3.30° | -126.50° | 0.00° | -45.00° | -125.90° | 0.0 / -0.1 / 0.0 | 基本悬停,约45°斜拍 |
| 0004 | +0.70° | -0.30° | +137.10° | 0.00° | -45.00° | +137.60° | 0.0 / 0.0 / 0.0 | 悬停,约45°斜拍 |
| 0005 | -2.00° | 0.00° | +51.50° | 0.00° | -45.00° | +52.10° | 0.0 / 0.0 / 0.0 | 悬停,约45°斜拍 |
说明:照片原始元数据表明 0001、0003、0004、0005 均为约 45°斜拍,0002 为 90°垂直俯拍。
4. 照片与最近 OSD 记录
| 编号 | 照片时间 | 最近 OSD 时间 | OSD相对照片时间差(秒) | 坐标差(米) | 照片绝对高度(米) | OSD高度(米) | 高度差(米) |
|---|---|---|---|---|---|---|---|
| 0001 | 11:11:01 | 11:11:00.546 | -0.454 | 0.021 | 146.117 | 145.991 | -0.126 |
| 0002 | 11:11:40 | 11:11:40.548 | +0.548 | 0.007 | 147.888 | 147.791 | -0.097 |
| 0003 | 11:12:21 | 11:12:20.542 | -0.458 | 0.072 | 145.006 | 144.891 | -0.115 |
| 0004 | 11:13:07 | 11:13:06.476 | -0.524 | 0.039 | 142.123 | 141.991 | -0.132 |
| 0005 | 11:13:54 | 11:13:54.475 | +0.475 | 0.013 | 142.127 | 142.091 | -0.036 |
表中的时间差计算方式为“OSD时间减照片时间”。负数表示 OSD 记录早于照片,正数表示 OSD 记录晚于照片。
0003 云台角采样说明
0003 原始照片 XMP 记录的云台俯仰角为 -45.00°。最近的一条 OSD 记录位于照片前 0.458 秒,其云台俯仰角为 -68.1°;照片后一条 OSD 记录位于 11:12:22.549,其云台俯仰角已经变为 -45.0°。
这表明云台在两条 OSD 采样之间从约 -90°转向-45°,照片拍摄时已到达-45°。对于照片样本,应优先采用照片自身XMP姿态;对于视频帧,应使用帧时间、前后OSD数据和插值或姿态变化规则进行匹配,不能只取单条最近记录。
5. 高度字段说明
照片同时提供两类高度:
AbsoluteAltitude:RTK绝对高度,与OSD中的height基本一致,本组差值不超过0.132米。- `Re[坐标已隐藏]相对于起飞点或参考面的高度,本组约为47至53米。
向研究院交付时应明确高度字段名称和高程基准,避免将相对高度与绝对高度混用。当前数据证明OSD中的height应与照片的RTK绝对高度进行对应。
6. 视频文件分析
本数据包中的 2026-06-15-11-06-30-0.mp4 可用于后续 YOLO 目标识别及视频帧与 OSD 数据匹配。
视频基础参数
| 项目 | 数值 |
|---|---|
| 文件名 | 2026-06-15-11-06-30-0.mp4 |
| 视频编码 | H.264 |
| 视频分辨率 | 960 × 720 |
| 视频帧数 | 26455 |
| 标称帧率 | 30 fps |
| 平均帧率 | 约 27.41 fps |
| 视频流时长 | 965.057 秒 |
| 文件总时长 | 965.237 秒,约 16 分 05.237 秒 |
MP4 creation_time | 2026-06-15 03:06:30 UTC |
| 北京时间开始时刻 | 2026-06-15 11:06:30.000 +08:00 |
| 北京时间结束时刻 | 2026-06-15 11:22:35.237 +08:00 |
该视频的标称帧率为 30 fps,但根据总帧数和视频流时长计算,平均帧率约为 27.41 fps。因此,不能只用“帧号除以 30”计算帧时间。正式匹配必须读取每一帧在视频容器中的 PTS(Presentation Timestamp,显示时间戳)。
视频性质说明
5 张照片为 4032 × 3024 的相机原始 JPEG,保留 DJI EXIF/XMP;该视频为 960 × 720 的 H.264 码流,没有与照片相同的逐帧 DJI XMP 信息。该视频可作为原始识别输入使用,但从分辨率和数据形态看,应按平台视频码流处理,不应表述为相机原始分辨率视频。
视频反算条件确认
经确认,本案例中视频像素坐标进行地理位置反算所需的以下条件均正确,可按当前视频、OSD及相机配置直接使用,不再作为缺失数据或待确认事项:
- 视频对应的镜头类型正确;
- OSD 中记录的变焦倍率正确;
- 平台画面缩放或裁剪关系正确;
liveviewWorldRegion与视频像素坐标的映射关系正确;- 相机内参、畸变参数及不同变焦倍率下的视场角参数正确。
实际反算时仍应读取识别帧对应时刻的变焦倍率和 liveviewWorldRegion,并选择相应的镜头及相机参数参与计算。这属于逐帧参数应用,不代表当前数据存在缺失。
7. 视频与 OSD 时间覆盖关系
| 数据 | 开始时间 | 结束时间 | 时长 |
|---|---|---|---|
| OSD | 11:06:22.773 | 11:18:51.281 | 748.508 秒 |
| 视频 | 11:06:30.000 | 11:22:35.237 | 965.237 秒 |
| 视频与OSD有效重叠区间 | 11:06:30.000 | 11:18:51.281 | 741.281 秒 |
- OSD 在视频开始前已有 7.227 秒数据,可作为视频起始位置之前的轨迹上下文。
- 视频从 PTS
0.000到约741.281秒的帧可以匹配到 OSD。 - 视频约从
00:12:21.281(相对视频开始)之后进入无 OSD 区间。 - 视频最后约 223.956 秒,即约 3 分 43.956 秒,没有对应 OSD 数据。
- 超出 OSD 覆盖范围的帧仍可保留 YOLO 识别结果,但必须标记为“无对应OSD”,不得生成目标地理坐标。
8. 视频帧与 OSD 匹配逻辑
8.1 帧绝对时间
视频帧的绝对时间按以下公式计算:
帧绝对时间 = 视频 creation_time(北京时间) + 帧 PTS
其中视频首帧基准时间为:
2026-06-15 11:06:30.000 +08:00
读取帧PTS时应使用 ffprobe、FFmpeg或解码库返回的实际时间戳。帧号仅作为结果索引,不作为精确授时依据。
8.2 查找前后 OSD 点
对于帧绝对时间 T,在按时间排序的 OSD 记录中查找:
前点:timestamp <= T 的最后一条记录
后点:timestamp >= T 的第一条记录
若前点为 T0、后点为 T1,插值比例为:
α = (T - T0) / (T1 - T0)
经[坐标已隐藏]高度和速度等连续数值采用线性插值:
value(T) = value(T0) + α × (value(T1) - value(T0))
8.3 角度插值
无人机偏航角和云台偏航角可能以 -180°~180° 或 0°~360° 表示。插值前应归一化,并沿最短旋转方向计算,避免出现 179° 到 -179° 被错误插值为 0° 的情况。
俯仰角和横滚角在数值连续且姿态变化平稳时可线性插值。出现以下情况时,应将帧标记为“非平稳区间”:
- 前后OSD的云台角发生明显跳变;
- 无人机快速转向、升降或加速;
- 变焦倍率发生变化;
liveviewWorldRegion发生变化;- 前后OSD时间间隔异常增大。
非平稳区间仍保存前后原始OSD值和时间差,不应只输出一条最近记录作为确定姿态。0003照片对应时刻就是云台转动发生在两条OSD采样之间的实例。
8.4 匹配计算示例
假设某识别帧的 PTS 为 310.000 秒:
帧绝对时间 = 11:06:30.000 + 310.000秒
= 11:11:40.000
该时刻前后的OSD记录为:
T0 = 11:11:38.540
T1 = 11:11:40.548
α = (40.000 - 38.540) / (40.548 - 38.540)
≈ 0.727
因此,该帧的位置、高度和速度可按约 72.7% 的比例在两条OSD记录之间插值。姿态角需先检查是否跨越角度边界或处于云台快速转动区间。
9. 照片时间锚点与视频位置
5 张原始照片可作为视频时间轴、画面内容和 OSD 数据的交叉验证锚点:
| 编号 | 照片绝对时间 | 相对视频开始时间 | 约对应标称30fps帧号 | 是否在有效OSD区间 |
|---|---|---|---|---|
| 0001 | 11:11:01 | 271 秒 | 8130 | 是 |
| 0002 | 11:11:40 | 310 秒 | 9300 | 是 |
| 0003 | 11:12:21 | 351 秒 | 10530 | 是 |
| 0004 | 11:13:07 | 397 秒 | 11910 | 是 |
| 0005 | 11:13:54 | 444 秒 | 13320 | 是 |
表中的帧号仅为按标称30fps计算的快速定位参考。精确定位仍应使用PTS。5个锚点均位于视频与OSD的有效重叠区间,可以通过画面内容核对视频时间轴是否存在整体偏移。
10. YOLO 识别结果建议格式
视频可在后续运行 YOLO,得到目标类别、置信度及像素框。每条识别结果建议至少包含:
| 字段 | 说明 |
|---|---|
video_file | 视频文件名 |
frame_index | 解码后的帧序号,仅作为索引 |
frame_pts_sec | 帧PTS,单位秒 |
frame_time | 按视频开始时间换算的绝对时间 |
class_id / class_name | 目标类别 |
confidence | YOLO识别置信度 |
pixel_points | 目标框4个像素点 |
osd_prev_index / osd_next_index | 前后相邻OSD记录索引 |
osd_prev_time / osd_next_time | 前后OSD时间 |
| `interpo[坐标已隐藏]插值比例α | |
| `interpo[坐标已隐藏]插值后的经[坐标已隐藏]高度、速度和姿态 | |
time_gap_ms | 帧到前后OSD的时间差 |
motion_state | stable、non_stable或no_osd |
osd_context | 前10条及后10条OSD原始记录 |
YOLO矩形框可按以下方式转换为4个像素点:
左上:(x1, y1)
右上:(x2, y1)
右下:(x2, y2)
左下:(x1, y2)
推荐处理流程:
- 解码视频并读取每帧PTS,同时运行YOLO。
- 将PTS换算为绝对时间,判断是否处于OSD有效覆盖区间。
- 查找前后相邻OSD记录并执行位置、速度和姿态插值。
- 检测云台角、变焦和画面区域变化,生成姿态稳定标记。
- 输出YOLO目标框4点、插值遥测及前后各10条OSD记录。
no_osd帧仅输出识别数据,不输出推算地理坐标。
11. 结论
这5张照片是保留完整DJI元数据的原始图像,去除画面水印后仍可独立获取拍摄时间、RTK坐标、高度、无人机姿态和云台角度。照片与OSD在时间、位置和绝对高度上高度一致,可以作为像素位置转地理坐标算法的验证样本。
视频可作为连续YOLO识别输入,并通过视频开始时间 + 帧PTS与OSD建立对应关系。视频前741.281秒具备OSD匹配条件,最后约223.956秒缺少OSD,只适合进行图像识别,不适合进行地理位置反算。
与上一版相比,本次以原始照片XMP为权威来源,修正了0003的拍摄角度:0003实际为约45°斜拍,而不是68°俯拍。同时补充了视频码流与OSD的匹配边界、插值规则和YOLO结果数据结构。