コード例 #1
0
ファイル: sift_keypoint.hpp プロジェクト: jonaswitt/nestk
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); 
  }
}
コード例 #2
0
ファイル: sift_keypoint.hpp プロジェクト: xionglingfeng/pcl
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);
    }
  }
}