为啥 PCL 条件过滤器返回相同的点云?
Posted
技术标签:
【中文标题】为啥 PCL 条件过滤器返回相同的点云?【英文标题】:Why PCL Conditional filter return the same point cloud?为什么 PCL 条件过滤器返回相同的点云? 【发布时间】:2017-02-17 22:41:41 【问题描述】:我正在使用 PCL 处理点云,最终以检测场景中的对象为结束。
我添加了一个自定义 PiontT 类型,它适用于我。但是,我在 PCL 库中的过滤算法上苦苦挣扎。我尝试了统计、半径和条件异常值去除来去除噪音。统计没有返回结果(在我看来,它好像在无限循环中),另一方面,半径返回大小为 0 的云。条件实际上返回相同的云而不删除任何点。在半径和统计方面,我都按照给出的示例进行操作,但它们不起作用。
目前,我认为条件删除是最适合我的算法,因为我想删除任何不在 [0.4 - 1] 范围内的点。正如我之前提到的,我使用的是自定义点类型。下面是点类型(Tango3DPoitType)的代码和使用条件移除的方法。
Tango3DPoitType.h
#define PCL_NO_PRECOMPILE
#include <pcl/point_types.h>
#include <pcl/impl/point_types.hpp>
#include <pcl/point_cloud.h>
#include <pcl/impl/instantiate.hpp>
// Preserve API for PCL users < 1.4
#include <pcl/common/distances.h>
#include <pcl/io/pcd_io.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/kdtree/impl/kdtree_flann.hpp>
#include <pcl/search/organized.h>
#include <pcl/search/impl/organized.hpp>
#include <pcl/filters/statistical_outlier_removal.h>
#include <pcl/filters/impl/statistical_outlier_removal.hpp>
#include <pcl/filters/radius_outlier_removal.h>
#include <pcl/filters/impl/radius_outlier_removal.hpp>
#include <pcl/filters/voxel_grid.h>
#include <pcl/filters/impl/voxel_grid.hpp>
#include <pcl/filters/voxel_grid_covariance.h>
#include <pcl/filters/impl/voxel_grid_covariance.hpp>
#include <pcl/filters/extract_indices.h>
#include <pcl/filters/impl/extract_indices.hpp>
#include <pcl/filters/conditional_removal.h>
#include <pcl/filters/impl/conditional_removal.hpp>
#include <pcl/segmentation/sac_segmentation.h>
#include <pcl/segmentation/impl/sac_segmentation.hpp>
#include <pcl/segmentation/extract_clusters.h>
#include <pcl/segmentation/impl/extract_clusters.hpp>
#include <pcl/sample_consensus/method_types.h>
#include <pcl/sample_consensus/model_types.h>
struct EIGEN_ALIGN16 _Tango3DPoitType
PCL_ADD_POINT4D; // This adds the members x,y,z which can also be accessed using the point (which is float[4])
union
union
struct
uint8_t b;
uint8_t g;
uint8_t r;
uint8_t a;
; float rgb;
; uint32_t rgba;
;
float Confidence;
EIGEN_MAKE_ALIGNED_OPERATOR_NEW ;
struct EIGEN_ALIGN16 Tango3DPoitType : public _Tango3DPoitType
inline Tango3DPoitType ()
x = y = z = 0.0f;
data[3] = 1.0f;
r = b = a = 0;
g = 255;
Confidence = 0.0f;
inline Tango3DPoitType (float _Confidence)
x = y = z = 0.0f;
data[3] = 1.0f;
r = b = a = 0;
g = 255;
Confidence = _Confidence;
inline Tango3DPoitType (uint8_t _r, uint8_t _g, uint8_t _b)
x = y = z = 0.0f;
data[3] = 1.0f;
r = _r;
g = _g;
b = _b;
a = 0;
Confidence = 0;
inline Eigen::Vector3i getRGBVector3i () return (Eigen::Vector3i (r, g, b));
inline const Eigen::Vector3i getRGBVector3i () const return (Eigen::Vector3i (r, g, b));
inline Eigen::Vector4i getRGBVector4i () return (Eigen::Vector4i (r, g, b, 0));
inline const Eigen::Vector4i getRGBVector4i () const return (Eigen::Vector4i (r, g, b, 0));
EIGEN_MAKE_ALIGNED_OPERATOR_NEW ;
// Adding confidence as fourth data to XYZ
POINT_CLOUD_REGISTER_POINT_STRUCT (Tango3DPoitType,
(float, x, x)
(float, y, y)
(float, z, z)
(uint32_t, rgba, rgba)
(float, Confidence, Confidence)
)
POINT_CLOUD_REGISTER_POINT_WRAPPER(Tango3DPoitType, _Tango3DPoitType)
条件移除方法
void CloudDenoising(const pcl::PointCloud<Tango3DPoitType>::Ptr source,
const pcl::PointCloud<Tango3DPoitType>::Ptr target)
// build the condition
pcl::ConditionAnd<Tango3DPoitType>::Ptr ConfidenceRangeCondition (new pcl::ConditionAnd<Tango3DPoitType> ());
ConfidenceRangeCondition->addComparison (pcl::FieldComparison<Tango3DPoitType>::ConstPtr (new pcl::FieldComparison<Tango3DPoitType> ("Confidence", pcl::ComparisonOps::GT, 0.5)));
ConfidenceRangeCondition->addComparison (pcl::FieldComparison<Tango3DPoitType>::ConstPtr (new pcl::FieldComparison<Tango3DPoitType> ("Confidence", pcl::ComparisonOps::LT, 1.1)));
// build the filter
pcl::ConditionalRemoval<Tango3DPoitType> conditionalRemoval;
conditionalRemoval.setCondition (ConfidenceRangeCondition);
conditionalRemoval.setInputCloud (source);
conditionalRemoval.setKeepOrganized(true);
// apply filter
conditionalRemoval.filter (*target);
我想了解是我对点类型做错了什么,还是它是 PCL 库中的错误。
谢谢
【问题讨论】:
【参考方案1】:您正在裁剪云,但它仍然有条理。
要解决它,只需删除方法.setKeepOrganized(true)
。
【讨论】:
以上是关于为啥 PCL 条件过滤器返回相同的点云?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 TDengine 数据库在相同的过滤条件下不能返回相同数量的行?