相机矩阵的最小二乘解 [numpy]
我想用numpy的最小二乘法来求解一个相机矩阵,这个矩阵是通过6组已知的3D点和对应的2D点来得到的。
我一直在参考这个网站:
http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/OWENS/LECT9/node4.html
目前我得到的相机矩阵的值似乎非常小:
[[ -1.01534118e-11 3.87508914e-11 -2.75515236e-11 5.57599976e+02]
[ -1.84008233e-11 2.78083388e-11 -9.67788509e-11 9.77599976e+02]
[ -2.59237076e-14 -8.57647287e-15 -9.09272657e-14 1.00000000e+00]]
我希望能够限制numpy的求解器,防止它得到一个几乎为零的简单解,也就是相机矩阵的值接近于零。
有没有人知道怎么限制numpy.linalg.lstsqr()
的求解过程?
3 个回答
0
“最小二乘法保持在一个点 x0 附近”这个方法有没有用呢?也就是说,你是否有一个想要靠近的相机矩阵 x0 呢?
“远离某个 x0”这个想法比较复杂,不好处理;而“靠近 x0 或 x1 等等”,也就是最小化
|Ax-b|^2 + w^2 (|x-x0|^2 + |x-x1|^2 + ...)
这个就简单多了。
1
我觉得你可能需要用到scipy.optimize里的fmin_*函数。这个优化教程讲解了基本的用法,而scipy.optimize.fmin_slsqp这个函数可以处理一些限制条件。
2
我需要正确安装scipy
这里有个关于安装scipy的小提示:从8.04版本开始,Ubuntu的发行版中scipy的构建有问题。不过在最新的9.10测试版中,这个问题已经解决了。你可以选择从头开始构建scipy,但这通常不是一件简单的事情。提前告诉你这个情况,因为我们在这里花了一些时间才搞明白这个问题。希望能帮你省去一些麻烦 =)