如何通过比较两张照片来计算相机位置?

hey*_*red 8 computer-vision

我正在尝试计算图像的相机位置.我有2个rubiks立方体的图像.第一个图像被认为是基本图像,下一个图像是相机移动后的图像.因此,对于第一张图像,我假设相机位于(0,0,0).在这张图片上,我然后识别出rubiks立方体正面的4个角(如图所示)(由4个蓝色圆圈标识的4个角). 在此输入图像描述

然后对于下一个图像(在相机移动之后),我识别出rubiks立方体的相同面,如此处所示 在此输入图像描述

因此,假设第一个图像作为基本图像,是否有人知道我是否可以计算相机移动了多少图像2,如下所示: 在此输入图像描述

Una*_*dra 15

我建议你使用OpenCV.我也认为,这个问题更适合StackOverflow.

关于这个主题的教科书将是Hartley和Zisserman的"多视图几何".http://www.robots.ox.ac.uk/~vgg/hzbook/(该网站上的基础矩阵有一个示例章节.)

基本上,首先找到基本矩阵,然后通过了解相机的内部参数,找到位置的解决方案.

算法

这就是我在OpenCV中的表现.我以前做过这个,所以它应该工作.

1. Run Feature Detection and Detector Extractor on both images. 
2. Match Features. 
3. Use F = cv::findFundamentalMatrix with Ransac. 
4. E = K.t() * F * K. // K needs to be found beforehand. 
5. Do SingularValueDecomposition of E such that E = U * S * V.t()
6. R = U * W.inv() * V.t() // W = [[0, -1, 0], [1, 0, 0], [0, 0, 1]]
7. Tx = V * Z *  V.t() // Z = [[0, -1, 0], [1, 0, 0], [0, 0, 0]]
8. get t from Tx (matrix version of cross product)
9. Find the correct solution. R.t() and -t are possiblities. 
10. Get overall scale by knowing the length of the size of the Rubrik's cube.
Run Code Online (Sandbox Code Playgroud)

替代方案

我确信更简单的方法也可以起作用.这种方法的好处是不需要人工输入(无人监督).对于可选步骤10(确定比例),情况并非如此.

一个不同的解决方案将利用Rubrik立方体几何的知识.例如,如果已知点的3D位置,则需要六(5.5)个点来估计相机的位置.

不幸的是,我不知道有任何软件会自动为您执行此操作.

所以这里是替代算法:将立方体角落的坐标记为(X_i,Y_i,Z_i),并且可能还指向其他可知位置.

标记相应的点u_i =(x_i,y_i).对于每个对应关系,在矩阵A中创建两条线.(X_i,Y_i,Z_i,1,0,0,0,0,-x_i X_i,-x_i Y_i,-x_i Z_i -x_i)(0,0,0,0) ,X_i,Y_i,Z_i,1,-y_i X_i,-y_i Y_i,-y_i Z_i -y_i)

然后找到p使得Ap = 0.Ie p是A的右核,或者是Ap = 0的最小二乘解.

将p展平,以创建3x4矩阵.P.