使用 pcl voxelgridOcclusionEstimation 在点云中进行遮挡估计
Occlusion estimation in pointcloud using pcl voxelgridOcclusionEstimation
我需要从位于原点 (0,0,0) 的 RGBD 传感器中找出点云的哪些点是可见的。我尝试使用 pcl 的 voxelgridOcclusionEstimation class 来确定传感器看到的云中的可见区域。它使用光线追踪技术。
作为实验,我试图在一个球体中获取可见区域,该球体的中心满足以下条件之一:
- 中心沿着 x
- 中心沿着 y
- 中心沿着 z
- 中心沿 xz 平面
- 中心沿 y z 平面
- 中心沿 x y 平面。
在所有情况下,传感器都在零旋转的原点。
voxelgridOcclusionEstimation 产生奇怪的结果。绿色区域表示可见区域,而红色表示遮挡区域。
我的代码是:
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;
}
除了拼写错误和遗漏点类型定义外,您的代码似乎可以正常工作。尝试使用不同的点云以获得更好的视觉分析。
编辑。另一方面,这似乎表现得很奇怪,例如牛奶车可以从这里 http://pointclouds.org/documentation/tutorials/supervoxel_clustering.php#supervoxel-clustering。
voxelgridOcclusionEstimation class 有效,但网格宽度非常重要。如果我们让它变得非常小,那么前景中就会有未被占用的体素,这将使投射光线通过并传递到背景。如果它们设置得很大,则表面将无法正确表示。如果模型没有像 RGBD 传感器捕获的数据那样均匀的点密度,这将更加困难
我需要从位于原点 (0,0,0) 的 RGBD 传感器中找出点云的哪些点是可见的。我尝试使用 pcl 的 voxelgridOcclusionEstimation class 来确定传感器看到的云中的可见区域。它使用光线追踪技术。
作为实验,我试图在一个球体中获取可见区域,该球体的中心满足以下条件之一:
- 中心沿着 x
- 中心沿着 y
- 中心沿着 z
- 中心沿 xz 平面
- 中心沿 y z 平面
- 中心沿 x y 平面。
在所有情况下,传感器都在零旋转的原点。
voxelgridOcclusionEstimation 产生奇怪的结果。绿色区域表示可见区域,而红色表示遮挡区域。
我的代码是:
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;
}
除了拼写错误和遗漏点类型定义外,您的代码似乎可以正常工作。尝试使用不同的点云以获得更好的视觉分析。
编辑。另一方面,这似乎表现得很奇怪,例如牛奶车可以从这里 http://pointclouds.org/documentation/tutorials/supervoxel_clustering.php#supervoxel-clustering。
voxelgridOcclusionEstimation class 有效,但网格宽度非常重要。如果我们让它变得非常小,那么前景中就会有未被占用的体素,这将使投射光线通过并传递到背景。如果它们设置得很大,则表面将无法正确表示。如果模型没有像 RGBD 传感器捕获的数据那样均匀的点密度,这将更加困难