152 lines
5.3 KiB
C
152 lines
5.3 KiB
C
![]() |
// ----------------------------------------------------------------------------
|
|||
|
// - 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
|