処理の流れ

  1. 検出器を宣言し各パラメータを設定

  2. 入力点群を検出器にセット

  3. 平面検出を実行

#include <pcl/segmentation/sac_segmentation.h>

//入力点群
pcl::PointCloud<pcl::PointXYZ> input_pointcloud;
//点群をセットする処理.push_backとかでやってください

//平面方程式と平面と検出された点のインデックス
pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
pcl::PointIndices::Ptr inliers(new pcl::PointIndices);

//RANSACによる検出.
pcl::SACSegmentation<pcl::PointXYZ> seg;
seg.setOptimizeCoefficients(true); //外れ値の存在を前提とし最適化を行う
seg.setModelType(pcl::SACMODEL_PLANE); //モードを平面検出に設定
seg.setMethodType(pcl::SAC_RANSAC); //検出方法をRANSACに設定
seg.setDistanceThreshold(0.005); //しきい値を設定
seg.setInputCloud(raw_pointcloud.makeShared()); //入力点群をセット
seg.segment(*inliers, *coefficients); //検出を行う

PCLによる平面の検出 - Qiita

平面モデル

pcl::ModelCoefficients::Ptr coefficients_;

//ax+by+c+d=0
a=coefficients->values[0];
b=coefficients->values[1];
c=coefficients->values[2];
d=coefficients->values[3];
//法線ベクトル
//[a,b,c]T

The following models are supported: