【问题标题】:Matlab: Efficiently do SVD many times? (to triangulate a 3D point cloud)Matlab:多次有效地执行 SVD? (对 3D 点云进行三角剖分)
【发布时间】:2014-09-05 21:14:39
【问题描述】:

上下文:对许多点对执行三角测量,2d 到 3d。我的方程式是:

Mv = 0    with    M = [P1 -x1 0]  (6x6 matrix)      v = [X, lambda1, lambda2]^T (6x1)
                      [P2 0 -x2] 

其中 P1、P2 是 3x4 投影矩阵,x1 和 x2 是 3D 点 X 的 2D 投影,而 lambdas 只是表示线平面交点的参数(不重要)。所有这些都是在齐次坐标中完成的,所以 M 是 6x6。

问题:通过对 M 进行 SVD,我可以得到两个 2D 点 x1 和 x2 的最小二乘三角剖分,得到一个 3D 点。如果我在所有点对上重复此操作,我可以获得点云。但是,在 for 循环中多次重复计算 SVD 效率极低;主要是,我必须先插入点,然后进行 SVD 来构造每个矩阵。有没有办法可以在点对列表上矢量化 SVD 计算?

任何建议将不胜感激!

【问题讨论】:

  • 今天想好了怎么解决。由于三角剖分的 SVD 是如何工作的,我担心要对 1000 个点进行三角剖分,您必须为 1000x1000 的矩阵求解 svd(尽管它会非常稀疏——对角线上只有 4x4 块)。这样,我认为你不会比使用 for 循环更有效率。但我没有给出任何证据......
  • 只是一种性能改进——如果对欧几里得点进行三角剖分(不均匀),则每个点保存一个坐标,这意味着M 变为 4x4,因此更容易进行 SVD。算法的变化是您不再求解齐次方程组,而是求解非齐次方程(而不是 Ax=0,您求解 Ax=b)。

标签: matlab computer-vision matlab-cvst svd point-clouds


【解决方案1】:

计算机视觉系统工具箱中现在有一个triangulate 函数。

【讨论】:

    猜你喜欢
    • 2012-05-10
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 2015-06-12
    • 2011-07-15
    • 2016-09-12
    • 2013-03-19
    • 2015-06-30
    相关资源
    最近更新 更多