6

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

图1

在此处输入图像描述

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

图2

在此处输入图像描述

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给出的吗?

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

在此处输入图像描述

我究竟做错了什么?

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

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

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

1 回答 1

2

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

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

1.找到两幅图像之间的点对应关系

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

  • 密集匹配需要对图像进行校正,以使计算易于处理,但是如果在智能手机上执行,这可能需要很长时间。图像校正可以使用校准方法(需要知道图像的两个位姿之间的旋转+平移、相机固有矩阵和相机的畸变系数)或非校准方法(需要知道两幅图像和基本矩阵之间的稀疏点匹配,可以从匹配中估计)。

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

2.对对应点进行三角剖分估计深度

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


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

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

相机的校准将使您能够估计准确的内在矩阵和相关的失真系数。建议这样做,因为您的摄像头与其他手机中的摄像头并不完全相同(即使它是相同的手机型号)。参见例如本教程,它显示了方法论,尽管代码示例是 C++ (对于 android 必须存在等价物)。

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


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

于 2014-12-05T21:01:32.090 回答