我正在尝试计算图像的相机位置。我有2个rubiks立方体的图像。第一个图像被认为是基本图像,下一个图像是相机移动后的图像。因此,对于第一张图像,我假设相机位于(0,0,0)。在这张图片上,我然后识别出rubiks立方体正面的4个角(如图所示)(由4个蓝色圆圈标识的4个角)。
然后对于下一张图像(在相机移动之后),我识别出rubiks立方体的相同面,如此处所示
因此,假设第一张图像为基本图像,是否有人知道我是否可以计算相机移动了多少图像2,如下所示:
答案 0 :(得分:15)
我建议您使用OpenCV。我也认为,这个问题更适合StackOverflow。
关于这个主题的教科书将是Hartley和Zisserman的“多视图几何”。 http://www.robots.ox.ac.uk/~vgg/hzbook/(该网站上的基础矩阵有一个示例章节。)
基本上,首先找到基本矩阵,然后通过了解相机的内部参数,找到位置的解决方案。
基本矩阵:http://en.wikipedia.org/wiki/Fundamental_matrix_%28computer_vision%29
内在参数:像焦距一样的东西,主点在图像平面上的位置。如果你有F,那么E = K ^ t * F * K,如果K是内在矩阵并且两个图像都相同。
如何找到相机位置的解决方案:http://en.wikipedia.org/wiki/Essential_matrix#Determining_R_and_t_from_E
这就是我在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上。