原点(0,0,0)にあるRGBDセンサからポイントクラウドのどの点が見えるかを調べる必要があります。私は、pclのvoxelgridOcclusionEstimationクラスを使って、センサーに見えるようにクラウド内の可視領域を決定しようとしました。レイトレーシング技術を使用しています。実験としてpclを使ったポイントクラウドのオクルージョン推定voxelgridOcclusionEstimation
、私はその中心以下のいずれかを満たす球の可視領域を取得しよう:
- 中心は、x
- 中心に沿ってY
- 中心に沿ってZに沿っています
- 中心はXZ平面
- 中心に沿ったyz平面
- 中心に沿ってXY平面に沿っています。
センサーはすべての場合においてゼロ回転の原点にあります。
voxelgridOcclusionEstimation yeilds wierd results。緑色の領域は可視領域を示し、赤色は遮蔽領域を示します。
私のコードは次のとおりです。
int main(int argc, char * argv[])
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_in(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_occluded(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_visible(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile(argv[1],*cloud_in);
Eigen::Quaternionf quat(1,0,0,0);
cloud_in->sensor_origin_ = Eigen::Vector4f(0,0,0,0);
cloud_in->sensor_orientation_= quat;
pcl::VoxelGridOcclusionEstimation<pcl::PointXYZ> voxelFilter;
voxelFilter.setInputCloud (cloud_in);
float leaf_size=atof(argv[2]);
voxelFilter.setLeafSize (leaf_size, leaf_size, leaf_size);
voxelFilter.initializeVoxelGrid();
std::vector<Eigen::Vector3i,
Eigen::aligned_allocator<Eigen::Vector3i> > occluded_voxels;
for (size_t i=0;i<cloud_in->size();i++)
{
PointT pt=cloud_in->points[i];
Eigen::Vector3i grid_cordinates=voxelFilter.getGridCoordinates (pt.x, pt.y, pt.z);
int grid_state;
int ret=voxelFilter.occlusionEstimation(grid_state, grid_cordinates);
if (grid_state==1)
{
cloud_occluded->push_back(cloud_in->points[i]);
}
else
{
cloud_visible->push_back(cloud_in->points[i]);
}
}
pcl::io::savePCDFile(argv[3],*cloud_occluded);
pcl::io::savePCDFile(argv[4],*cloud_visible);
return 0;
}