11

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

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

因此,通过假设第一个图像作为基础图像,有谁知道我是否/如何计算相机为图像 2 移动了多少,如下所示: 在此处输入图像描述

4

1 回答 1

15

我建议您为此使用 OpenCV。我也认为,这个问题更适合 StackOverflow。

关于这个主题的教科书是 Hartley 和 Zisserman 的“Multiple-View Geometry”。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。

于 2012-04-14T22:45:57.163 回答