针孔图像derolling的原理

为什么做图像derolling

  • 图像derolling的工作简单来说就是对图像进行warp去除果冻效应,如下图所示

derolling的过程只考虑相机的旋转的原因如下:

  • 很难使用imu进行准确地测量平移量。加速度计的数据必须积分两次,以获得平移分量。相比之下,陀螺仪测量旋转速度。因此,陀螺仪数据只需要积分一次,就可以获得相机的方向。因此,平移测量的精度明显不如旋转朝向的测量值。

  • 即使我们可以准确地测量平移,这也是不够的,因为不同深度的物体移动不同的数量不同。因此,我们必须依靠双目立体或基于特征的运动恢复结构(SfM)算法来获取深度信息。由于视差和遮挡,为了消除平移而扭曲帧是非常重要的。这些方法是不鲁棒的,而且目前计算成本太高,无法在移动平台上实时运行。

  • 相机抖动和卷帘快门畸变主要来自于旋转。这种情况是因为平移随着深度的增加而迅速衰减,而且物体通常离镜头足够远,因此平移相机抖动在图像中不会产生明显的运动

一般的针孔相机建模

  • 一致相机的内参K,相机坐标系下一点X可以通过内参K投影得到像素坐标x, 同样可以将像素坐标x通过反投影得到归一化的相机坐标系下的一点X。

  • 进一步考虑世界坐标系到相机坐标系的旋转,可以得到如下的公式:

  • 进一步可以已通过已知的IMU的角速度的数据通过积分得到对应的t1时刻到t2时刻的旋转,然后旋转矩阵进行积分就可以得到t0时刻到tn时刻的旋转矩阵。

相机运动

  • 把世界坐标系的原点设定为相机坐标系的原点。相机的运动可以用它在 t 时刻的旋转 R(t) 来描述。因此,对于任何场景中的点 X , t 时刻对应的图像坐标点 x 为
  • 旋转矩阵 R(t)∈SO(3) 是通过相机旋转角 Δθ(t) 来计算的。采用四元数SLERP球面线性插值,为了平滑地插值相机的方向,并避免万向节锁问题。 Δθ(t) 是通过陀螺仪测量的角速度 ω(t) 直接获取的:

derolling过程进行建模

  • 如图所示,描述的是同一个世界坐标系下的一点X在xi和xj两个图像上的投影,其中旋转矩阵是与imu的积分有关,如上描述的从某一时刻到某一个时刻的积分可以表达两个时间点的旋转。

  • 因此两张图像的同一个像素的对应关系如下所示:

  • 由此可以将两张图像的同一个点建立warp关系。由此可知,一张需要derolling的图像,可以根据每一行的曝光时间确定旋转矩阵,然后以第一行为基准作为参考坐标系,将后续所有行的图像根据上面的公式warp到参考坐标系上,从而去消除rolling的影响。如下图所示,最外层的平行四边形是rolling的图像,然后里面的框是derolling的图像,小点表示一个一个像素,可以清晰的看到同一行(即derolling的图像的一行)的小点,对应到rolling图像的多行,所以derolling的主要目的就是求得对应的旋转矩阵后得到warp的矩阵,将像素重组得到有效的derolling的图像。

分块加速

  • 因为对每一行都去计算一个warp矩阵的计算量是非常大,而且在论文中验证也是没有必要,可以将一张待derolling的图像进行分块,然后只要计算每一个小块的warp矩阵即可实现derolling的目的。如下图所示:

参考文献

  • Magerand, Ludovic, and Adrien Bartoli. "A generic rolling shutter camera model and its application to dynamic pose estimation." International symposium on 3D data processing, visualization and transmission. 2010.

  • Karpenko, Alexandre, et al. "Digital video stabilization and rolling shutter correction using gyroscopes." Stanford University Computer Science Tech Report CSTR 3.2011 (2011): 278.

相关推荐
艾莉丝努力练剑1 小时前
【LeetCode&数据结构】单链表的应用——反转链表问题、链表的中间节点问题详解
c语言·开发语言·数据结构·学习·算法·leetcode·链表
_殊途3 小时前
《Java HashMap底层原理全解析(源码+性能+面试)》
java·数据结构·算法
珊瑚里的鱼6 小时前
LeetCode 692题解 | 前K个高频单词
开发语言·c++·算法·leetcode·职场和发展·学习方法
秋说7 小时前
【PTA数据结构 | C语言版】顺序队列的3个操作
c语言·数据结构·算法
lifallen7 小时前
Kafka 时间轮深度解析:如何O(1)处理定时任务
java·数据结构·分布式·后端·算法·kafka
liupenglove8 小时前
自动驾驶数据仓库:时间片合并算法。
大数据·数据仓库·算法·elasticsearch·自动驾驶
python_tty9 小时前
排序算法(二):插入排序
算法·排序算法
然我9 小时前
面试官:如何判断元素是否出现过?我:三种哈希方法任你选
前端·javascript·算法
F_D_Z9 小时前
【EM算法】三硬币模型
算法·机器学习·概率论·em算法·极大似然估计
秋说10 小时前
【PTA数据结构 | C语言版】字符串插入操作(不限长)
c语言·数据结构·算法