c++ 无法使用pcl::io::loadPCD文件加载大.pcd文件

k5ifujac  于 11个月前  发布在  其他
关注(0)|答案(2)|浏览(175)

我试图使用pcl加载一个大的ointcloud(5600万个点)。当我加载它时,它给出了正确的大小,但它将1900万个点放在[0,0,0]。我使用cloud compare和其他软件检查这些点不在这里。
这是我的工作代码(它按照我的预期编译和运行)。

#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/common/io.h>
#include <pcl/common/common.h>

#include <string>
#include <iostream>
#include <fstream>

int main()
{
    std::string file_name;
    pcl::PointCloud<pcl::PointXYZ>::Ptr pcl_cloud (new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_final (new pcl::PointCloud<pcl::PointXYZ>);
    float num_points;

    std::cin>>file_name;
    int x=0;
    pcl::io::loadPCDFile(file_name+".pcd",*pcl_cloud);

    for (auto i = 0; i < pcl_cloud->size(); ++i)
    {
        auto point = pcl_cloud->at(i);
        if ((point.x==0)&&(point.y==0)&&(point.z==0)) //(Eigen::seq(0,2))
        // {
        {
            num_points+=1;
            continue;
        }
    }
    std::cout<<"pointcloud size: "<<pcl_cloud->size()<<" of which "<<num_points<<" are exactly [0,0,0].\n";
    return 0;
}

字符串
它返回:点云大小:56579685其中1.67772e+07正好是[0,0,0]
点云的第一部分已正确加载。

vjrehmav

vjrehmav1#

所以我找到了一个适合我的变通方法,仍然不明白出了什么问题。
在创建.pcd文件时,我首先包含了所有可能的字段。通过创建只有XYZ维度的点云,它工作了。

332nm8kg

332nm8kg2#

当您使用所有可能的字段时,一个点的大小为92字节(3 * 4 + 10 * 8,根据您的PCD头)。在写入和阅读PCD文件期间,数据部分作为二进制blob处理,这个blob的大小为92*56579685=5205331020字节(~ 52亿)。这溢出了32位int的值范围(约21亿)和32位无符号整数(~ 43亿)。您可以通过编译具有更大索引类型的PCL来规避此问题(https://github.com/PointCloudLibrary/pcl/blob/master/cmake/pcl_options.cmake#L96),或者将数据保存为二进制PCD而不是ASCII PCD,但也可能是PCL中存在错误。
编辑:我也不完全确定问题是在阅读时发生的,还是已经在写入PCD文件时发生的。

相关问题