相机矩阵的最小二乘解 [numpy]

0 投票
3 回答
1399 浏览
提问于 2025-04-15 15:26

我想用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,但这通常不是一件简单的事情。提前告诉你这个情况,因为我们在这里花了一些时间才搞明白这个问题。希望能帮你省去一些麻烦 =)

撰写回答