// ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- // Copyright (c) 2018-2023 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- #pragma once #include #include "open3d/geometry/PointCloud.h" namespace open3d { namespace io { /// Factory function to create a pointcloud from a file /// Return an empty pointcloud if fail to read the file. std::shared_ptr CreatePointCloudFromFile( const std::string &filename, const std::string &format = "auto", bool print_progress = false); /// Factory function to create a pointcloud from memory /// Return an empty pointcloud if fail to read from buffer. std::shared_ptr CreatePointCloudFromMemory( const unsigned char *buffer, const size_t length, const std::string &format, bool print_progress = false); /// \struct ReadPointCloudOption /// \brief Optional parameters to ReadPointCloud struct ReadPointCloudOption { ReadPointCloudOption( // Attention: when you update the defaults, update the docstrings in // pybind/io/class_io.cpp std::string format = "auto", bool remove_nan_points = false, bool remove_infinite_points = false, bool print_progress = false, std::function update_progress = {}) : format(format), remove_nan_points(remove_nan_points), remove_infinite_points(remove_infinite_points), print_progress(print_progress), update_progress(update_progress){}; ReadPointCloudOption(std::function up) : ReadPointCloudOption() { update_progress = up; }; /// Specifies what format the contents of the file are (and what loader to /// use), default "auto" means to go off of file extension. /// Note: "auto" is incompatible when reading directly from memory. std::string format; /// Whether to remove all points that have nan bool remove_nan_points; /// Whether to remove all points that have +-inf bool remove_infinite_points; /// Print progress to stdout about loading progress. /// Also see \p update_progress if you want to have your own progress /// indicators or to be able to cancel loading. bool print_progress; /// Callback to invoke as reading is progressing, parameter is percentage /// completion (0.-100.) return true indicates to continue loading, false /// means to try to stop loading and cleanup std::function update_progress; }; /// The general entrance for reading a PointCloud from a file /// The function calls read functions based on the extension name of filename. /// See \p ReadPointCloudOption for additional options you can pass. /// \return return true if the read function is successful, false otherwise. bool ReadPointCloud(const std::string &filename, geometry::PointCloud &pointcloud, const ReadPointCloudOption ¶ms = {}); /// The general entrance for reading a PointCloud from memory /// The function calls read functions based on the format. /// See \p ReadPointCloudOption for additional options you can pass. /// \return return true if the read function is successful, false otherwise. bool ReadPointCloud(const unsigned char *buffer, const size_t length, geometry::PointCloud &pointcloud, const ReadPointCloudOption ¶ms = {}); /// \struct WritePointCloudOption /// \brief Optional parameters to WritePointCloud struct WritePointCloudOption { enum class IsAscii : bool { Binary = false, Ascii = true }; enum class Compressed : bool { Uncompressed = false, Compressed = true }; WritePointCloudOption( // Attention: when you update the defaults, update the docstrings in // pybind/io/class_io.cpp std::string format = "auto", IsAscii write_ascii = IsAscii::Binary, Compressed compressed = Compressed::Uncompressed, bool print_progress = false, std::function update_progress = {}) : format(format), write_ascii(write_ascii), compressed(compressed), print_progress(print_progress), update_progress(update_progress){}; // for compatibility WritePointCloudOption(bool write_ascii, bool compressed = false, bool print_progress = false, std::function update_progress = {}) : write_ascii(IsAscii(write_ascii)), compressed(Compressed(compressed)), print_progress(print_progress), update_progress(update_progress){}; // for compatibility WritePointCloudOption(std::string format, bool write_ascii, bool compressed = false, bool print_progress = false, std::function update_progress = {}) : format(format), write_ascii(IsAscii(write_ascii)), compressed(Compressed(compressed)), print_progress(print_progress), update_progress(update_progress){}; WritePointCloudOption(std::function up) : WritePointCloudOption() { update_progress = up; }; /// Specifies what format the contents of the file are (and what writer to /// use), default "auto" means to go off of file extension. /// Note: "auto" is incompatible when reading directly from memory. std::string format; /// Whether to save in Ascii or Binary. Some savers are capable of doing /// either, other ignore this. IsAscii write_ascii; /// Whether to save Compressed or Uncompressed. Currently, only PCD is /// capable of compressing, and only if using IsAscii::Binary, all other /// formats ignore this. Compressed compressed; /// Print progress to stdout about loading progress. Also see /// \p update_progress if you want to have your own progress indicators or /// to be able to cancel loading. bool print_progress; /// Callback to invoke as reading is progressing, parameter is percentage /// completion (0.-100.) return true indicates to continue loading, false /// means to try to stop loading and cleanup std::function update_progress; }; /// The general entrance for writing a PointCloud to a file /// The function calls write functions based on the extension name of filename. /// See \p WritePointCloudOption for additional options you can pass. /// \return return true if the write function is successful, false otherwise. bool WritePointCloud(const std::string &filename, const geometry::PointCloud &pointcloud, const WritePointCloudOption ¶ms = {}); /// The general entrance for writing a PointCloud to memory /// The function calls write functions based on the format. /// WARNING: buffer gets initialized by WritePointCloud, you need to /// delete it when finished when ret is true /// See \p WritePointCloudOption for additional options you can pass. /// \return return true if the write function is /// successful, false otherwise. bool WritePointCloud(unsigned char *&buffer, size_t &length, const geometry::PointCloud &pointcloud, const WritePointCloudOption ¶ms = {}); bool ReadPointCloudFromXYZ(const std::string &filename, geometry::PointCloud &pointcloud, const ReadPointCloudOption ¶ms); bool ReadPointCloudInMemoryFromXYZ(const unsigned char *buffer, const size_t length, geometry::PointCloud &pointcloud, const ReadPointCloudOption ¶ms); bool WritePointCloudToXYZ(const std::string &filename, const geometry::PointCloud &pointcloud, const WritePointCloudOption ¶ms); bool WritePointCloudInMemoryToXYZ(unsigned char *&buffer, size_t &length, const geometry::PointCloud &pointcloud, const WritePointCloudOption ¶ms); bool ReadPointCloudFromXYZN(const std::string &filename, geometry::PointCloud &pointcloud, const ReadPointCloudOption ¶ms); bool WritePointCloudToXYZN(const std::string &filename, const geometry::PointCloud &pointcloud, const WritePointCloudOption ¶ms); bool ReadPointCloudFromXYZRGB(const std::string &filename, geometry::PointCloud &pointcloud, const ReadPointCloudOption ¶ms); bool WritePointCloudToXYZRGB(const std::string &filename, const geometry::PointCloud &pointcloud, const WritePointCloudOption ¶ms); bool ReadPointCloudFromPLY(const std::string &filename, geometry::PointCloud &pointcloud, const ReadPointCloudOption ¶ms); bool WritePointCloudToPLY(const std::string &filename, const geometry::PointCloud &pointcloud, const WritePointCloudOption ¶ms); bool ReadPointCloudFromPCD(const std::string &filename, geometry::PointCloud &pointcloud, const ReadPointCloudOption ¶ms); bool WritePointCloudToPCD(const std::string &filename, const geometry::PointCloud &pointcloud, const WritePointCloudOption ¶ms); bool ReadPointCloudFromPTS(const std::string &filename, geometry::PointCloud &pointcloud, const ReadPointCloudOption ¶ms); bool WritePointCloudToPTS(const std::string &filename, const geometry::PointCloud &pointcloud, const WritePointCloudOption ¶ms); } // namespace io } // namespace open3d