貌似随机崩溃处理Pointcloud与点云库 - 可能是内存问题?

时间:2013-03-12 09:32:57

标签: memory-management crash point-cloud-library

我正在做一些重新投射点云的步骤(最初约为4000万点,处理时约为2000万点)。程序在这两个循环中的一个循环处看似随机点崩溃。如果我使用较小的子集(约10百万点)运行它,一切正常。

//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); 
        }

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

编辑: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,因为我还需要获得扫描点的强度。猜猜看,程序再次在1700万左右崩溃,我再也不知道为什么。请帮忙

1 个答案:

答案 0 :(得分:1)

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