Skip to content

Baundingbox

Harumo Sasatake edited this page Oct 25, 2018 · 6 revisions

バウンディングボックスを作成する

バウンディングボックスというのは点群全体を包むような6面体のことです. pclには2種類のバウンディングボックス作成アルゴリズムが実装されています.

  • Oriented Bounding Box( OBB )

    点群がぴったり収まるようなバウンディングボックスを作成します.名前の通り 作成されたバウンディングボックスは点群の傾きに沿うように傾きます.

  • Axis Aligned Bounding Box( AABB )

    こちらはOriented Bounding Boxとはことなり,xyz軸に沿うような,傾いておらず,かつ 点群を包むようなバウンディングボックスを作成します.点群が傾いていると余計な空白ができます.

これらのバウンディングボックスはpcl::MomentOfInertiaEstimationクラスから生成されます. バウンディングボックスの作成の仕方は,下記のような感じになります.

呼び出す順番 クラス名・関数名 説明
1 pcl::MomentOfInertiaEstimation<pcl::PointXYZ> OOBやAABBはこのクラスに点群を入力することによって作成されます.今回もpcl::PointXYZを用いていることを前提に説明します
2 MomentOfInertiaEstimation.setInputCloud(pcl::PointCloud) この関数でバウンディングボックスを作成するための点群を引数として渡します.
3 MomentOfInertiaEstimation.compute() 各種の計算を実行します.計算が実行されたので,あとは,このクラスからOOBなどの計算結果を取り出すだけです.

各種計算が終わったので,計算結果をpcl::MomentOfInertiaEstimationpcl::PointXYZクラスから取り出します. 計算結果の取り出しには下記の関数を使用できます.

返り値 関数名 説明
bool getMomentOfInertia(std::vector<float>& moment_of_inertia) もし,trueならば慣性モーメントが返ってきます.バウンディングボックスには関係ありません
bool getEccentricity(std::vector<float>& eccentricity) もし,trueなら離心率(eccentricity)が返ってきます.バウンディングボックスには関係ありません
bool getAABB(pcl::PointXYZ& min_point, pcl::PointXYZ& max_point) compute()で得られたAABBの結果を返します.具体的にはバウンディングボックスの基底から最も近い点と,最も遠い点が返ってきます.AABBは各軸に平行なので,2点の情報だけで六面体を構成することができます.
bool getOBB(pcl::PointXYZ& min_point, pcl::PointXYZ& max_point, pcl::PointXYZ& position_obb, Eigen::Matrix3f& rotational_matrix_obb) compute()で得られたOBBを返します.OBBは点群によって傾くのでバウンディングボックスの中心点の位置と姿勢と辺の長さ(min_point, max_point)で構成されます
bool getEigenValue(float& major, float& middle, float& minor) バウンディングボックスを生成するための計算途中で使用した固有値を返します.major,middle,minorの順に固有値が小さくなります.
bool getEigenVector(Eigen::Vector3f& major_vector, Eigen::Vector3f& middle_vector, Eigen::Vector3f& minor_vector) major, middle, minorのそれぞれの固有ベクトルです.これはとても重要で,これらのベクトルは点群の基底を表します.major_vector=x軸,middle_vector=y軸,minor_vector=z軸となります.詳細は下にあります.
bool getMassCenter(Eigen::vector3f& mass_center) 点群の重心を返します.

Oriented Bounding Box

OBBアルゴリズムのざっくりした説明

  1. 点群を入力として受け取る.
  2. 点群の主成分分析を行い.最も点群が長細くなっている方向をその点群のx軸とする.その次にそのx軸と直行する方向で,点群が長細くなっている方向を探し,y軸とする.最後にそれら2つのベクトルに直行するようにz軸を定める.これで,点群に固有のxyz軸が定まる.

表示

ビューワーでバウンディングボックスを表示するときには,六面体で表現することが一般的だと思います. なんせバウンディング ボックス なんで.バウンディングボックスの表示の仕方はビューワーの項目の箱を表示に詳しく書きました. ビューワーの詳しい使用方法はビューワーの項目を見てほしいのですが,ここではバウンディングボックスの表示に使用しそうな ビューワーの関数の説明をしたいと思います.

pcl::visulalization::PCLVisualizer viwer;

//その1
viewer.addCube(float min_point_x, float max_point_x,
               float min_point_y, float max_point_y,
               float min_point_z, float max_point_z,
               double r = 1.0, double g = 1.0, double b = 1.0,
               std::string id = "cube", int viewport = 0);

//その2
viewer.addCube(Eigen::Vector3f translation, Eigen::Quaternionf rotation,
               double width, double height, double depth,
               std::string id = "cube", int viewport = 0)

変換

バウンディングボックスなどを扱っているとクラスの変換を行うことになることがよくあります. そのための備忘録を記します.

//回転行列からクォータニオンの変換
Eigen::Quaternion quat(Eigen::Matrix3f rotation_matrix);
//Eigenの点からpclの点への変換
Eigen::Vector3f point; //pointには適当な値を入れる
pcl::PointXYZ p(point.x, point.y, point.z);
Clone this wiki locally