jump_edge_filter.hpp
Go to the documentation of this file.
00001 
00059 #ifndef JUMP_EDGE_FILTER_HPP_
00060 #define JUMP_EDGE_FILTER_HPP_
00061 
00062 //##################
00063 //#### includes ####
00064 
00065 // pcl includes
00066 #include <pcl/filters/extract_indices.h>
00067 #include <pcl/filters/impl/extract_indices.hpp>
00068 
00069 // cob_3d_mapping_filters includes
00070 #include "cob_3d_mapping_filters/jump_edge_filter.h"
00071 //#include <cob_3d_mapping_filters/cpc_point.h>
00072 
00073 template<typename PointT>
00074   void
00075   cob_3d_mapping_filters::JumpEdgeFilter<PointT>::applyFilter (PointCloud &pc_out)
00076   {
00077     //pointer to indices of points to be removed
00078     pcl::PointIndices::Ptr points_to_remove (new pcl::PointIndices ());
00079 
00080     //upper angle threshold in radians
00081     double upper_angle_thresh = angle_deg_ / 180 * M_PI;
00082 
00083     //Lower angle threshold in radians
00084     double lower_angle_thresh = (180 - angle_deg_) / 180 * M_PI;
00085     for (unsigned int i = 0; i < input_->points.size (); i++)
00086     {
00087       if (i < input_->width || i % input_->width == 0 || i % input_->width == (input_->height - 1)
00088           || i > input_->width * (input_->height - 1))
00089         continue; //skip border points
00090       Eigen::Vector3f v_m (input_->points[i].x, input_->points[i].y, input_->points[i].z);
00091       Eigen::Vector3f v_m_n = v_m.normalized ();
00092       int index = i - input_->width - 1;
00093       Eigen::Vector3f vd_ul (v_m (0) - input_->points[index].x, v_m (1) - input_->points[index].y,
00094                              v_m (2) - input_->points[index].z);
00095       vd_ul.normalize ();
00096 
00097       double angle = std::acos (v_m_n.dot (vd_ul));
00098       if (angle > upper_angle_thresh || angle < lower_angle_thresh)
00099       {
00100         points_to_remove->indices.push_back (i);
00101         continue;
00102       }
00103       index = i - input_->width;
00104       Eigen::Vector3f vd_u (v_m (0) - input_->points[index].x, v_m (1) - input_->points[index].y,
00105                             v_m (2) - input_->points[index].z);
00106       vd_u.normalize ();
00107       angle = std::acos (v_m_n.dot (vd_u));
00108       if (angle > upper_angle_thresh || angle < lower_angle_thresh)
00109       {
00110         points_to_remove->indices.push_back (i);
00111         continue;
00112       }
00113       index = i - input_->width + 1;
00114       Eigen::Vector3f vd_ur (v_m (0) - input_->points[index].x, v_m (1) - input_->points[index].y,
00115                              v_m (2) - input_->points[index].z);
00116       vd_ur.normalize ();
00117       angle = std::acos (v_m_n.dot (vd_ur));
00118       if (angle > upper_angle_thresh || angle < lower_angle_thresh)
00119       {
00120         points_to_remove->indices.push_back (i);
00121         continue;
00122       }
00123       index = i - 1;
00124       Eigen::Vector3f vd_l (v_m (0) - input_->points[index].x, v_m (1) - input_->points[index].y,
00125                             v_m (2) - input_->points[index].z);
00126       vd_l.normalize ();
00127       angle = std::acos (v_m_n.dot (vd_l));
00128       if (angle > upper_angle_thresh || angle < lower_angle_thresh)
00129       {
00130         points_to_remove->indices.push_back (i);
00131         continue;
00132       }
00133       index = i + 1;
00134       Eigen::Vector3f vd_r (v_m (0) - input_->points[index].x, v_m (1) - input_->points[index].y,
00135                             v_m (2) - input_->points[index].z);
00136       vd_r.normalize ();
00137       angle = std::acos (v_m_n.dot (vd_r));
00138       if (angle > upper_angle_thresh || angle < lower_angle_thresh)
00139       {
00140         points_to_remove->indices.push_back (i);
00141         continue;
00142       }
00143       index = i + input_->width - 1;
00144       Eigen::Vector3f vd_ll (v_m (0) - input_->points[index].x, v_m (1) - input_->points[index].y,
00145                              v_m (2) - input_->points[index].z);
00146       vd_ll.normalize ();
00147       angle = std::acos (v_m_n.dot (vd_ll));
00148       if (angle > upper_angle_thresh || angle < lower_angle_thresh)
00149       {
00150         points_to_remove->indices.push_back (i);
00151         continue;
00152       }
00153       index = i + input_->width;
00154       Eigen::Vector3f vd_lo (v_m (0) - input_->points[index].x, v_m (1) - input_->points[index].y,
00155                              v_m (2) - input_->points[index].z);
00156       vd_lo.normalize ();
00157       angle = std::acos (v_m_n.dot (vd_lo));
00158       if (angle > upper_angle_thresh || angle < lower_angle_thresh)
00159       {
00160         points_to_remove->indices.push_back (i);
00161         continue;
00162       }
00163       index = i + input_->width + 1;
00164       Eigen::Vector3f vd_lr (v_m (0) - input_->points[index].x, v_m (1) - input_->points[index].y,
00165                              v_m (2) - input_->points[index].z);
00166       vd_lr.normalize ();
00167       angle = std::acos (v_m_n.dot (vd_lr));
00168       if (angle > upper_angle_thresh || angle < lower_angle_thresh)
00169       {
00170         points_to_remove->indices.push_back (i);
00171         continue;
00172       }
00173     }
00174 
00175     if (&pc_out != input_.get ())
00176       pc_out = *input_;
00177 
00178     for (size_t i = 0; i < points_to_remove->indices.size (); i++)
00179     {
00180       size_t j = points_to_remove->indices[i];
00181       pc_out[j].x = pc_out[j].y = pc_out[j].z = std::numeric_limits<float>::quiet_NaN ();
00182     }
00183     points_to_remove->indices.clear ();
00184   }
00185 
00186 #define PCL_INSTANTIATE_JumpEdgeFilter(T) template class cob_3d_mapping_filters::JumpEdgeFilter<T>;
00187 #endif /* JUMP_EDGE_FILTER_HPP_ */


cob_3d_mapping_filters
Author(s): Georg Arbeiter
autogenerated on Wed Aug 26 2015 11:02:54