image_framework_ymj/include/open3d/t/geometry/RGBDImage.h
2024-12-06 16:25:16 +08:00

114 lines
3.9 KiB
C++
Executable File

// ----------------------------------------------------------------------------
// - Open3D: www.open3d.org -
// ----------------------------------------------------------------------------
// Copyright (c) 2018-2023 www.open3d.org
// SPDX-License-Identifier: MIT
// ----------------------------------------------------------------------------
#pragma once
#include "open3d/geometry/RGBDImage.h"
#include "open3d/t/geometry/Image.h"
namespace open3d {
namespace t {
namespace geometry {
/// \brief RGBDImage A pair of color and depth images.
///
/// For most processing, the image pair should be aligned (same viewpoint and
/// resolution).
class RGBDImage : public Geometry {
public:
/// \brief Default Comnstructor.
RGBDImage() : Geometry(Geometry::GeometryType::RGBDImage, 2) {}
/// \brief Parameterized Constructor.
///
/// \param color The color image.
/// \param depth The depth image.
/// \param aligned Are the two images aligned (same viewpoint and
/// resolution)?
RGBDImage(const Image &color, const Image &depth, bool aligned = true)
: Geometry(Geometry::GeometryType::RGBDImage, 2),
color_(color),
depth_(depth),
aligned_(aligned) {
if (color.GetRows() != depth.GetRows() ||
color.GetCols() != depth.GetCols()) {
aligned_ = false;
utility::LogWarning(
"Aligned image pair must have the same resolution.");
}
}
core::Device GetDevice() const override {
core::Device color_device = color_.GetDevice();
core::Device depth_device = depth_.GetDevice();
if (color_device != depth_device) {
utility::LogError(
"Color {} and depth {} are not on the same device.",
color_device.ToString(), depth_device.ToString());
}
return color_device;
}
~RGBDImage() override{};
/// Clear stored data.
RGBDImage &Clear() override;
/// Is any data stored?
bool IsEmpty() const override;
/// Are the depth and color images aligned (same viewpoint and resolution)?
bool AreAligned() const { return aligned_; }
/// Compute min 2D coordinates for the data (always {0,0}).
core::Tensor GetMinBound() const {
return core::Tensor::Zeros({2}, core::Int64);
}
/// Compute max 2D coordinates for the data.
core::Tensor GetMaxBound() const {
return core::Tensor(
std::vector<int64_t>{color_.GetCols() + depth_.GetCols(),
color_.GetRows()},
{2}, core::Int64);
}
/// Transfer the RGBD image to a specified device.
/// \param device The targeted device to convert to.
/// \param copy If true, a new image is always created; if false, the
/// copy is avoided when the original image is already on the target
/// device.
RGBDImage To(const core::Device &device, bool copy = false) const {
return RGBDImage(color_.To(device, copy), depth_.To(device, copy),
aligned_);
}
/// Returns copy of the RGBD image on the same device.
RGBDImage Clone() const { return To(color_.GetDevice(), /*copy=*/true); }
/// Convert to the legacy RGBDImage format.
open3d::geometry::RGBDImage ToLegacy() const {
return open3d::geometry::RGBDImage(color_.ToLegacy(),
depth_.ToLegacy());
}
/// Text description.
std::string ToString() const;
public:
/// The color image.
Image color_;
/// The depth image.
Image depth_;
/// Are the depth and color images aligned (same viewpoint and resolution)?
bool aligned_ = true;
};
} // namespace geometry
} // namespace t
} // namespace open3d