之前处理 Mini3 Pro 钻桥洞素材的时候,发现姿态球的录屏效果还不错。
当时就设想用姿态球数据反算飞机姿态,进而可以渲染特殊视角。这次终于渲染成功,特来分享。
【原理】
Mini3 Pro 云台默认模式为四平八稳的水平模式,相当于摄影机视野与外界地面保持水平,如下图所示:
云台视角,地面水平
录屏中虽然视野水平,但姿态球左倾,提示飞机实则左翼下压右翼上扬(如图),处于左转弯的状态中。
此时若切换 FPV 视角,即要求摄像机视野与机舱保持水平,则应按如下方式进行旋转变换:
FPV视角,机舱水平
此时姿态球液面修正回水平,飞机相对于摄像机姿态水平,于是就有了整个外部世界向右倾斜的效果,正所谓 FPV.
【操作】
有了以上的原理分析,接下来就是繁琐的图像处理+编程解算。
首先是 ffmpeg 抽帧获得全部的视频帧,一分多钟总计 1950 帧:
原视频抽帧
之后上 Photoshop 批处理,图像裁剪获得姿态球区域,对比增强+二值化处理,获得清晰的姿态球二值图:
姿态球截取
之后就是霍夫变换检测直线了,需要检测出姿态球液面线的位置和角度。
期初偷懒,直接用 MATLAB::hough 进行直线检测,结果效果很差,有些不清晰的帧甚至没法可靠检测到姿态球液面。
一不做二不休,重新编写基于黑白能量分布的类霍夫变换,角度分辨率±0.5°:
类霍夫变换代码,MATLAB
我这破 i5 本算了一整夜(实际也懒得优化算法了,优化的时间,不如丢给电脑慢慢算)。一张姿态球图片的变换结果长这样:
某帧的类霍夫变换
图中红色最深的点,就对应姿态球的液面直线。
这个最红点的坐标,就是液面直线的方程参数。有了直线方程,也就有了直线的位置、倾斜角度等一众数据。
在二值图上画个红色直线预览一下,确认姿态球直线识别准确:
姿态球液面检测结果(红)
【效果】
至此,已经有了每帧的姿态球数据。理论上可以同时反解飞机俯仰(Pitch)、横滚(Roll)姿态。
但实际上 Pitch 修正涉及图像透视变换,实在太费心神。这里仅进行 Roll 轴修正,图片简单旋转即可。
把每一帧按照姿态参数进行旋转,再拼接回视频,终于会 FPV 特有的歪头了,不错不错:
渲染得 FPV 歪头效果
对照一下原始帧(上),歪头带来的 FPV 体验拉满:
原视频(上) vs FPV歪头(下)
视频对比(上半为Mini3P原始录屏,下半为渲染所得):
【成品】
最后给出成片(按理说该去渲染TF摄影的,但我觉着录屏更像FPV该有的样子,就偷懒渲染这个吧):
最后给 DJI 提个建议:
要是能在视频的录制字幕里边,记录机身(或云台) Yaw/Pitch/Roll 轴数据,好多图像识别的步骤都能给省下来了。
印象中早期的摄影记录是有这些数据的,后来可能出于某些考虑拿掉了。DJI 若实在觉着臃肿,做个开关给用户选择保存哪些数据也不错。
------------------------------------------------------------------------------------------------------------------
以上,使用姿态球反解飞机姿态,将平飞视频渲染回FPV视角,获得了额外的刺激加成。
最后祝大家永不炸鸡!