40 #ifndef PCL_SEARCH_ORGANIZED_NEIGHBOR_SEARCH_H_
41 #define PCL_SEARCH_ORGANIZED_NEIGHBOR_SEARCH_H_
60 template<
typename Po
intT>
72 typedef boost::shared_ptr<pcl::search::OrganizedNeighbor<PointT> >
Ptr;
73 typedef boost::shared_ptr<const pcl::search::OrganizedNeighbor<PointT> >
ConstPtr;
87 OrganizedNeighbor (
bool sorted_results =
false,
float eps = 1e-4f,
unsigned pyramid_level = 5)
89 , projection_matrix_ (Eigen::Matrix<float, 3, 4, Eigen::RowMajor>::Zero ())
90 , KR_ (Eigen::Matrix<float, 3, 3, Eigen::RowMajor>::Zero ())
91 , KR_KRT_ (Eigen::Matrix<float, 3, 3, Eigen::RowMajor>::Zero ())
93 , pyramid_level_ (pyramid_level)
112 float min_f = 0.043744332f *
static_cast<float>(input_->width);
114 return (determinant3x3Matrix<Eigen::Matrix3f> (KR_ /
sqrt (KR_KRT_.coeff (8))) >= (min_f * min_f));
132 mask_.resize (input_->size ());
136 if (indices_.get () != NULL && indices_->size () != 0)
138 mask_.assign (input_->size (), 0);
139 for (std::vector<int>::const_iterator iIt = indices_->begin (); iIt != indices_->end (); ++iIt)
143 mask_.assign (input_->size (), 1);
161 std::vector<int> &k_indices,
162 std::vector<float> &k_sqr_distances,
163 unsigned int max_nn = 0)
const;
181 std::vector<int> &k_indices,
182 std::vector<float> &k_sqr_distances)
const;
195 Entry (
int idx,
float dist) : index (idx), distance (dist) {}
196 Entry () : index (0), distance (0) {}
201 operator < (
const Entry& other)
const
203 return (distance < other.distance);
215 testPoint (
const PointT& query,
unsigned k, std::priority_queue<Entry>& queue,
unsigned index)
const
217 const PointT& point = input_->points [index];
220 float squared_distance = (point.getVector3fMap () - query.getVector3fMap ()).squaredNorm ();
221 if (queue.size () < k)
222 queue.push (Entry (index, squared_distance));
223 else if (queue.top ().distance > squared_distance)
226 queue.push (Entry (index, squared_distance));
234 clipRange (
int& begin,
int &end,
int min,
int max)
const
236 begin = std::max (std::min (begin, max), min);
237 end = std::min (std::max (end, min), max);
249 getProjectedRadiusSearchBox (
const PointT& point,
float squared_radius,
unsigned& minX,
unsigned& minY,
250 unsigned& maxX,
unsigned& maxY)
const;
254 template <
typename MatrixType>
void
255 makeSymmetric (MatrixType& matrix,
bool use_upper_triangular =
true)
const;
258 Eigen::Matrix<float, 3, 4, Eigen::RowMajor> projection_matrix_;
261 Eigen::Matrix<float, 3, 3, Eigen::RowMajor> KR_;
264 Eigen::Matrix<float, 3, 3, Eigen::RowMajor> KR_KRT_;
270 const unsigned pyramid_level_;
273 std::vector<unsigned char> mask_;
275 EIGEN_MAKE_ALIGNED_OPERATOR_NEW