我正在尝试编写一些代码来计算基本矩阵,以确定立体图像之间的关系。我从大多数人推荐的Hartley和Zisserman书开始,但它没有任何实际的例子,它的示例代码是在MATLAB中,我没有。然后我切换到An introduction to 3D Computer Vision Techniques and Algorithms,这更实用,并有实际的例子。我使用Python和numpy实现了推荐的8点算法,但是我无法验证它的有效性。
我正在使用第48页上列出的数据集(使用上面的链接查看Google图书摘录)。当我对点进行标准化时,我会得到与该书相同的结果。但是,当我使用numpy的SVD函数计算基本矩阵时,我得到F的以下值:
[[-0.01851684 -0.21631176 -0.67036356]
[ 0.2605251 -0.01023853 0.14234079]
[ 0.63748775 -0.09404508 -0.00220713]]
该矩阵满足方程 p_R ^ * F * p_L = 0 所以看起来是正确的。但是,它与书中计算的矩阵非常不同。我尝试使用OpenCV的cv.FindFundamentalMat()仔细检查答案,我得到了第三个答案:
[[ 22.98129082 271.46453857 853.74273682]
[-334.1673584 -4.84123087 -175.99523926]
[-809.88891602 125.99833679 1. ]]
我不是那些其他两个矩阵的计算方法,但我在网上找不到任何基本矩阵计算的例子来验证我对8点算法的实现。我的实现返回一个满足等式的值的事实让我有信心,但我担心我做了一些愚蠢的事情,这就是为什么我无法匹配书中或OpenCV的结果。
答案 0 :(得分:6)
请注意,基本矩阵定义为常数因子(您可以通过检查极线约束来轻松验证)。尝试将OpenCV矩阵与-8.0574e-04相乘,你会发现两个矩阵在最后非常相似: - )
因此,你的结果可能很好。结果之间的微小差异可能是由于OpenCV采用了与8点算法不同(可能更强大)的方法。