処理の流れ
-
検出器を宣言し各パラメータを設定
-
入力点群を検出器にセット
-
平面検出を実行
#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:
- SACMODEL_PLANE used to determine plane models. The four coefficients of the plane are its Hessian Normal form: [normal_x normal_y normal_z d]
- SACMODEL_LINE used to determine line models. The six coefficients of the line are given by a point on the line and the direction of the line as: [point_on_line.x point_on_line.y point_on_line.z line_direction.x line_direction.y line_direction.z]
- SACMODEL_CIRCLE2D used to determine 2D circles in a plane. The circle's three coefficients are given by its center and radius as: [center.x center.y radius]
- SACMODEL_CIRCLE3D used to determine 3D circles in a plane. The circle's seven coefficients are given by its center, radius and normal as: [center.x, center.y, center.z, radius, normal.x, normal.y, normal.z]
- SACMODEL_SPHERE used to determine sphere models. The four coefficients of the sphere are given by its 3D center and radius as: [center.x center.y center.z radius]
- SACMODEL_CYLINDER used to determine cylinder models. The seven coefficients of the cylinder are given by a point on its axis, the axis direction, and a radius, as: [point_on_axis.x point_on_axis.y point_on_axis.z axis_direction.x axis_direction.y axis_direction.z radius]
- SACMODEL_CONE used to determine cone models. The seven coefficients of the cone are given by a point of its apex, the axis direction and the opening angle, as: [apex.x, apex.y, apex.z, axis_direction.x, axis_direction.y, axis_direction.z, opening_angle]
- SACMODEL_TORUS - not implemented yet
- SACMODEL_PARALLEL_LINE a model for determining a line parallel with a given axis, within a maximum specified angular deviation. The line coefficients are similar to SACMODEL_LINE .
- SACMODEL_PERPENDICULAR_PLANE a model for determining a plane perpendicular to a user-specified axis, within a maximum specified angular deviation. The plane coefficients are similar to SACMODEL_PLANE .
- SACMODEL_PARALLEL_LINES - not implemented yet
- SACMODEL_NORMAL_PLANE a model for determining plane models using an additional constraint: the surface normals at each inlier point has to be parallel to the surface normal of the output plane, within a maximum specified angular deviation. The plane coefficients are similar to SACMODEL_PLANE .
- SACMODEL_NORMAL_SPHERE similar to SACMODEL_SPHERE , but with additional surface normal constraints.