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

时间:2012-04-14 22:28:28

标签: computer-vision

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

然后对于下一张图像(在相机移动之后),我识别出rubiks立方体的相同面,如此处所示 enter image description here

因此,假设第一张图像为基本图像,是否有人知道我是否可以计算相机移动了多少图像2,如下所示: enter image description here

1 个答案:

答案 0 :(得分: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.

替代解决方案

我确信更简单的方法也可以。这种方法的好处是不需要人工输入(无人监督)。对于可选步骤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。 p是A的正确核心,或Ap = 0的最小二乘解。

去平p,创建一个3x4矩阵。 P上。