1

ポイントクラウドの再投影のいくつかのステップを実行しています(最初は約4,000万ポイント、処理中は約2,000万ポイント)。プログラムは、これら 2 つのループのいずれかで一見ランダムなポイントでクラッシュします。小さなサブセット (~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 約 1 週間後、クラッシュは多少ランダムですが、実際にはそうではないため、ここで何が問題なのかまだわかりませんか? 別のシステムワークロード(再起動したばかり、負荷の高いプログラムをロードした状態など)でプログラムをテストしようとしましたが、明らかな違いはありません。おそらくメモリの問題だと思ったので、大きなオブジェクトをスタックからヒープに移動しようとしました(新しいオブジェクトで初期化しました)が、違いはありませんでした。最大のオブジェクトは未加工の入力ファイルで、これを開いたり閉じたりします。

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

メソッドが完了した後にメモリが解放されるように、それは適切に行われていますか?

もう一度編集してください:だから私はさらに試してみて、最終的にすべてのステップを次のような1つの関数にまとめることができました:

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

わかりました、解決しました。Dr. Memory は、ヒープ割り当てエラーを教えてくれ、正しいヒントをくれました。少しグーグルで調べた後、Visual Studio でラージ アドレスを有効にしました (プロパティ -> リンカー -> システム)。

于 2013-03-19T18:35:15.400 に答える