2017-10-29 3 views
0

オブジェクトをPCLのポイントクラウドからセグメント化し、オブジェクトのポイントクラウドを作成します。私は、PCL法を用いてこのようにセグメント化されたオブジェクトの重心を計算する。中心にないセグメント化されたオブジェクトのセントロイド

pcl :: PointXYZRGB centroidDS; pcl :: computeCentroid(* cleaned、centroidDS);

重心をオブジェクトにオーバーレイで視覚化すると、オブジェクトのエッジに常に配置されます。私は重心を特徴量として使うので、誰かがこれをどのように計算するか考えていればいいだろう。セグメント化されたオブジェクトの重心は、オブジェクトの中心に多かれ少なかれなければなりません。

答えて

1

確かに、どこかに複数の同じ点がありますか?重心をポイントクラウドの論理中心に見えるものから引き離す。 pcl関数が何か間違っていると思う場合は、

float x = y = z = 0.0; 
for (int i = 0; i < cleaned->points.size(); i++){ 
    x += cleaned->points[i].x; 
    y += cleaned->points[i].y; 
    z += cleaned->points[i].z; 
} 
x = x/cleaned->points.size(); 
y = y/cleaned->points.size(); 
z = z/cleaned->points.size(); 

これは重心と同じでなければなりません。 これが問題の場合は、複数のポイントを削除したり、ポイントクラウドのボクセルグリッドフィルタリングを行って、均一に分散したクラウドを取得してみてください。 http://pointclouds.org/documentation/tutorials/voxel_grid.php

+0

私は、セグメント化する前にボクセルグリッドのダウンサンプリングを行いました。複数のポイントを確認するにはどうしたらいいですか?私のセグメンテーションが十分でなく、重心をずらすように見えない小さな点やブロブがあるかもしれませんか? – bugmaker06

+0

ボクセルグリッドのダウンサンプリングを行った場合は、小さな領域に複数の点や点群があってはいけません。明らかにあなたのグリッドサイズに依存します。あまりにもそれをチェックしたいかもしれません。しかし、座標の差が最小限である重複または準重複がまだ残っている場合は、オクツリーを使ってボクセルに入るポイントの数を計算できると思います。また、半径のある通常のkdtree検索と距離内の近傍の数をカウントするだけで動作します。この投稿はオクトリーについて語っています。 http://www.pcl-users.org/Saving-Octree-voxel-density-information-to-file-td3840729.html – Rooscannon

関連する問題