基于PCL实现Kitti Bin转PCD格式点云

在使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诗眼天涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值