基于SIFT的点云关键点提取

这篇博文主要介绍SIFT算法在提取点云图像关键点时的具体用法,转载于http://www.cnblogs.com/freshmen/p/4254573.html。

      尺度不变特征转换(Scale-invariant feature transform,SIFT)是David Lowe在1999年发表,2004年总结完善。其应用范围包括物体辨识,机器人地图感知与导航、3D模型建立、手势辨识、影像追踪和动作对比。此算法已经申请专利,专利拥有者属于英属哥伦比亚大学。SIFT算法在3D数据上的应用由Flint等在2007年实现。这里所讲的提取点云关键点的算法便是由Flint等人实现的SIFT3D算法。

      其实现代如下:  

// STL
#include <iostream>

// PCL
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/common/io.h>
#include <pcl/keypoints/sift_keypoint.h>
#include <pcl/features/normal_3d.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/console/time.h>

/* This examples shows how to estimate the SIFT points based on the 
 * z gradient of the 3D points than using the Intensity gradient as
 * usually used for SIFT keypoint estimation.
 */

namespace pcl
{
  template<>
    struct SIFTKeypointFieldSelector<PointXYZ>
    {
      inline float
      operator () (const PointXYZ &p) const
      {
    return p.z;
      }
    };
}

int
main(int, char** argv)
{
  std::string filename = argv[1];
  std::cout << "Reading " << filename << std::endl;
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_xyz (new pcl::PointCloud<pcl::PointXYZ>);
  if(pcl::io::loadPCDFile<pcl::PointXYZ> (filename, *cloud_xyz) == -1) // load the file
  {
    PCL_ERROR ("Couldn't read file");
    return -1;
  }
  std::cout << "points: " << cloud_xyz->points.size () <<std::endl;
  
  // Parameters for sift computation
  const float min_scale = 0.005f; //the standard deviation of the smallest scale in the scale space
  const int n_octaves = 6;//the number of octaves (i.e. doublings of scale) to compute
  const int n_scales_per_octave = 4;//the number of scales to compute within each octave
  const float min_contrast = 0.005f;//the minimum contrast required for detection
  
  pcl::console::TicToc time;
  time.tic();
  // Estimate the sift interest points using z values from xyz as the Intensity variants
  pcl::SIFTKeypoint<pcl::PointXYZ, pcl::PointWithScale> sift;
  pcl::PointCloud<pcl::PointWithScale> result;
  pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ> ());
  sift.setSearchMethod(tree);
  sift.setScales(min_scale, n_octaves, n_scales_per_octave);
  sift.setMinimumContrast(min_contrast);
  sift.setInputCloud(cloud_xyz);
  sift.compute(result);
  std::cout<<"Computing the SIFT points takes "<<time.toc()/1000<<"seconds"<<std::endl;
  std::cout << "No of SIFT points in the result are " << result.points.size () << std::endl;

  // Copying the pointwithscale to pointxyz so as visualize the cloud
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_temp (new pcl::PointCloud<pcl::PointXYZ>);
  copyPointCloud(result, *cloud_temp);
  std::cout << "SIFT points in the result are " << cloud_temp->points.size () << std::endl;
  // Visualization of keypoints along with the original cloud
  pcl::visualization::PCLVisualizer viewer("PCL Viewer");
  pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> keypoints_color_handler (cloud_temp, 0, 255, 0);
  pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> cloud_color_handler (cloud_xyz, 255, 0, 0);
  viewer.setBackgroundColor( 0.0, 0.0, 0.0 );
  viewer.addPointCloud(cloud_xyz, cloud_color_handler, "cloud");//add point cloud
  viewer.addPointCloud(cloud_temp, keypoints_color_handler, "keypoints");//add the keypoints 
  viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 7, "keypoints");
  
  while(!viewer.wasStopped ())
  {
    viewer.spinOnce ();
  }
  return 0;
}

点云配准是将两个或多个点云数据集对齐的过程,使它们在同一个坐标系下对齐。其中,SIFT(Scale-Invariant Feature Transform)和ICP(Iterative Closest Point)是常用的点云配准算法。 SIFT算法是一种基于特征的图像匹配算法,可以用于点云数据的特征提取和匹配。通过检测关键点和计算关键点的局部特征描述子,SIFT算法可以在不同尺度和旋转下保持特征不变性。在点云配准中,可以使用SIFT算法提取两个点云的特征点,并通过匹配这些特征点来获取初始的配准变换矩阵。 ICP算法是一种迭代最近点算法,用于将一个点云数据集与另一个点云数据集对齐。ICP通过找到两个点云之间的最佳对应点,并计算最小化它们之间距离的刚性变换矩阵,从而实现点云的配准。ICP算法通过迭代的方式不断优化配准结果,直到达到预设的停止条件。 综合使用SIFT和ICP可以实现更精确的点云配准。首先,使用SIFT算法提取特征点,并通过特征匹配获取初始的变换矩阵。然后,使用ICP算法迭代优化配准结果,通过最小化点云之间的距离来进一步调整变换矩阵,直到达到收敛条件。 值得注意的是,点云配准是一个复杂的问题,对于不同的应用场景和数据集可能需要选择不同的算法或调整算法参数。此外,还有其他的点云配准算法可供选择,如基于特征的描述子匹配算法、基于几何约束的配准算法等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值