在使用OpenPCDet进行激光雷达3D目标检测任务时,kitti数据集中bin格式点云无法直接使用CloudCompare查看点云,因此,笔者这里使用C++和PCL库,实现从bin格式转换为PCD格式点云并保存,以下是具体实现代码:
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>
#include <fstream>
#include <vector>
#include <pcl/io/pcd_io.h>
// 定义一个点类型,这里假设每个点有x、y、z和intensity
using PointXYZI = pcl::PointXYZI;
void loadKITTIbinFile(const std::string& filename, pcl::PointCloud<PointXYZI>& cloud)
{
std::ifstream file(filename, std::ios::binary);
if (!file.is_open())
{
printf("Failed to open file %s\n", filename.c_str());
return;
}
float x, y, z, intensity;
while (file.read(reinterpret_cast<char*>(&x), sizeof(float)) &&
file.read(reinterpret_cast<char*>(&y), sizeof(float)) &&
file.read(reinterpret_cast<char*>(&z), sizeof(float)) &&
file.read(reinterpret_cast<char*>(&intensity), sizeof(float)))
{
pcl::PointXYZI point;
point.x = x;
point.y = y;
point.z = z;
point.intensity = intensity;
cloud.push_back(point);
}
file.close();
}
int main()
{
pcl::PointCloud<PointXYZI> cloud;
loadKITTIbinFile("lidar_2021-03-12-10-09-45_meixihu_0_1.bin", cloud);
// 保存为PCD文件
pcl::io::savePCDFileASCII("output.pcd", cloud);
return 0;
}
CMakeLists.txt文件:
cmake_minimum_required(VERSION 2.6)
project(bin2pcd)
find_package(PCL 1.8 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS}
"/usr/include/eigen3")
add_definitions(${PCL_DEFINITIONS})
add_executable(bin2pcd bin2pcd.cpp)
target_link_libraries (bin2pcd ${PCL_LIBRARIES})
install(TARGETS bin2pcd RUNTIME DESTINATION bin)
这里说明一下,对于KITTI格式的.bin文件,它们通常是包含浮点数的简单二进制文件,每个点由x、y、z坐标组成(有时还包括强度)。这里是通过创建一个自定义的读取函数来处理这种格式,
上述代码首先定义了一个PointXYZI
类型的点云,然后使用loadKITTIbinFile
函数读取.bin文件。此函数会打开文件,逐个读取浮点数值,并创建PointXYZI
类型的点。最后,将这些点添加到点云对象中,并使用savePCDFileASCII
函数将点云保存为PCD格式文件。
使用前确保你已经正确安装了PCL库,并且在编译时链接了相应的库。在使用过程中适当修改文件路径和代码细节。如果.bin
文件中的点结构不同于上述示例(例如,没有强度信息),则需要相应地调整读取逻辑。例如,如果.bin文件中只包含x、y、z坐标,那么应该使用pcl::PointXYZ
类型而不是pcl::PointXYZI
。