我想从移动相机的2张图像中计算深度信息。使用Sensor.TYPE_ROTATION_VECTOR
我有两个图像的四元数以及从Img1到Img2的相对四元数。
IMG1
q1 = 0.7545 - 0.1137i - 0.2715j - 0.5865k
Img2
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旋转矩阵时,除了左上角的某些东西外,我得到一张几乎空白的图像。 (可能图像旋转的轴是错误的)。
我做错了什么?
注意:两张图片之间也有一个小翻译(对不好的图片感到抱歉)
编辑1 :根据此link,对于我的第二代Moto G,我得到了一个内在的相机矩阵,
K = |-3570 0 1632 |
| 0 3554.39 1218.65|
| 0 0 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旋转,与像素坐标无关。