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

Computer vision 如何通过比较两张照片来计算相机位置?,computer-vision,Computer Vision,我试图计算一幅图像的摄像机位置。我有两张rubiks立方体的图片。第一个图像被视为基础图像,下一个图像是相机移动后的图像。因此,对于第一幅图像,我假设相机位于(0,0,0)。在这张图片上,我识别了rubiks立方体正面的4个角,如图所示(4个角由4个蓝色圆圈标识)。 然后,对于下一张图像(相机移动后),我识别出与这里显示的相同的rubiks立方体面 因此,假设第一个图像为基础图像,有人知道我是否/如何计算图像2的相机移动量,如图所示: 我建议您使用OpenCV。我还认为,这个问题更适合Sta

我试图计算一幅图像的摄像机位置。我有两张rubiks立方体的图片。第一个图像被视为基础图像,下一个图像是相机移动后的图像。因此,对于第一幅图像,我假设相机位于(0,0,0)。在这张图片上,我识别了rubiks立方体正面的4个角,如图所示(4个角由4个蓝色圆圈标识)。

然后,对于下一张图像(相机移动后),我识别出与这里显示的相同的rubiks立方体面

因此,假设第一个图像为基础图像,有人知道我是否/如何计算图像2的相机移动量,如图所示:

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

关于这一主题的教科书将是哈特利和齐瑟曼的《多视图几何》。(该网站上有一个关于基本矩阵的示例章节。)

基本上,首先找到基本矩阵,然后通过了解摄像机的固有参数,找到位置的解

  • 基本矩阵:

  • 内在参数:像焦距和主点在图像平面上的位置。如果有F,那么E=K^t*F*K,如果K是内禀矩阵,并且对于两个图像都是相同的

  • 如何找到摄像机位置的解决方案:

算法 这就是我在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,-X_iX_i,-X_iY_i,-X_iZ_i-X_i) (0,0,0,0,X_i,Y_i,Z_i,1,-Y_iX_i,-Y_iY_i,-Y_iZ_i-Y_i)

然后求p,使Ap=0。即p是A的右核,或Ap=0的最小二乘解


取消展平p,以创建3x4矩阵。P.

如果必须为此校准摄像头,可以吗?这将涉及拍摄棋盘的照片和运行算法。重要的是,之后焦距不会改变。你需要结果做什么?您想要度和相对尺寸(无比例信息),还是需要全局单位(mm等)的答案?您有首选的编程语言吗?OpenCV是C/C++语言,带有Python和其他语言的API。Zisserman的网站上有Matlab的代码(我的答案中有链接)。它更多的是数学和几何相关的问题,与摄影无关。您想在StackOver flow上发布问题。有两种算法可以帮助您进行轴移动和几何计算下一个问题是颜色识别和哦,等等!!一个自动的rubix立方体解算器!是的,我可能会使用第二种解决方案,我知道点的三维位置。这并不理想,也不是我希望做的事情,但出于时间限制,目前我不得不采用这种方法。谢谢你的建议。如果你想得到相机的位置(以及图像中特征的3d位置),你描述的算法听起来很棒。为什么opencv中没有针对步骤4到9的方法?实际上,我认为这样的方法是存在的。查看文档中的三维重建。另一种方法肯定存在。