投影几何 - 使用特征在三维中找平面

时间:2017-03-15 09:48:03

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

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

据我所知,人们可以简单地#34;解决以下问题寻找飞机:

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()); 

1 个答案:

答案 0 :(得分:1)

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

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

<强> Eidt 由于这个方程系统没有完全定义,它可能会给你(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)的所需解决方案。