Go to the documentation of this file.00001
00059 #ifndef JUMP_EDGE_FILTER_HPP_
00060 #define JUMP_EDGE_FILTER_HPP_
00061
00062
00063
00064
00065
00066 #include <pcl/filters/extract_indices.h>
00067 #include <pcl/filters/impl/extract_indices.hpp>
00068
00069
00070 #include "cob_3d_mapping_filters/jump_edge_filter.h"
00071
00072
00073 template<typename PointT>
00074 void
00075 cob_3d_mapping_filters::JumpEdgeFilter<PointT>::applyFilter (PointCloud &pc_out)
00076 {
00077
00078 pcl::PointIndices::Ptr points_to_remove (new pcl::PointIndices ());
00079
00080
00081 double upper_angle_thresh = angle_deg_ / 180 * M_PI;
00082
00083
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;
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