40 #ifndef PCL_FILTERS_IMPL_EXTRACT_INDICES_HPP_ 41 #define PCL_FILTERS_IMPL_EXTRACT_INDICES_HPP_ 43 #include <pcl/filters/extract_indices.h> 44 #include <pcl/common/io.h> 47 template <
typename Po
intT>
void 50 std::vector<int> indices;
51 bool temp = extract_removed_indices_;
52 extract_removed_indices_ =
true;
53 this->setInputCloud (cloud);
54 applyFilterIndices (indices);
55 extract_removed_indices_ = temp;
57 std::vector<pcl::PCLPointField> fields;
59 for (
int rii = 0; rii < static_cast<int> (removed_indices_->size ()); ++rii)
61 size_t pt_index = (size_t) (*removed_indices_)[rii];
62 if (pt_index >= input_->points.size ())
64 PCL_ERROR (
"[pcl::%s::filterDirectly] The index exceeds the size of the input. Do nothing.\n",
65 getClassName ().c_str ());
69 uint8_t* pt_data = reinterpret_cast<uint8_t*> (&cloud->points[pt_index]);
70 for (
int fi = 0; fi < static_cast<int> (fields.size ()); ++fi)
71 memcpy (pt_data + fields[fi].offset, &user_filter_value_,
sizeof (
float));
73 if (!pcl_isfinite (user_filter_value_))
74 cloud->is_dense =
false;
78 template <
typename Po
intT>
void 81 std::vector<int> indices;
84 bool temp = extract_removed_indices_;
85 extract_removed_indices_ =
true;
86 applyFilterIndices (indices);
87 extract_removed_indices_ = temp;
90 std::vector<pcl::PCLPointField> fields;
92 for (
int rii = 0; rii < static_cast<int> (removed_indices_->size ()); ++rii)
94 size_t pt_index = (size_t)(*removed_indices_)[rii];
95 if (pt_index >= input_->points.size ())
97 PCL_ERROR (
"[pcl::%s::applyFilter] The index exceeds the size of the input. Do nothing.\n",
98 getClassName ().c_str ());
102 uint8_t* pt_data = reinterpret_cast<uint8_t*> (&output.
points[pt_index]);
103 for (
int fi = 0; fi < static_cast<int> (fields.size ()); ++fi)
104 memcpy (pt_data + fields[fi].offset, &user_filter_value_,
sizeof (
float));
106 if (!pcl_isfinite (user_filter_value_))
111 applyFilterIndices (indices);
117 template <
typename Po
intT>
void 120 if (indices_->size () > input_->points.size ())
122 PCL_ERROR (
"[pcl::%s::applyFilter] The indices size exceeds the size of the input.\n", getClassName ().c_str ());
124 removed_indices_->clear ();
132 if (extract_removed_indices_)
135 std::vector<int> full_indices (input_->points.size ());
136 for (
int fii = 0; fii < static_cast<int> (full_indices.size ()); ++fii)
137 full_indices[fii] = fii;
140 std::vector<int> sorted_input_indices = *indices_;
141 std::sort (sorted_input_indices.begin (), sorted_input_indices.end ());
144 removed_indices_->clear ();
145 set_difference (full_indices.begin (), full_indices.end (), sorted_input_indices.begin (), sorted_input_indices.end (), inserter (*removed_indices_, removed_indices_->begin ()));
151 std::vector<int> full_indices (input_->points.size ());
152 for (
int fii = 0; fii < static_cast<int> (full_indices.size ()); ++fii)
153 full_indices[fii] = fii;
156 std::vector<int> sorted_input_indices = *indices_;
157 std::sort (sorted_input_indices.begin (), sorted_input_indices.end ());
161 set_difference (full_indices.begin (), full_indices.end (), sorted_input_indices.begin (), sorted_input_indices.end (), inserter (indices, indices.begin ()));
163 if (extract_removed_indices_)
164 removed_indices_ = indices_;
168 #define PCL_INSTANTIATE_ExtractIndices(T) template class PCL_EXPORTS pcl::ExtractIndices<T>; 170 #endif // PCL_FILTERS_IMPL_EXTRACT_INDICES_HPP_ std::vector< PointT, Eigen::aligned_allocator< PointT > > points
The point data.
PCL_EXPORTS void copyPointCloud(const pcl::PCLPointCloud2 &cloud_in, const std::vector< int > &indices, pcl::PCLPointCloud2 &cloud_out)
Extract the indices of a given point cloud as a new point cloud.
PointCloud::Ptr PointCloudPtr
PointCloud represents the base class in PCL for storing collections of 3D points.
bool is_dense
True if no points are invalid (e.g., have NaN or Inf values in any of their floating point fields).