如何使用特征仿射矩阵的特征Jacobi SVD

时间:2018-01-08 20:35:56

标签: c++ computer-vision eigen svd

问题:我正在尝试使用Eigen JacobiSVD模块计算旋转矩阵的SVD,以计算旋转矩阵的单值分解。

预期:我应该能够将我的Eigen :: Affine3d类型的旋转矩阵传递给svd方法,然后使用SVD中的U和V生成一个类型为Eigen的新旋转矩阵:: Affine3d。

观察 svd方法不会将我的tSixDof矩阵作为可接受的参数。

问题为什么我不能使用仿射矩阵作为输入?有没有更好的方法来执行此操作?

// Resolve numerical errors in the rotation matrix by implementing the 
// orthogonal procrustes problem algorithm.

void SixDof::resolveRotation()
{
   //initial SixDof
   SixDof tSixDof;

   Eigen::Index n = tSixDof.rows();
   Eigen::Index m = tSixDof.rows();

   Eigen::Matrix3d U;
   Eigen::Matrix3d V;
   Eigen::Matrix3d R;

   Eigen::JacobiSVD<Eigen::Matrix3d> svd(tSixDof.rotation() 
   Eigen::ComputeFullU | Eigen::ComputeFullV);
   U = svd.matrixU();
   V = svd.matrixV();

   R = U*V.transpose();
   //Resolved SixDof
   tSixDof.rotation() = R;

 }

SixDof课程

class SixDof : public Eigen::Affine3d 
{
public:
SixDof();
SixDof(const Eigen::Affine3d& aOther);
void resolveRotation();
};

1 个答案:

答案 0 :(得分:1)

3x3旋转矩阵不是Affine3D变换。从文档:&#34;通用仿射变换由Transform类表示,其内部是(Dim + 1)^ 2矩阵。&#34;。要执行用于调整嘈杂旋转矩阵M的Procrustes,您需要使用3x3 Eigen矩阵(存储M)调用svd。