Eigen C ++;具有Eigen :: Transform的欧几里德变换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Eigen C ++;具有Eigen :: Transform的欧几里德变换相关的知识,希望对你有一定的参考价值。

给定旋转矩阵3x3 R和3维平移向量t的欧几里德变换,如何使用Eigen::Transform实现欧几里德变换?

X = R * X + t

我目前的方法无效:

Eigen::Transform<Type, 3, Eigen::Projective>  transformation;
...

Eigen::AngleAxis           rotation(R);
Eigen::Translation<Type,3> translation(t);

transformation = translation * rotation;

现在,我想逐列地应用于更大的矢量集,即3xN矩阵X,其中每列代表要变换的矢量,即

 X = transformation * X

但是,这不起作用并产生一个断言:

test-depth.exe: /usr/include/eigen3/Eigen/src/Core/Product.h:133: Eigen::Product<Lhs, Rhs, Option>::Product(const Lhs&, const Rhs&) [with _Lhs = Eigen::Matrix<double, 4, 4>; _Rhs = Eigen::Matrix<double, -1, -1>; int Option = 0; Eigen::Product<Lhs, Rhs, Option>::Lhs = Eigen::Matrix<double, 4, 4>; Eigen::Product<Lhs, Rhs, Option>::Rhs = Eigen::Matrix<double, -1, -1>]: Assertion `lhs.cols() == rhs.rows() && "invalid matrix product" && "if you wanted a coeff-wise or a dot product use the respective explicit functions"' failed.
答案

MBo的评论是对的,你使用了Projective变换,它涉及完整的齐次坐标。如果你想在引擎盖下使用Affine矩阵,你需要使用AffineCompact变换或3x4

以上是关于Eigen C ++;具有Eigen :: Transform的欧几里德变换的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iPhone 中编译 Eigen

使用 Eigen 和 boost::thread 在 C++ 中出现奇怪的内存泄漏

如何在 Eigen C++ 中加速 LU 分解?

避免使用 Eigen 分解稀疏矩阵时的动态内存分配

将 Eigen 数组从 c++ 传输到 python 时的地址更改

从具有行主顺序的数组创建特征矩阵