1

我正在对点云进行几个重投影步骤(最初大约 4000 万个点,处理时大约 2000 万个点)。程序在这两个循环之一的看似随机的点崩溃。如果我使用较小的子集(约 1000 万点)运行它,一切正常。

//Projection of Point Cloud into a sphere 
pcl::PointCloud<pcl::PointXYZ>::Ptr projSphere(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud,int radius) 
        { 
        //output cloud 
        pcl::PointCloud<pcl::PointXYZ>::Ptr output(new pcl::PointCloud<pcl::PointXYZ>); 
        //time marker 
        int startTime = time(NULL); 
        cout<<"Start Sphere Projection"<<endl; 
        //factor by which each Point Vector ist multiplied to get a distance of radius to the origin 
        float scalar; 
        for (int i=0;i<cloud->size();i++) 
                { 
                if (i%1000000==0) cout<<i<<endl; 
                //P 
                pcl::PointXYZ tmpin=cloud->points.at(i); 
                //P' 
                pcl::PointXYZ tmpout; 
                scalar=radius/(sqrt(pow(tmpin.x,2)+pow(tmpin.y,2)+pow(tmpin.z,2))); 
                tmpout.x=tmpin.x*scalar; 
                tmpout.y=tmpin.y*scalar; 
                tmpout.z=tmpin.z*scalar; 
                //Adding P' to the output cloud 
                output->push_back(tmpout); 
                } 
        cout<<"Finished projection of "<<output->size()<<" points in "<<time(NULL)-startTime<<" seconds"<<endl; 
        return(output); 
        } 
//Stereographic Projection 
pcl::PointCloud<pcl::PointXYZ>::Ptr projStereo(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud) 
        { 
        //output cloud 
        pcl::PointCloud<pcl::PointXYZ>::Ptr outputSt(new pcl::PointCloud<pcl::PointXYZ>); 
        //time marker 
        int startTime = time(NULL); 
        cout<<"Start Stereographic Projection"<<endl; 
        for (int i=0;i<cloud->size();i++) 
                { 
                //P 
                if (i%1000000==0) cout<<i<<endl; 
                pcl::PointXYZ tmpin=cloud->points.at(i); 
                //P' 
                pcl::PointXYZ tmpout; 
                //equation 
                tmpout.x=tmpin.x/(1.0+tmpin.z); 
                tmpout.y=tmpin.y/(1.0+tmpin.z); 
                tmpout.z=0; 
                //Adding P' to the output cloud 
                outputSt->push_back(tmpout); 
                } 
        cout<<"Finished projection of"<<outputSt->size()<<" points in "<<time(NULL)-startTime<<" seconds"<<endl; 
        return(outputSt); 
        }

如果我通过在硬盘上保存/加载点云并为每个步骤重新运行程序来独立完成所有步骤,它也可以正常工作。我想提供整个源文件,但我不确定如何/是否需要。提前致谢

编辑:1 大约一周后,我仍然不知道这里可能是什么问题,因为崩溃有点随机,但不是真的?我尝试使用不同的系统工作负载(新重新启动,加载重型程序等)测试程序并没有明显的区别。因为我认为这可能是内存问题,所以我尝试将大对象从堆栈移动到堆(用 new 初始化它们),也没有任何区别。到目前为止,最大的对象是原始输入文件,我打开和关闭它:

    ifstream file;
    file.open(infile);
/*......*/
    file.close();
    delete file;

这样做是否正确,以便在方法完成后释放内存?

再次编辑:所以我越来越尝试,最后我设法将所有步骤放入一个函数中,如下所示:

void stereoTiffI(string infile, string outfile, int length)
    {
    //set up file input
    cout<<"Opening file: "<< infile<<endl;
    ifstream file;
    file.open(infile);
    string line;
    //skip first lines
    for (int i=0;i<9;i++)
        {
        getline(file,line);
        }
    //output cloud
    pcl::PointCloud<pcl::PointXYZ> cloud;
    getline(file,line);
    //indexes for string parsing, coordinates and starting Timer
    int i=0;
    int j=0;
    int k=0;
    float x=0;
    float y=0;
    float z=0;
    float intensity=0;
    float scalar=0;
    int startTime = time(NULL);
    pcl::PointXYZ tmp;
    //begin loop
    cout<<"Begin reading and projecting"<< infile<<endl;
    while (!file.eof())
        {

        getline(file,line);
        i=0;
        j=line.find(" ");
        x=atof(line.substr(i,j).c_str());
        i=line.find(" ",i)+1;
        j=line.find(" ",i)-i;
        y=atof(line.substr(i,j).c_str());
        i=line.find(" ",i)+1;
        j=line.find(" ",i)-i;
        z=atof(line.substr(i,j).c_str());
        //i=line.find(" ",i)+1;
        //j=line.find(" ",i)-i;
        //intensity=atof(line.substr(i,j).c_str());
        //leave out points below scanner height
        if (z>0)
            {
            //projection to a hemisphere with radius 1
            scalar=1/(sqrt(pow(x,2)+pow(y,2)+pow(z,2)));
            x=x*scalar;
            y=y*scalar;
            z=z*scalar;
            //stereographic projection
            x=x/(1.0+z);
            y=y/(1.0+z);
            z=0;
            tmp.x=x;
            tmp.y=y;
            tmp.z=z;
            //tmp.intensity=intensity;
            cloud.push_back(tmp);
            k++;
            if (k%1000000==0)cout<<k<<endl;
            }
        }
    cout<<"Finished producing projected cloud in: "<<time(NULL)-startTime<<" with "<<cloud.size()<<" points."<<endl;

这实际上可以很好地快速退出。在下一步中,我尝试使用 Pointtype XYZI,因为我还需要获取扫描点的强度。你猜怎么着,程序在 17000000 左右再次崩溃,我也不知道为什么。请帮忙

4

1 回答 1

1

好的,我解决了。内存博士通过给我一个堆分配错误给了我正确的提示。经过一番谷歌搜索后,我在 Visual Studio 中启用了大地址(属性 -> 链接器 -> 系统),一切都像一个魅力。

于 2013-03-19T18:35:15.400 回答