将 pcl::P ointCloud 转换为 Eigen::MatrixBase

Converting pcl::PointCloud to Eigen::MatrixBase

本文关键字:Eigen 转换 MatrixBase ointCloud pcl      更新时间:2023-10-16

>我正在尝试从此标头运行ICP算法。行:260 处的函数的声明为

template <typename Derived1, typename Derived2>
void point_to_point(Eigen::MatrixBase<Derived1>& X,
                    Eigen::MatrixBase<Derived2>& Y,
                    Parameters par = Parameters()) {

我想在我的两个pcl::PointCloud上应用这个算法,但它接受Eigen::MatrixBase.我尝试按如下方式调用此函数

Eigen::MatrixBase<Eigen::Matrix<double,3,1,Eigen::RowMajor,3,100>> X;
Eigen::MatrixBase<Eigen::Matrix<double,3,1,Eigen::RowMajor,3,100>> Y;
Parameters par = Parameters()
point_to_point(X,Y,Parameters)

它给了我这个错误

error: ‘Eigen::MatrixBase<Derived>::MatrixBase() [with Derived = Eigen::Matrix<double, 3, 1, 1, 3, 100>]’ is protected
     MatrixBase() : Base() {}

我也尝试了Eigen::MatrixBase<Eigen::Matrix4f> X;但每种类型似乎都受到保护。这到底是什么意思?

我搜索了很多,但没有找到任何MatrixBase的例子。

  • 如何在Eigen::MatrixBase中插入/删除值 - 在这里找不到任何此类功能?
  • 如何将pcl::PointCloud转换为Eigen::MatrixBase和反转?
  • 如何调用此函数?
您可以使用

for 循环构造矩阵。例如

Eigen::Matrix3Xd X, Y;
    for (size_t idx = 0; idx != pc_X->size(); ++idx) {
        X.col(idx) = Eigen::Vector3d{pc_X->at(idx).x, 
                    pc_X->at(idx).y, 
                    pc_X->at(idx).z};
    }
    for (size_t idx = 0; idx != pc_Y->size(); ++idx) {
        Y.col(idx) = Eigen::Vector3d{pc_Y->at(idx).x, pc_Y->at(idx).y, pc_Y->at(idx).z};
    }