【问题标题】:Projective Geometry - Find Plane in 3D using eigen投影几何 - 使用 eigen 在 3D 中查找平面
【发布时间】:2017-08-05 23:27:56
【问题描述】:

我正在尝试用 3D 中的三个点构建一个平面。 我想使用射影几何来实现这一点。

据我所知,可以“简单地”解决以下问题来找到一架飞机:

A * x = 0 ,where
A is a 3x4 Matrix - each row being one of the points (x,y,z,1)
x is the plane I want to find

我知道我需要一个约束。因此我想设置x(3) = 1。 有人可以指出正确的使用方法吗?

到目前为止,我有以下代码:

Eigen::Vector4f p1(0,0,1,1);
Eigen::Vector4f p2(1,0,0,1);
Eigen::Vector4f p3(0,1,0,1);

Eigen::Matrix<float,3,4> A;
A << p1.transpose(), p2.transpose(), p3.transpose();

// Throws compile error
// Eigen::Vector4f Plane = A.jacobiSvd(ComputeThinU | ComputeThinV).solve(Vector4f::Zero()); 

//throws runtime error (row-number do not match)
// Eigen::Vector4f Plane = A.fullPivHouseholderQr().solce(Eigen::Vector4f::Zero()); 

【问题讨论】:

标签: c++ 3d eigen projective-geometry


【解决方案1】:

一个 3x4 矩阵乘以一个 4 行向量将得到一个 3 行向量。因此,您必须解决Vector3f::Zero()。此外,对于固定大小的矩阵,您需要计算完整的 U 和 V。最后一行如下所示:

Vector4f Plane = A.jacobiSvd(ComputeFullU | ComputeFullV).solve(Vector3f::Zero());

开斋节 由于这个方程系统没有完全定义,它可能会给你 (0,0,0,0) 的平凡解。您可以通过将矩阵扩展为 4x4、求解 (0,0,0,1) 并将结果缩放 x(3) 来限制结果向量的长度来解决这个问题:

Eigen::Vector4f p1(0,0,1,1);
Eigen::Vector4f p2(1,0,0,1);
Eigen::Vector4f p3(0,1,0,1);
Eigen::Vector4f p4(1,1,1,1);

Eigen::Matrix<float,4,4> A;
A << p1.transpose(), p2.transpose(), p3.transpose(), p4.transpose();

// Throws compile error
Eigen::Vector4f Plane = A.jacobiSvd(Eigen::ComputeFullU | Eigen::ComputeFullV).solve(Vector4f::Unit(3)); 
Plane /= Plane(3);

这将为您提供所需的 (-1, -1, -1, 1) 解。

【讨论】:

  • 谢谢。现在代码编译但停在以下行:eigen_assert(EIGEN_IMPLIES(m_computeThinU || m_computeThinV, MatrixType::ColsAtCompileTime==Dynamic) &amp;&amp; "JacobiSVD: thin U and V are only available when your matrix has a dynamic number of columns.") inside the "JacobiSVD.h"
  • @NewTech 我更新了我的答案。问题是ComputeThinUComputeThinV 不适用于像Matrix&lt;float, 3, 4&gt; 这样的固定大小矩阵。
  • 啊。好的,现在代码运行完美。但只给出 (0,0,0,0) 的平凡解。我希望得到 (-1, -1, -1, 1)。有什么方法可以设置约束吗?
  • @NewTech 将向量的长度限制为非零,方法是使用非零的第四个矩阵行和向量中的第四个条目以非零值求解。跨度>
猜你喜欢
  • 1970-01-01
  • 2011-11-25
  • 1970-01-01
  • 1970-01-01
  • 2011-01-30
  • 2021-05-30
  • 1970-01-01
  • 2017-10-06
  • 2023-03-08
相关资源
最近更新 更多