template <typename PointInT, typename PointOutT> void pcl::SIFTKeypoint<PointInT, PointOutT>::detectKeypointsForOctave ( const PointCloudIn &input, KdTree &tree, float base_scale, int nr_scales_per_octave, PointCloudOut &output) { // Compute the difference of Gaussians (DoG) scale space std::vector<float> scales (nr_scales_per_octave + 3); for (int i_scale = 0; i_scale <= nr_scales_per_octave + 2; ++i_scale) { scales[i_scale] = base_scale * pow (2.0, (1.0 * i_scale - 1) / nr_scales_per_octave); } Eigen::MatrixXf diff_of_gauss; computeScaleSpace (input, tree, scales, diff_of_gauss); // Find extrema in the DoG scale space std::vector<int> extrema_indices, extrema_scales; findScaleSpaceExtrema (input, tree, diff_of_gauss, extrema_indices, extrema_scales); // Add keypoints to output for (size_t i_keypoint = 0; i_keypoint < extrema_indices.size (); ++i_keypoint) { PointOutT keypoint; const int &keypoint_index = extrema_indices[i_keypoint]; keypoint.x = input.points[keypoint_index].x; keypoint.y = input.points[keypoint_index].y; keypoint.z = input.points[keypoint_index].z; keypoint.scale = scales[extrema_scales[i_keypoint]]; output.points.push_back (keypoint); } }
template <typename PointInT, typename PointOutT> void pcl::SIFTKeypoint<PointInT, PointOutT>::detectKeypointsForOctave ( const PointCloudIn &input, KdTree &tree, float base_scale, int nr_scales_per_octave, PointCloudOut &output, pcl::PointIndices &indices) { // Compute the difference of Gaussians (DoG) scale space std::vector<float> scales (nr_scales_per_octave + 3); for (int i_scale = 0; i_scale <= nr_scales_per_octave + 2; ++i_scale) { scales[i_scale] = base_scale * powf (2.0f, (1.0f * static_cast<float> (i_scale) - 1.0f) / static_cast<float> (nr_scales_per_octave)); } Eigen::MatrixXf diff_of_gauss; computeScaleSpace (input, tree, scales, diff_of_gauss); // Find extrema in the DoG scale space std::vector<int> extrema_indices, extrema_scales; findScaleSpaceExtrema (input, tree, diff_of_gauss, extrema_indices, extrema_scales); output.points.reserve (output.points.size () + extrema_indices.size ()); indices.indices.reserve (indices.indices.size () + extrema_indices.size ()); // Save scale? if (scale_idx_ != -1) { // Add keypoints to output for (size_t i_keypoint = 0; i_keypoint < extrema_indices.size (); ++i_keypoint) { PointOutT keypoint; const int &keypoint_index = extrema_indices[i_keypoint]; keypoint.x = input.points[keypoint_index].x; keypoint.y = input.points[keypoint_index].y; keypoint.z = input.points[keypoint_index].z; memcpy (reinterpret_cast<char*> (&keypoint) + out_fields_[scale_idx_].offset, &scales[extrema_scales[i_keypoint]], sizeof (float)); output.points.push_back (keypoint); indices.indices.push_back (keypoint_index); } } else { // Add keypoints to output for (size_t i_keypoint = 0; i_keypoint < extrema_indices.size (); ++i_keypoint) { PointOutT keypoint; const int &keypoint_index = extrema_indices[i_keypoint]; keypoint.x = input.points[keypoint_index].x; keypoint.y = input.points[keypoint_index].y; keypoint.z = input.points[keypoint_index].z; output.points.push_back (keypoint); indices.indices.push_back (keypoint_index); } } }