从方向传感器数据旋转图像

时间:2014-11-24 21:09:34

标签: android opencv 3d-reconstruction

我想从移动相机的2张图像中计算深度信息。使用Sensor.TYPE_ROTATION_VECTOR我有两个图像的四元数以及从Img1到Img2的相对四元数。

IMG1

enter image description here

q1 = 0.7545 - 0.1137i - 0.2715j - 0.5865k

Img2

enter image description here

q2 = 0.7706 - 0.2252i - 0.3511j - 0.4817k

相对季铵是:

qr = -0.9850 + 0.0072i + 0.1329j - 0.1097k

即,相对旋转矩阵是

|0.9406   -0.2142    -0.2635 |
|0.2180    0.9758    -0.0150 |
|0.2604   -0.0433     0.9645 |

这是矩阵getPerspectiveTransform给出的吗?

当我在warpPerspective中使用这个3x3旋转矩阵时,除了左上角的某些东西外,我得到一张几乎空白的图像。 (可能图像旋转的轴是错误的)。

enter image description here

我做错了什么?

注意:两张图片之间也有一个小翻译(对不好的图片感到抱歉)

编辑1 :根据此link,对于我的第二代Moto G,我得到了一个内在的相机矩阵,

K = |-3570   0         1632 |
    |  0   3554.39   1218.65|
    |  0     0           1  |

1 个答案:

答案 0 :(得分:2)

如果我理解正确,你有两张从智能手机相机拍摄的图像,你知道(至少近似)内在矩阵,以及拍摄两张图像的姿势之间的相对三维旋转。你也说这两个图像之间有一个小的平移,这很好,因为否则你无法计算深度。

不幸的是,您没有足够的信息来直接估算深度。基本上,从两幅图像估算深度需要:

<强> 1。查找两个图像之间的点对应关系

根据您想要做的事情,可以对图像中的所有点(即以密集方式)或仅针对几个点(即以稀疏方式)进行此操作。当然,后者的计算成本较低,因此更适合智能手机。

  • 密集匹配需要纠正图像,以使计算易于处理,但如果在智能手机上执行,则可能需要很长时间。可以使用校准方法(需要知道图像的两个姿势之间的旋转+平移,内在相机矩阵和相机的失真系数)或非校准方法(需要知道)来实现图像校正。两个图像和基本矩阵之间的稀疏点匹配,可以从匹配中估算出来。)

  • 稀疏匹配需要匹配两个图像之间的显着特征(例如,SURF或SIFT,或更有效的特征)。这样做的优点是比密集匹配更有效,而且更准确。

<强> 2。对相应点进行三角测量以估算深度

三角测量需要知道内在参数(相机矩阵和失真系数)和外在参数(姿势之间的相对旋转和平移,形成哪些图像)。


在你的情况下,假设你的相对旋转和内在相机矩阵足够准确(我怀疑),你仍然缺乏平移和失真系数。

但是,您仍然可以应用经典的立体三角测量方法,这需要对相机进行精确校准并估计完整的相对姿势(即旋转+平移)。

使用相机校准可以估算出准确的内在矩阵和相关的失真系数。建议执行此操作,因为您的相机与其他手机中的相机不完全相同(即使它是相同的手机型号)。参见例如this tutorial,它显示了方法,尽管代码示例是在C ++中(对于android来说必须存在等价物)。

一旦估计准确内在参数,估计完全相对姿势(即旋转和平移)的一种方法是计算基本矩阵(使用两个图像之间找到的特征匹配),然后用相机矩阵推断出基本矩阵,最后将基本矩阵分解成相对旋转和平移。参见this link,它给出了从基本矩阵推断出基本矩阵的公式,以及this link,它解释了如何计算基本矩阵的旋转和平移。


另外,要回答与warpPerspective相关的其他问题,您需要使用K.R.inv(K)K.inv(R).inv(K),具体取决于您要扭曲的图像。这是因为R是3D旋转,与像素坐标无关。