我有一个从3D相机捕获的有组织的点云(1280 * 720)。我只是想知道是否有一种方法可以将这个点云调整(缩小)到更小的尺寸(例如128 * 72),同时保持这种云的有序性。 (我认为这不应该与下采样相同。"调整大小"意味着缩放图像)。
我正在使用Point Cloud Library 1.8.0,但坚持这一点。
欢迎任何建议,先谢谢!
答案 0 :(得分:1)
从您想要减少云的时间中取出一点, 像那样的工作:
for (pcl::PointCloud<pcl::PointXYZ>::const_iterator it = src->begin(); it< src->end(); it+=times)
{
dest.points.push_back(*it);
}
唯一的问题是云可能包含一些NaN值。要纠正它,只需将is_dense设置为false,然后在其上调用removeNaNFromPointCloud。
希望这可以帮到你!
答案 1 :(得分:0)
无法发表评论,但默认情况下从点云中移除NaN会使其无组织。如果你的仪器无法观察到矩阵中的一个点只是为了保持矩阵尺寸正确,那么NaN很可能作为虚拟点。删除那些破坏了矩阵结构,你将获得与1280 * 720矩阵所期望的不同的点数。
如果您希望将有组织的点云下采样2倍,您可以尝试类似
int scale = 2;
pcl::PointCloud<pcl::your_point_type> down_sampled_cloud;
down_sampled_cloud.width = original_cloud.width / scale;
down_sampled_cloud.height = original_cloud.height / scale;
for( int ii = 0; ii < original_cloud.height; ii+=scale){
for( int jj = 0; jj < original_cloud.width; jj+=scale ){
down_sampled_cloud.push_back(original_cloud.at(ii,jj));
}
}
将比例改变为您想要的。
这种方法只是对原始点云进行采样,它不会在现有点之间插入点。按十进制因子缩放比较棘手,如果曲面不连续,可能会产生不需要的结果。
答案 2 :(得分:0)
Rooscannon的答案特别正确,但有一些错误。有组织点云的正确均匀子采样如下:
// Downsampling or keypoint extraction
int scale = 3;
PointCloud<PointXYZRGB>::Ptr keypoints (new PointCloud<PointXYZRGB>);
keypoints->width = cloud->width / scale;
keypoints->height = cloud->height / scale;
keypoints->points.resize(keypoints->width * keypoints->height);
for( size_t i = 0, ii = 0; i < keypoints->height; ii += scale, i++){
for( size_t j = 0, jj = 0; j < keypoints->width; jj += scale, j++){
keypoints->at(j, i) = cloud->at(jj, ii); //at(column, row)
}
}
因此,子采样点云的循环条件,索引和初始化是不同的。否则,将不再组织子采样点云。