40 #ifndef PCL_OUTOFCORE_OUTOFCOREOCTREEBASE_H_
41 #define PCL_OUTOFCORE_OUTOFCOREOCTREEBASE_H_
43 #include <pcl/outofcore/boost.h>
44 #include <pcl/common/io.h>
47 #include <pcl/outofcore/octree_base_node.h>
48 #include <pcl/outofcore/octree_disk_container.h>
49 #include <pcl/outofcore/octree_ram_container.h>
52 #include <pcl/outofcore/outofcore_iterator_base.h>
53 #include <pcl/outofcore/outofcore_breadth_first_iterator.h>
54 #include <pcl/outofcore/outofcore_depth_first_iterator.h>
55 #include <pcl/outofcore/impl/outofcore_breadth_first_iterator.hpp>
56 #include <pcl/outofcore/impl/outofcore_depth_first_iterator.hpp>
59 #include <pcl/outofcore/metadata.h>
60 #include <pcl/outofcore/outofcore_base_data.h>
62 #include <pcl/filters/filter.h>
63 #include <pcl/filters/random_sample.h>
65 #include <pcl/PCLPointCloud2.h>
148 template<
typename ContainerT = OutofcoreOctreeDiskContainer<pcl::Po
intXYZ>,
typename Po
intT = pcl::Po
intXYZ>
177 typedef boost::shared_ptr<OutofcoreOctreeBase<ContainerT, PointT> >
Ptr;
178 typedef boost::shared_ptr<const OutofcoreOctreeBase<ContainerT, PointT> >
ConstPtr;
218 OutofcoreOctreeBase (
const Eigen::Vector3d& min,
const Eigen::Vector3d& max,
const double resolution_arg,
const boost::filesystem::path &root_node_name,
const std::string &coord_sys);
233 OutofcoreOctreeBase (
const boost::uint64_t max_depth,
const Eigen::Vector3d &min,
const Eigen::Vector3d &max,
const boost::filesystem::path &root_node_name,
const std::string &coord_sys);
300 queryFrustum (
const double *planes, std::list<std::string>& file_names)
const;
303 queryFrustum (
const double *planes, std::list<std::string>& file_names,
const boost::uint32_t query_depth)
const;
306 queryFrustum (
const double *planes,
const Eigen::Vector3d &eye,
const Eigen::Matrix4d &view_projection_matrix,
307 std::list<std::string>& file_names,
const boost::uint32_t query_depth)
const;
321 queryBBIntersects (
const Eigen::Vector3d &min,
const Eigen::Vector3d &max,
const boost::uint32_t query_depth, std::list<std::string> &bin_name)
const;
378 queryBoundingBox (
const Eigen::Vector3d &min,
const Eigen::Vector3d &max,
const int query_depth, std::list<std::string> &filenames)
const
391 getBoundingBox (Eigen::Vector3d &min, Eigen::Vector3d &max)
const;
397 inline boost::uint64_t
400 return (
metadata_->getLODPoints (depth_index));
412 queryBoundingBoxNumPoints (
const Eigen::Vector3d& min,
const Eigen::Vector3d& max,
const int query_depth,
bool load_from_disk =
true);
418 inline const std::vector<boost::uint64_t>&
426 inline boost::uint64_t
432 inline boost::uint64_t
464 return (
metadata_->getCoordinateSystem ());
504 getOccupiedVoxelCenters(std::vector<Eigen::Vector3d, Eigen::aligned_allocator<Eigen::Vector3d> > &voxel_centers,
size_t query_depth)
const;
551 return (sample_percent_);
559 this->sample_percent_ = std::fabs (sample_percent_arg) > 1.0 ? 1.0 : std::fabs (sample_percent_arg);
564 init (
const boost::uint64_t& depth,
const Eigen::Vector3d& min,
const Eigen::Vector3d& max,
const boost::filesystem::path& root_name,
const std::string& coord_sys);
631 boost::shared_ptr<OutofcoreOctreeBaseMetadata>
metadata_;
645 enlargeToCube (Eigen::Vector3d &bb_min, Eigen::Vector3d &bb_max);
649 calculateDepth (
const Eigen::Vector3d& min_bb,
const Eigen::Vector3d& max_bb,
const double leaf_resolution);
651 double sample_percent_;
660 #endif // PCL_OUTOFCORE_OUTOFCOREOCTREEBASE_H_
boost::shared_ptr< const OutofcoreOctreeBase< ContainerT, PointT > > ConstPtr
bool checkExtension(const boost::filesystem::path &path_name)
Auxiliary function to validate path_name extension is .octree.
bool getBoundingBox(Eigen::Vector3d &min, Eigen::Vector3d &max) const
Get the overall bounding box of the outofcore octree; this is the same as the bounding box of the roo...
boost::uint64_t queryBoundingBoxNumPoints(const Eigen::Vector3d &min, const Eigen::Vector3d &max, const int query_depth, bool load_from_disk=true)
Queries the number of points in a bounding box.
OutofcoreDepthFirstIterator< PointT, ContainerT > Iterator
boost::shared_ptr< const std::vector< int > > IndicesConstPtr
boost::uint64_t addDataToLeaf_and_genLOD(AlignedPointTVector &p)
Recursively add points to the tree subsampling LODs on the way.
virtual void queryBoundingBox(const Eigen::Vector3d &min, const Eigen::Vector3d &max, const int query_depth, const pcl::PCLPointCloud2::Ptr &dst_blob, double percent=1.0)
Query all points falling within the input bounding box at query_depth and return a PCLPointCloud2 obj...
Abstract octree iterator class.
virtual ~OutofcoreOctreeBase()
OutofcoreOctreeBaseNode< ContainerT, PointT > OutofcoreNodeType
std::string node_index_extension_
void saveToFile()
Write octree definition ".octree" (defined by octree_extension_) to disk.
void queryFrustum(const double *planes, std::list< std::string > &file_names) const
void setSamplePercent(const double sample_percent_arg)
Sets the sampling percent for constructing LODs.
OutofcoreOctreeBaseNode< ContainerT, PointT > BranchNode
boost::shared_ptr< OutofcoreOctreeBase< ContainerT, PointT > > Ptr
boost::shared_mutex read_write_mutex_
shared mutex for controlling read/write access to disk
void queryBBIncludes(const Eigen::Vector3d &min, const Eigen::Vector3d &max, const boost::uint64_t query_depth, AlignedPointTVector &dst) const
Get Points in BB, only points inside BB.
RandomSample applies a random sampling with uniform probability.
OutofcoreNodeType * getBranchChildPtr(const BranchNode &branch_arg, unsigned char childIdx_arg) const
void printBoundingBox() const
Prints size of the bounding boxes to stdou.
std::string node_index_basename_
void DeAllocEmptyNodeCache()
DEPRECATED - Flush empty nodes only.
static const std::string TREE_EXTENSION_
defined as ".octree" to append to treepath files
boost::shared_ptr< std::vector< int > > IndicesPtr
void flushToDiskLazy()
DEPRECATED - Flush all non leaf nodes' cache.
pcl::PointCloud< PointT > PointCloud
void buildLOD()
Generate multi-resolution LODs for the tree, which are a uniform random sampling all child leafs belo...
boost::shared_ptr< PointCloud > PointCloudPtr
OutofcoreOctreeBaseNode Class internally representing nodes of an outofcore octree, with accessors to its data via the octree_disk_container class or octree_ram_container class, whichever it is templated against.
std::string node_container_basename_
void getOccupiedVoxelCenters(AlignedPointTVector &voxel_centers, size_t query_depth) const
Returns the voxel centers of all existing voxels at query_depth.
virtual void queryBBIntersects(const Eigen::Vector3d &min_bb, const Eigen::Vector3d &max_bb, const boost::uint32_t query_depth, std::list< std::string > &file_names)
Recursive acquires PCD paths to any node with which the queried bounding box intersects (at query_dep...
boost::uint64_t addPointCloud_and_genLOD(pcl::PCLPointCloud2::Ptr &input_cloud)
Recursively add points to the tree.
OutofcoreDepthFirstIterator< PointT, ContainerT > DepthFirstIterator
OutofcoreOctreeBase< OutofcoreOctreeDiskContainer< PointT >, PointT > octree_disk
OutofcoreOctreeBaseNode< ContainerT, PointT > LeafNode
pcl::Filter< pcl::PCLPointCloud2 >::Ptr getLODFilter()
const std::string & getCoordSystem() const
Get coordinate system tag from the JSON metadata file.
bool getBinDimension(double &x, double &y) const
Computes the expected voxel dimensions at the leaves.
OutofcoreNodeType * root_node_
Pointer to the root node of the octree data structure.
OutofcoreOctreeBaseNode< OutofcoreOctreeRamContainer< PointT >, PointT > octree_ram_node
void queryBBIncludes_subsample(const Eigen::Vector3d &min, const Eigen::Vector3d &max, uint64_t query_depth, const double percent, AlignedPointTVector &dst) const
Returns a random subsample of points within the given bounding box at query_depth.
std::vector< PointT, Eigen::aligned_allocator< PointT > > AlignedPointTVector
double getVoxelSideLength() const
Gets the smallest (assumed) cubic voxel side lengths.
void flushToDisk()
DEPRECATED - Flush all nodes' cache.
const std::vector< boost::uint64_t > & getNumPointsVector() const
Get number of points at each LOD.
std::string node_container_extension_
OutofcoreBreadthFirstIterator< PointT, ContainerT > BreadthFirstIterator
static const int OUTOFCORE_VERSION_
const OutofcoreBreadthFirstIterator< PointT, ContainerT > BreadthFirstConstIterator
void buildLODRecursive(const std::vector< BranchNode * > ¤t_branch)
recursive portion of lod builder
OutofcoreOctreeBase(const boost::filesystem::path &root_node_name, const bool load_all)
Load an existing tree.
static const uint64_t LOAD_COUNT_
boost::uint64_t getNumPointsAtDepth(const boost::uint64_t &depth_index) const
Get number of points at specified LOD.
OutofcoreOctreeBase< OutofcoreOctreeRamContainer< PointT >, PointT > octree_ram
boost::shared_ptr< const PointCloud > PointCloudConstPtr
const OutofcoreDepthFirstIterator< PointT, ContainerT > ConstIterator
boost::uint64_t getTreeDepth() const
void queryBBIntersects(const Eigen::Vector3d &min, const Eigen::Vector3d &max, const boost::uint32_t query_depth, std::list< std::string > &bin_name) const
Get a list of file paths at query_depth that intersect with your bounding box specified by min and ma...
void init(const boost::uint64_t &depth, const Eigen::Vector3d &min, const Eigen::Vector3d &max, const boost::filesystem::path &root_name, const std::string &coord_sys)
OutofcoreOctreeBaseNode< OutofcoreOctreeDiskContainer< PointT >, PointT > octree_disk_node
boost::shared_ptr< ::pcl::PCLPointCloud2 > Ptr
A point structure representing Euclidean xyz coordinates, and the RGB color.
void convertToXYZ()
Save each .bin file as an XYZ file.
boost::shared_ptr< OutofcoreOctreeBaseMetadata > metadata_
Filter represents the base filter class.
double getSamplePercent() const
Returns the sample_percent_ used when constructing the LOD.
const OutofcoreDepthFirstIterator< PointT, ContainerT > DepthFirstConstIterator
void getOccupiedVoxelCenters(std::vector< Eigen::Vector3d, Eigen::aligned_allocator< Eigen::Vector3d > > &voxel_centers) const
Returns the voxel centers of all occupied/existing leaves of the tree.
boost::uint64_t addDataToLeaf(const AlignedPointTVector &p)
Recursively add points to the tree.
virtual void queryBoundingBox(const Eigen::Vector3d &min, const Eigen::Vector3d &max, const int query_depth, std::list< std::string > &filenames) const
Returns list of pcd files from nodes whose bounding boxes intersect with the input bounding box...
boost::uint64_t getDepth() const
Get number of LODs, which is the height of the tree.
OutofcoreNodeType * getRootNode()
void setLODFilter(const pcl::Filter< pcl::PCLPointCloud2 >::Ptr &filter_arg)
Sets the filter to use when building the levels of depth.
This code defines the octree used for point storage at Urban Robotics.
void getOccupiedVoxelCenters(AlignedPointTVector &voxel_centers) const
Gets the voxel centers of all occupied/existing leaves of the tree.
void writeVPythonVisual(const boost::filesystem::path filename)
Write a python script using the vpython module containing all the bounding boxes. ...
boost::uint64_t addPointCloud(PointCloudConstPtr point_cloud)
Copies the points from the point_cloud falling within the bounding box of the octree to the out-of-co...
void incrementPointsInLOD(boost::uint64_t depth, boost::uint64_t inc)
Increment current depths (LOD for branch nodes) point count; called by addDataAtMaxDepth in Outofcore...
OutofcoreOctreeBase & operator=(OutofcoreOctreeBase &rval)