41 #include <pcl/pcl_config.h>
43 #include <pcl/filters/filter_indices.h>
75 template <
typename Po
intT>
84 using Ptr = shared_ptr<FrustumCulling<PointT> >;
85 using ConstPtr = shared_ptr<const FrustumCulling<PointT> >;
92 , camera_pose_ (
Eigen::Matrix4f::Identity ())
93 , fov_left_bound_ (-30.0f)
94 , fov_right_bound_ (30.0f)
95 , fov_lower_bound_ (-30.0f)
96 , fov_upper_bound_ (30.0f)
128 camera_pose_ = camera_pose;
135 return (camera_pose_);
145 if (hfov <= 0 || hfov >= 180)
147 throw PCLException (
"Horizontal field of view should be between 0 and 180(excluded).",
148 "frustum_culling.h",
"setHorizontalFOV");
150 fov_left_bound_ = -hfov / 2;
151 fov_right_bound_ = hfov / 2;
167 if (fov_left_bound <= -90 || fov_right_bound >= 90 || fov_left_bound >= fov_right_bound)
169 throw PCLException (
"Horizontal field of view bounds should be between -90 and 90(excluded). "
170 "And left bound should be smaller than right bound.",
171 "frustum_culling.h",
"setHorizontalFOV");
173 fov_left_bound_ = fov_left_bound;
174 fov_right_bound_ = fov_right_bound;
181 if (std::fabs(fov_right_bound_) != std::fabs(fov_left_bound_)) {
182 PCL_WARN(
"Your horizontal field of view is asymmetrical: "
183 "left bound's absolute value(%f) != right bound's absolute value(%f)! "
184 "Please use getHorizontalFOV (float& fov_left_bound, float& fov_right_bound) instead.\n",
185 std::fabs(fov_left_bound_), std::fabs(fov_right_bound_));
187 return (fov_right_bound_ - fov_left_bound_);
194 fov_left_bound = fov_left_bound_;
195 fov_right_bound = fov_right_bound_;
205 if (vfov <= 0 || vfov >= 180)
207 throw PCLException (
"Vertical field of view should be between 0 and 180(excluded).",
208 "frustum_culling.h",
"setVerticalFOV");
210 fov_lower_bound_ = -vfov / 2;
211 fov_upper_bound_ = vfov / 2;
227 if (fov_lower_bound <= -90 || fov_upper_bound >= 90 || fov_lower_bound >= fov_upper_bound)
229 throw PCLException (
"Vertical field of view bounds should be between -90 and 90(excluded). "
230 "And lower bound should be smaller than upper bound.",
231 "frustum_culling.h",
"setVerticalFOV");
233 fov_lower_bound_ = fov_lower_bound;
234 fov_upper_bound_ = fov_upper_bound;
241 if (std::fabs(fov_upper_bound_) != std::fabs(fov_lower_bound_)) {
242 PCL_WARN(
"Your vertical field of view is asymmetrical: "
243 "lower bound's absolute value(%f) != upper bound's absolute value(%f)! "
244 "Please use getVerticalFOV (float& fov_lower_bound, float& fov_upper_bound) instead.\n",
245 std::fabs(fov_lower_bound_), std::fabs(fov_upper_bound_));
247 return (fov_upper_bound_ - fov_lower_bound_);
254 fov_lower_bound = fov_lower_bound_;
255 fov_upper_bound = fov_upper_bound_;
266 throw PCLException (
"Near plane distance should be greater than or equal to 0.",
267 "frustum_culling.h",
"setNearPlaneDistance");
288 throw PCLException (
"Far plane distance should be greater than 0.",
289 "frustum_culling.h",
"setFarPlaneDistance");
315 if ((roi_x > 1.0f) || (roi_x < 0.0f) ||
316 (roi_y > 1.0f) || (roi_y < 0.0f) ||
317 (roi_w <= 0.0f) || (roi_w > 1.0f) ||
318 (roi_h <= 0.0f) || (roi_h > 1.0f))
320 throw PCLException (
"ROI X-Y values should be between 0 and 1. "
321 "Width and height must not be zero.",
322 "frustum_culling.h",
"setRegionOfInterest");
364 Eigen::Matrix4f camera_pose_;
366 float fov_left_bound_;
368 float fov_right_bound_;
370 float fov_lower_bound_;
372 float fov_upper_bound_;
391 #ifdef PCL_NO_PRECOMPILE
392 #include <pcl/filters/impl/frustum_culling.hpp>
Filter represents the base filter class.
shared_ptr< Filter< PointT > > Ptr
shared_ptr< const Filter< PointT > > ConstPtr
std::string filter_name_
The filter name.
FilterIndices represents the base class for filters that are about binary point removal.
FrustumCulling filters points inside a frustum given by pose and field of view of the camera.
float getVerticalFOV() const
Get the vertical field of view for the camera in degrees.
float getNearPlaneDistance() const
Get the near plane distance.
float getHorizontalFOV() const
Get the horizontal field of view for the camera in degrees.
void setNearPlaneDistance(float np_dist)
Set the near plane distance.
void setRegionOfInterest(float roi_x, float roi_y, float roi_w, float roi_h)
Set the region of interest (ROI) in normalized values.
void setVerticalFOV(float fov_lower_bound, float fov_upper_bound)
Set the vertical field of view for the camera in degrees.
void setVerticalFOV(float vfov)
Set the vertical field of view for the camera in degrees.
void getHorizontalFOV(float &fov_left_bound, float &fov_right_bound) const
Get the horizontal field of view for the camera in degrees.
void setFarPlaneDistance(float fp_dist)
Set the far plane distance.
void setHorizontalFOV(float hfov)
Set the horizontal field of view for the camera in degrees.
FrustumCulling(bool extract_removed_indices=false)
void setHorizontalFOV(float fov_left_bound, float fov_right_bound)
Set the horizontal field of view for the camera in degrees.
float getFarPlaneDistance() const
Get the far plane distance.
Eigen::Matrix4f getCameraPose() const
Get the pose of the camera w.r.t the origin.
void getVerticalFOV(float &fov_lower_bound, float &fov_upper_bound) const
Get the vertical field of view for the camera in degrees.
void setCameraPose(const Eigen::Matrix4f &camera_pose)
Set the pose of the camera w.r.t the origin.
void getRegionOfInterest(float &roi_x, float &roi_y, float &roi_w, float &roi_h) const
Get the region of interest (ROI) in normalized values.
void applyFilter(Indices &indices) override
Sample of point indices.
typename PointCloud::Ptr PointCloudPtr
typename PointCloud::ConstPtr PointCloudConstPtr
A base class for all pcl exceptions which inherits from std::runtime_error.
PointCloud represents the base class in PCL for storing collections of 3D points.
shared_ptr< PointCloud< PointT > > Ptr
shared_ptr< const PointCloud< PointT > > ConstPtr
Defines all the PCL implemented PointT point type structures.
#define PCL_MAKE_ALIGNED_OPERATOR_NEW
Macro to signal a class requires a custom allocator.
Defines functions, macros and traits for allocating and using memory.
IndicesAllocator<> Indices
Type used for indices in PCL.
A point structure representing Euclidean xyz coordinates, and the RGB color.