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

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

Img1

enter image description here

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 |
< p >这是getPerspectiveTransform给出的矩阵吗?

当我将这个3x3旋转矩阵用于warpPerspective中时,除了左上角有一些东西之外,我得到的几乎是一个空白图像。(也许是围绕图像旋转的轴错误了)

enter image description here

我做错了什么?

注意 : 两张图片之间还有一小段平移(对于糟糕的图片,我很抱歉)

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

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

从我现在的理解来看,我需要对此进行“图像矫正”。有关如何使用可用信息进行操作的任何想法吗? - harsh
1个回答

2
如果我理解正确,您有两张从智能手机相机拍摄的图像,您至少大致知道内部矩阵和两张图像之间的相对3D旋转姿态。您还说两张图像之间存在小的平移,这很好,因为否则您将无法计算深度。
不幸的是,您没有足够的信息来直接估计深度。基本上,从两个图像估计深度需要:
1. 找到两个图像之间的点对应关系
根据您想要做什么,这可以以密集方式(即对于图像中的所有点)或稀疏方式(即仅对于少数点)完成。当然,后者计算成本较低,因此更适用于智能手机。
  • 密集匹配需要对图像进行矫正,以使计算变得可行,但如果在智能手机上执行,这可能需要很长时间。图像矫正可以通过校准方法(需要知道两个图像姿态之间的旋转+平移、内部相机矩阵和相机畸变系数)或非校准方法(需要知道两个图像之间稀疏点匹配和基础矩阵,可以从匹配中估计)来实现。

  • 稀疏匹配需要在两个图像之间匹配显著特征(例如SURFs或SIFTs,或更高效的特征)。这具有比密集匹配更高的效率和更高的精度优势。

2. 三角测量对应点以估计深度

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


在您的情况下,假设您的相对旋转和内部相机矩阵足够准确(我怀疑),您仍然缺少平移和畸变系数。
但是,您仍然可以应用经典的立体三角测量方法,这需要准确校准您的相机并估计完整的相对姿态(即旋转+平移)。
您的相机校准将使您能够估计准确的内部矩阵和相关的畸变系数。建议这样做是因为您的相机不会与其他手机中的相机完全相同(即使是相同的手机型号)。例如,请参见this tutorial,该教程展示了方法,尽管代码示例是使用C++编写的(Android的等效代码也肯定存在)。
一旦您准确估计了内部参数,估计完整的相对姿态(即旋转和平移)的一种方法是计算基础矩阵(使用两个图像之间找到的特征匹配),然后使用相机矩阵推断本质矩阵,最后将本质矩阵分解为相对旋转和平移。请参见此链接,其中给出了从基础矩阵推断本质矩阵的公式,以及此链接,其中解释了如何从本质矩阵计算旋转和平移。
另外,为了回答你关于 warpPerspective 的其他问题,你需要使用 K.R.inv(K) 或者 K.inv(R).inv(K),具体取决于你要变形的图像。这是因为 R 是一个三维旋转矩阵,与像素坐标几乎没有关系。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接