1. ホーム

ベクトル添え字の範囲外問題の解の1つ

2022-02-20 22:05:13

元のアドレス:http://www.pclcn.org/bbs/forum.php?mod=viewthread&tid=589


<スパン 今日デバッグモードデバッグ次のコードは、常に範囲外のベクトルの添え字をプロンプトが、以下のリリースでは問題ありません。チェックした後、この代入文のためcloud_filtered = cloud_f;、これらの2つは、点群オブジェクト変数へのポインタなので、値の割り当て、彼らはすべてのオブジェクトを指して、pclで:ExtractIndices< pcl::PointXYZRGB> extract; 内部フィルタリング、問題ないの最初のラウンド、ベクトルのアウトオブバウンド問題の第二ラウンド、違いをよく見てみると2ポインタの最初のラウンドは別の点群オブジェクトに指していることである。そして後者は、ExtractIndicesこのクラス内の関数pcl::ExtractIndices<PointT>:で、1つを指している。 applyFilter (PointCloud & output) there is a copyPointCloud (*input_, indices, output);, in this sentence, corresponding in and out inside is the same object, look at IO's pcl::copyPointCloud (const pcl::PointCloud<PointT> &cloud_in, const std:: vector<int> &indices.Index); in the same object is the same function is the same function,

                     pcl::PointCloud<PointT> &cloud_out) 関数は、cloud_out.points.resize (indices.size (); で、サイズを変更する、このプログラムは、ちょうど外側のポイントを排除するので、それは小さいのサイズを変更すると同時に cloud_in のサイズです。 cloud_out のサイズは、。 points[i] = cloud_in.points[indices[i]]; を変更してから cloud_out.points[i] = cloud_in.points[indices[i]]; を代入しているので、確実に参照されていることがわかります。
正しい解決策は、当然ながら、2つのオブジェクトを存在させたまま、ポインタの割り当てをオブジェクトの割り当てに変更することです。これで問題は解決です。
コード
cloud_filtered=back_cloudです。
      pcl::SACSegmentation<pcl::PointXYZRGB> seg;
          pcl::PointIndices::Ptr tmpinliers (new pcl::PointIndices);
          pcl::ModelCoefficients::Ptr coefficients (new pcl::ModelCoefficients);
          pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_plane (new pcl::PointCloud<pcl::PointXYZRGB> ()) を参照。
          seg.setOptimizeCoefficients (true)。
          seg.setModelType (pcl::SACMODEL_PLANE)です。
          seg.setMethodType (pcl::SAC_RANSAC)を使用します。
          seg.setMaxIterations (maxitter)。
          seg.setDistanceThreshold (距離)を設定します。
          pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_f (new pcl::PointCloud<pcl::PointXYZRGB>) を参照。
          int nr_points = (int) cloud_filtered->points.size ();
          while (cloud_filtered->points.size () > ratio * nr_points)
          { <未定義
                  // 残りのクラウドから最大の平面成分をセグメント化する
                  seg.setInputCloud (cloud_filtered);
                  seg.segment (*tmpinliers, *coefficients);
                  std::cout<<"plane coefficients:" << *coefficients << std::endl;//plane の4つのパラメータを出力します。

                  if (tmpinliers->indices.size () == 0)
                  { <未定義
                          std::cout << "与えられたデータセットに対して平面モデルを推定できませんでした." << std::endl;
                          を破る。
                  }
                  // 入力クラウドから平面インライア値を抽出します.
                  pcl::ExtractIndices<pcl::PointXYZRGB> を抽出します。
                  extract.setInputCloud (cloud_filtered)を実行します。
                  extract.setIndices (tmpinliers)を使用します。
                  extract.setNegative (false)を使用します。
                  // 平面インライヤをディスクに書き込む
                  extract.filter (*cloud_plane);
                  std::cout << "平面成分を表すPointCloud: " << cloud_plane->points.size () << " data points." << std::endl.PointCloud: < < <<< 平面を構成する点群を表すPointCloud。
                  // 平面的なインライアは取り除き、残りを抽出する
                  extract.setNegative (true)を使用します。
                  extract.filter (*cloud_f)を使用します。
                  cloud_filtered = cloud_f; //問題を*cloud_filtered = *cloud_f;に置き換えてください。
          }
///