调整组织点云的大小
Resize organized point cloud
我有一个从 3D 相机捕获的有组织的点云 (1280 * 720)。我只是想知道是否有一种方法可以在保持点云有条理的情况下将其调整(缩小)到更小的尺寸(例如 128 * 72)。
(我认为这不应该与向下采样相同。"Resize" 意味着像缩放图像一样)。
我正在使用 Point Cloud Library 1.8.0 但坚持使用它。
欢迎大家指教,先谢谢了!
只要从你想要减少云的次数中取一分,
诸如此类的作品 :
for (pcl::PointCloud<pcl::PointXYZ>::const_iterator it = src->begin(); it< src->end(); it+=times)
{
dest.points.push_back(*it);
}
唯一的问题是云可能包含一些 NaN 值。要更正它,只需将 is_dense 设置为 false 到 dest 并对其调用 removeNaNFromPointCloud。
希望对您有所帮助!
无法发表评论,但默认情况下从点云中删除 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));
}
}
根据需要更改比例。
此方法只是对原始点云进行下采样,不会在现有点之间进行插值。按小数因子缩放比较棘手,如果表面不连续,可能会产生不需要的结果。
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)
}
}
所以二次采样点云的循环条件、索引和初始化是不同的。否则,子采样点云将不再组织。
我有一个从 3D 相机捕获的有组织的点云 (1280 * 720)。我只是想知道是否有一种方法可以在保持点云有条理的情况下将其调整(缩小)到更小的尺寸(例如 128 * 72)。 (我认为这不应该与向下采样相同。"Resize" 意味着像缩放图像一样)。
我正在使用 Point Cloud Library 1.8.0 但坚持使用它。
欢迎大家指教,先谢谢了!
只要从你想要减少云的次数中取一分, 诸如此类的作品 :
for (pcl::PointCloud<pcl::PointXYZ>::const_iterator it = src->begin(); it< src->end(); it+=times)
{
dest.points.push_back(*it);
}
唯一的问题是云可能包含一些 NaN 值。要更正它,只需将 is_dense 设置为 false 到 dest 并对其调用 removeNaNFromPointCloud。
希望对您有所帮助!
无法发表评论,但默认情况下从点云中删除 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));
}
}
根据需要更改比例。
此方法只是对原始点云进行下采样,不会在现有点之间进行插值。按小数因子缩放比较棘手,如果表面不连续,可能会产生不需要的结果。
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)
}
}
所以二次采样点云的循环条件、索引和初始化是不同的。否则,子采样点云将不再组织。