int main (int argc, char** argv) { if (pcl::console::find_switch (argc, argv, "--help") || pcl::console::find_switch (argc, argv, "-h")) return print_help (); //Reading input cloud pcl::PointCloud<pcl::PointXYZI>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZI>); if (argc < 2) { PCL_ERROR ("No pcd file to read... Exiting...\n"); print_help (); return (-1); } if (pcl::io::loadPCDFile<pcl::PointXYZI> (argv[1], *cloud) == -1) //* load the file { PCL_ERROR ("Couldn't read file %s \n", argv[1]); print_help (); return (-1); } try { // Creating world model object pcl::kinfuLS::WorldModel<pcl::PointXYZI> wm; //Adding current cloud to the world model wm.addSlice (cloud); std::vector<pcl::PointCloud<pcl::PointXYZI>::Ptr> clouds; std::vector<Eigen::Vector3f, Eigen::aligned_allocator<Eigen::Vector3f> > transforms; //Get world as a vector of cubes wm.getWorldAsCubes (pcl::device::kinfuLS::VOLUME_X, clouds, transforms, 0.025); // 2.5% overlapp (12 cells with a 512-wide cube) //Creating the standalone marching cubes instance float volume_size = pcl::device::kinfuLS::VOLUME_SIZE; pcl::console::parse_argument (argc, argv, "--volume_size", volume_size); pcl::console::parse_argument (argc, argv, "-vs", volume_size); PCL_WARN ("Processing world with volume size set to %.2f meters\n", volume_size); pcl::gpu::kinfuLS::StandaloneMarchingCubes<pcl::PointXYZI> m_cubes (pcl::device::kinfuLS::VOLUME_X, pcl::device::kinfuLS::VOLUME_Y, pcl::device::kinfuLS::VOLUME_Z, volume_size); //~ //Creating the output //~ boost::shared_ptr<pcl::PolygonMesh> mesh_ptr_; //~ std::vector< boost::shared_ptr<pcl::PolygonMesh> > meshes; m_cubes.getMeshesFromTSDFVector (clouds, transforms); PCL_INFO ("Done!\n"); return (0); } catch (const pcl::PCLException& /*e*/) { PCL_ERROR ("PCLException... Exiting...\n"); } catch (const std::bad_alloc& /*e*/) { PCL_ERROR ("Bad alloc... Exiting...\n"); } catch (const std::exception& /*e*/) { PCL_ERROR ("Exception... Exiting...\n"); } return (-1); }
bool WorldDownloadManager::marchingCubes(pcl::PointCloud<pcl::PointXYZI>::Ptr cloud, std::vector<Mesh::Ptr> &output_meshes) const { try { // Creating world model object pcl::kinfuLS::WorldModel<pcl::PointXYZI> wm; //Adding current cloud to the world model wm.addSlice (cloud); std::vector<pcl::PointCloud<pcl::PointXYZI>::Ptr> clouds; // CHANGE PCL 1.8 std::vector<Eigen::Vector3f> transforms; std::vector<Eigen::Vector3f, Eigen::aligned_allocator<Eigen::Vector3f> > transforms_alloc; //Get world as a vector of cubes // CHANGE PCL 1.8 // wm.getWorldAsCubes (pcl::device::kinfuLS::VOLUME_X, clouds, transforms, 0.025); // 2.5% overlapp (12 cells with a 512-wide cube) wm.getWorldAsCubes (pcl::device::kinfuLS::VOLUME_X, clouds, transforms_alloc, 0.025); // 2.5% overlapp (12 cells with a 512-wide cube) // CHANGE PCL 1.8 TODO: More elegant way of copying? for(std::vector<Eigen::Vector3f, Eigen::aligned_allocator<Eigen::Vector3f> >::iterator it = transforms_alloc.begin(); it != transforms_alloc.end(); ++it) { transforms.push_back(*it); } //Creating the standalone marching cubes instance float volume_size = pcl::device::kinfuLS::VOLUME_SIZE; std::cout << "Processing world with volume size set to " << volume_size << "meters\n"; pcl::gpu::kinfuLS::StandaloneMarchingCubes<pcl::PointXYZI> m_cubes (pcl::device::kinfuLS::VOLUME_X, pcl::device::kinfuLS::VOLUME_Y, pcl::device::kinfuLS::VOLUME_Z, volume_size); m_cubes.getMeshesFromTSDFVectorMemory(clouds,transforms,output_meshes); std::cout << "Done!\n"; return true; } catch (const pcl::PCLException& /*e*/) { PCL_ERROR ("PCLException... Exiting...\n"); return false; } catch (const std::bad_alloc& /*e*/) { PCL_ERROR ("Bad alloc... Exiting...\n"); return false; } catch (const std::exception& /*e*/) { PCL_ERROR ("Exception... Exiting...\n"); return false; } }