点云pcd文件投影到平面生成bev视角,并批量保在这里插入代码片存。
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/ModelCoefficients.h>
#include <pcl/filters/project_inliers.h>
#include <boost/filesystem.hpp>
#include <string>
int main() {
std::string input_dir = "bev/200";
std::string output_dir = "bev/200_bev";
// Create a set of planar coefficients with X=Y=0,Z=1
pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients ());
coefficients->values.resize (4);
coefficients->values[0] = 0;
coefficients->values[1] = 0;
coefficients->values[2] = 1.0;
coefficients->values[3] = 0;
// brows the input_dir and do the same to every fpcd file
for (auto& file : boost::filesystem::directory_iterator(input_dir)) {
pcl::PointCloud<pcl::PointXYZI>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZI>);
pcl::PointCloud<pcl::PointXYZI>::Ptr cloud_bev (new pcl::PointCloud<pcl::PointXYZI>);
if (file.path().extension() != ".pcd")continue;
std::string input_file_path = file.path().string();
std::string output_file_path = output_dir + "/" + file.path().stem().string() + "_projected.pcd";
// Fill in the cloud data
pcl::PCDReader reader;
reader.read(input_file_path, *cloud);
std::cout << "PointCloud before filtering has: " << cloud->points.size() << " data points." << std::endl;
// Create the filtering object
pcl::ProjectInliers<pcl::PointXYZI> proj;
proj.setModelType (pcl::SACMODEL_PLANE); // 三维平面参数
proj.setInputCloud (cloud);
proj.setModelCoefficients (coefficients);
proj.filter (*cloud_bev);
std::cerr << "Cloud after projection: " << cloud_bev->points.size() << " data points." << std::endl;
pcl::io::savePCDFileBinaryCompressed(output_file_path, *cloud_bev);
}
return 0;
}
对应的CMakeLists.txt文件
cmake_minimum_required(VERSION 2.8)
project(bev)
find_package(PCL 1.3 )
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
add_executable(${PROJECT_NAME} bev.cpp)
target_link_libraries(${PROJECT_NAME} ${PCL_LIBRARIES})