image_framework_ymj/include/open3d/pipelines/registration/TransformationEstimation.h

152 lines
5.3 KiB
C
Raw Normal View History

2024-12-06 16:25:16 +08:00
// ----------------------------------------------------------------------------
// - Open3D: www.open3d.org -
// ----------------------------------------------------------------------------
// Copyright (c) 2018-2023 www.open3d.org
// SPDX-License-Identifier: MIT
// ----------------------------------------------------------------------------
#pragma once
#include <Eigen/Core>
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "open3d/pipelines/registration/RobustKernel.h"
namespace open3d {
namespace geometry {
class PointCloud;
}
namespace pipelines {
namespace registration {
typedef std::vector<Eigen::Vector2i> CorrespondenceSet;
enum class TransformationEstimationType {
Unspecified = 0,
PointToPoint = 1,
PointToPlane = 2,
ColoredICP = 3,
GeneralizedICP = 4,
};
/// \class TransformationEstimation
///
/// Base class that estimates a transformation between two point clouds
/// The virtual function ComputeTransformation() must be implemented in
/// subclasses.
class TransformationEstimation {
public:
/// \brief Default Constructor.
TransformationEstimation() {}
virtual ~TransformationEstimation() {}
public:
virtual TransformationEstimationType GetTransformationEstimationType()
const = 0;
/// Compute RMSE between source and target points cloud given
/// correspondences.
///
/// \param source Source point cloud.
/// \param target Target point cloud.
/// \param corres Correspondence set between source and target point cloud.
virtual double ComputeRMSE(const geometry::PointCloud &source,
const geometry::PointCloud &target,
const CorrespondenceSet &corres) const = 0;
/// Compute transformation from source to target point cloud given
/// correspondences.
///
/// \param source Source point cloud.
/// \param target Target point cloud.
/// \param corres Correspondence set between source and target point cloud.
virtual Eigen::Matrix4d ComputeTransformation(
const geometry::PointCloud &source,
const geometry::PointCloud &target,
const CorrespondenceSet &corres) const = 0;
};
/// \class TransformationEstimationPointToPoint
///
/// Estimate a transformation for point to point distance.
class TransformationEstimationPointToPoint : public TransformationEstimation {
public:
/// \brief Parameterized Constructor.
///
/// \param with_scaling Set to True to estimate scaling, False to force
/// scaling to be 1.
TransformationEstimationPointToPoint(bool with_scaling = false)
: with_scaling_(with_scaling) {}
~TransformationEstimationPointToPoint() override {}
public:
TransformationEstimationType GetTransformationEstimationType()
const override {
return type_;
};
double ComputeRMSE(const geometry::PointCloud &source,
const geometry::PointCloud &target,
const CorrespondenceSet &corres) const override;
Eigen::Matrix4d ComputeTransformation(
const geometry::PointCloud &source,
const geometry::PointCloud &target,
const CorrespondenceSet &corres) const override;
public:
/// \brief Set to True to estimate scaling, False to force scaling to be 1.
///
/// The homogeneous transformation is given by\n
/// T = [ cR t]\n
/// [0 1]\n
/// Sets 𝑐=1 if with_scaling is False.
bool with_scaling_ = false;
private:
const TransformationEstimationType type_ =
TransformationEstimationType::PointToPoint;
};
/// \class TransformationEstimationPointToPlane
///
/// Class to estimate a transformation for point to plane distance.
class TransformationEstimationPointToPlane : public TransformationEstimation {
public:
/// \brief Default Constructor.
TransformationEstimationPointToPlane() {}
~TransformationEstimationPointToPlane() override {}
/// \brief Constructor that takes as input a RobustKernel \param kernel Any
/// of the implemented statistical robust kernel for outlier rejection.
explicit TransformationEstimationPointToPlane(
std::shared_ptr<RobustKernel> kernel)
: kernel_(std::move(kernel)) {}
public:
TransformationEstimationType GetTransformationEstimationType()
const override {
return type_;
};
double ComputeRMSE(const geometry::PointCloud &source,
const geometry::PointCloud &target,
const CorrespondenceSet &corres) const override;
Eigen::Matrix4d ComputeTransformation(
const geometry::PointCloud &source,
const geometry::PointCloud &target,
const CorrespondenceSet &corres) const override;
public:
/// shared_ptr to an Abstract RobustKernel that could mutate at runtime.
std::shared_ptr<RobustKernel> kernel_ = std::make_shared<L2Loss>();
private:
const TransformationEstimationType type_ =
TransformationEstimationType::PointToPlane;
};
} // namespace registration
} // namespace pipelines
} // namespace open3d