Notas de estudio de nube de puntos 19: use pcl para convertir archivos bin a archivos pcd

Los datos descargados de KITTI están en formato bin binario, pero parece que pcl solo puede leer archivos pcd. Para la visualización, primero convierta los archivos bin a archivos pcd.

En Inicio, cree una nueva carpeta PointCloud (lo construí aquí, todos son gratis), continúe creando una nueva carpeta bin2pcd en el archivo de PointCloud, continúe creando una nueva carpeta velodyne e incorpore el archivo bin2pcd, y cree un nuevo documento bin2pcd.cpp y CMakeLists.txt , ingrese los nuevos archivos velodyne y continúe creando nuevas carpetas bin y pcd. En este punto, la nueva operación ha terminado.

Luego coloque el archivo bin probado en la carpeta bin en velodyne, solo puse 7 archivos bin aquí. Luego complete el código de los documentos vacíos bin2pcd.cpp y CMakeLists.tx, el código y las operaciones anteriores, como se muestra en la siguiente figura:

inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

código fuente

bin2pcd.cpp

#include <boost/program_options.hpp>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/common/point_operators.h>
#include <pcl/common/io.h>
#include <pcl/search/organized.h>
#include <pcl/search/octree.h>
#include <pcl/search/kdtree.h>
#include <pcl/features/normal_3d_omp.h>
#include <pcl/filters/conditional_removal.h>
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/segmentation/extract_clusters.h>
#include <pcl/surface/gp3.h>
#include <pcl/io/vtk_io.h>
#include <pcl/filters/voxel_grid.h>
 
#include <iostream>
#include <fstream>
 
using namespace pcl;
using namespace std;
 
namespace po = boost::program_options;
 
int main(int argc, char **argv){
    
    
	///The file to read from.
	string infile;
 
	///The file to output to.
	string outfile;
 
	// Declare the supported options.
	po::options_description desc("Program options");
	desc.add_options()
		//Options
		("infile", po::value<string>(&infile)->required(), "the file to read a point cloud from")
		("outfile", po::value<string>(&outfile)->required(), "the file to write the DoN point cloud & normals to")
		;
	// Parse the command line
	po::variables_map vm;
	po::store(po::parse_command_line(argc, argv, desc), vm);
 
	// Print help
	if (vm.count("help"))
	{
    
    
		cout << desc << "\n";
		return false;
	}
 
	// Process options.
	po::notify(vm);
 
	// load point cloud
	fstream input(infile.c_str(), ios::in | ios::binary);
	if(!input.good()){
    
    
		cerr << "Could not read file: " << infile << endl;
		exit(EXIT_FAILURE);
	}
	input.seekg(0, ios::beg);
 
	pcl::PointCloud<PointXYZI>::Ptr points (new pcl::PointCloud<PointXYZI>);
 
	int i;
	for (i=0; input.good() && !input.eof(); i++) {
    
    
		PointXYZI point;
		input.read((char *) &point.x, 3*sizeof(float));
		input.read((char *) &point.intensity, sizeof(float));
		points->push_back(point);
	}
	input.close();
 
	cout << "Read KTTI point cloud with " << i << " points, writing to " << outfile << endl;
 
    pcl::PCDWriter writer;
 
    // Save DoN features
    writer.write<PointXYZI> (outfile, *points, false);
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
project(bin2pcd)
 
find_package(PCL 1.2 REQUIRED)
 
# 加入Boost setting
find_package(Boost COMPONENTS program_options REQUIRED )
include_directories(${
    
    Boost_INCLUDE_DIRS})
link_directories(${
    
    Boost_LIBRARY_DIRS})
 
include_directories(${
    
    PCL_INCLUDE_DIRS})
link_directories(${
    
    PCL_LIBRARY_DIRS})
add_definitions(${
    
    PCL_DEFINITIONS})
 
add_executable(bin2pcd bin2pcd.cpp)
 
target_link_libraries (bin2pcd ${
    
    PCL_LIBRARIES} ${
    
    Boost_LIBRARIES}) #此处也有修改
 
install(TARGETS bin2pcd RUNTIME DESTINATION bin)

Ve a construir y abre la terminal.

cmake ..
make -j8
i=1;for x in /home/xxxxx/Desktop/work/pcl_project/PointCloud/bin2pcd/velodyne/bin/*.bin; do /home/xxxxx/Desktop/work/pcl_project/PointCloud/bin2pcd/build/bin2pcd --infile $x --outfile /home/xxxxx/Desktop/work/pcl_project/PointCloud/bin2pcd/velodyne/pcd/$i.pcd; let i=i+1; done
 
  • for x in your/input/data/*.bin Este es un ciclo que atraviesa todos los archivos bin de entrada, pasando la ruta absoluta de un archivo bin a x cada vez
  • do build/bin2pcd es ejecutar el archivo bin2pcd generado anteriormente, y la ruta se ajusta de acuerdo con la situación real
  • --infile es el archivo de entrada, --outfile es el archivo de salida
  • i es el nombre del archivo de salida, i= error de análisis de KaTeX: se esperaba '}', se obtuvo '#' en la posición 3: {x#̲* b} significa interceptar el carácter después del primer "_" (guión bajo) en cadena x

Darse cuenta:/inicio/xxxxx/Escritorio/trabajo/pcl_proyectoCambie a su propia ruta de proyecto ¡La
prueba fue exitosa!
inserte la descripción de la imagen aquí
Después de que todos los códigos se hayan ejecutado con éxito, verifique la carpeta pcd debajo del archivo velodyne y encontrará el archivo pcd generado, como se muestra a continuación:
inserte la descripción de la imagen aquí

referencia

1, https://www.manongdao.com/article-955482.html
2, https://blog.csdn.net/qq_35491306/article/details/82903371
3, https://blog.csdn.net/MAX_Hope/ artículo/detalles/100023615

Supongo que te gusta

Origin blog.csdn.net/mao_hui_fei/article/details/122841419
Recomendado
Clasificación