我正在尝试计算图像的相机位置.我有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/(该网站上的基础矩阵有一个示例章节.)
基本上,首先找到基本矩阵,然后通过了解相机的内部参数,找到位置的解决方案.
基本矩阵: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.
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.