#include #include #include using PointType = pcl::PointXYZ; class PclPointCloud { public: pcl::PointCloud::Ptr cloud; PclPointCloud() : cloud(new pcl::PointCloud) {} }; class PclVoxelGrid { public: pcl::VoxelGrid filter; }; extern "C" { void* create_point_cloud() { return new PclPointCloud(); } void delete_point_cloud(void* ptr) { delete static_cast(ptr); } int load_point_cloud(void* ptr, const char* path) { auto* cloud = static_cast(ptr); return pcl::io::loadPCDFile(path, *cloud->cloud); } int save_point_cloud(void* ptr, const char* path) { auto* cloud = static_cast(ptr); return pcl::io::savePCDFileBinary(path, *cloud->cloud); } void* create_voxel_filter() { return new PclVoxelGrid(); } void delete_voxel_filter(void* ptr) { delete static_cast(ptr); } void set_voxel_leaf_size(void* ptr, float lx, float ly, float lz) { auto* vf = static_cast(ptr); vf->filter.setLeafSize(lx, ly, lz); } void set_voxel_input_cloud(void* vf_ptr, void* cloud_ptr) { auto* vf = static_cast(vf_ptr); auto* cloud = static_cast(cloud_ptr); vf->filter.setInputCloud(cloud->cloud); } void* apply_voxel_filter(void* vf_ptr) { auto* vf = static_cast(vf_ptr); auto* result = new PclPointCloud(); vf->filter.filter(*result->cloud); return result; } }