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

pcl中sift关键点提取算法如下

#include <pcl/registration/ia_ransac.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/features/normal_3d.h>
#include <pcl/features/fpfh.h>
#include <pcl/search/kdtree.h>
#include <pcl/io/pcd_io.h>
#include <pcl/filters/filter.h>
#include <pcl/registration/icp.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <time.h>
#include <pcl/common/io.h>
#include <iostream>
#include <pcl/keypoints/sift_keypoint.h>//关键点检测using pcl::NormalEstimation;
using pcl::search::KdTree;
typedef pcl::PointXYZ PointT;
typedef pcl::PointCloud<PointT> PointCloud;//点云可视化
void visualize_pcd(PointCloud::Ptr pcd_src,PointCloud::Ptr pcd_tgt)//PointCloud::Ptr pcd_final)
{pcl::visualization::PCLVisualizer viewer("registration Viewer");pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> src_h(pcd_src, 0, 255, 0);pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> tgt_h(pcd_tgt, 255, 0, 0);//pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> final_h(pcd_final, 0, 0, 255);viewer.setBackgroundColor(255, 255, 255);viewer.addPointCloud(pcd_src, src_h, "source cloud");viewer.addPointCloud(pcd_tgt, tgt_h, "tgt cloud");//viewer.addPointCloud(pcd_final, final_h, "final cloud");viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 7, "tgt cloud");while (!viewer.wasStopped()){viewer.spinOnce(100);boost::this_thread::sleep(boost::posix_time::microseconds(100000));}//pcl中sift特征需要返回强度信息,改为如下:
}
namespace pcl
{template<>struct SIFTKeypointFieldSelector<PointXYZ>{inline floatoperator () (const PointXYZ &p) const{return p.z;}};
}int
main(int argc, char** argv)
{//加载点云文件PointCloud::Ptr cloud_src_o(new PointCloud);//原点云,待配准pcl::io::loadPCDFile("E:/PointCloud/data/dragon/dragon.pcd", *cloud_src_o);cout << "原始点云数量:"<<cloud_src_o->size() << endl;//PointCloud::Ptr cloud_tgt_o(new PointCloud);//目标点云//pcl::io::loadPCDFile("E:/PointCloud/data/pc_4.pcd", *cloud_tgt_o);//clock_t start = clock();//去除NAN点//std::vector<int> indices_src; //保存去除的点的索引//pcl::removeNaNFromPointCloud(*cloud_src_o, *cloud_src_o, indices_src);//std::cout << "remove *cloud_src_o nan" << cloud_src_o->size()<<endl;//std::vector<int> indices_tgt;//pcl::removeNaNFromPointCloud(*cloud_tgt_o, *cloud_tgt_o, indices_tgt);//std::cout << "remove *cloud_tgt_o nan" << cloud_tgt_o->size()<<endl;//设定参数值const float min_scale = 0.002f; //the standard deviation of the smallest scale in the scale spaceconst int n_octaves = 3;//尺度空间层数,小、关键点多const int n_scales_per_octave = 3;//the number of scales to compute within each octaveconst float min_contrast = 0.0001f;//根据点云,设置大小,越小关键点越多//sift关键点检测pcl::SIFTKeypoint<pcl::PointXYZ, pcl::PointWithScale > sift_src;pcl::PointCloud<pcl::PointWithScale> result_src;pcl::search::KdTree<pcl::PointXYZ>::Ptr tree_src(new pcl::search::KdTree<pcl::PointXYZ>());sift_src.setSearchMethod(tree_src);sift_src.setScales(min_scale, n_octaves, n_scales_per_octave);sift_src.setMinimumContrast(min_contrast);sift_src.setInputCloud(cloud_src_o);sift_src.compute(result_src);clock_t end = clock();cout << "sift关键点提取时间" << (double)(end - start) / CLOCKS_PER_SEC << endl;cout << "sift关键点数量" << result_src.size() << endl;PointCloud::Ptr cloud_src(new PointCloud);pcl::copyPointCloud(result_src, *cloud_src);//可视化visualize_pcd(cloud_src_o, cloud_src);return (0);
}

效果图

实际中sift效果较慢。

pcl中ransac提取直线_SIFT关键点提取相关推荐

  1. PCL NARF关键点提取、SIFT关键点提取、Harris关键点提取

    一.NARF关键点提取 1.背景 关键点也称为兴趣点,是通过定义检测标准来获取的具有稳定性.区别性的点集.从技术上来说,关键点的数量要比原始点云的数目少很多,与局部特征描述子结合在一起,组成关键点描述 ...

  2. PCL中RANSAC模型的使用

    RANSAC算法是什么 RANSAC算法于1981年由Fischler和Bolles提出,全程是RANdom SAmple Consensus,一般中文翻译为"随机抽样一致性算法" ...

  3. pcl中ransac提取直线_复杂场景中的一个图像配准思路

    在很多时候,我们可能需要使用到图像的识别与配准工作,来判断某个特征或者是划出某个特定特征的位置.现在的深度学习已经能够比较好地解决这个问题,比如常见的YOLO,可以利用几行设定代码就能够划出所需要识别 ...

  4. pcl中ransac提取直线_多目标跟踪中的相机运动模型

    前言 之前的博客中我介绍了Kalman滤波器,这个算法被广泛用于多目标跟踪任务中的行人运动模型.然而实际场景中存在有很多相机运动,仅仅依赖行人运动模型是不够的.这次我主要介绍下相机运动模型,以对极几何 ...

  5. PCL中点云关键点提取

    PCL中点云关键点提取 1 关键点概念及相关算法 1.1 NARF关键点 1.2 Harris关键点 1.3 PCL中keypoints模块及类介绍 2 关键点入门级实例解析 2.1 如何从深度图像中 ...

  6. PCL:RANSAC算法拟合直线的两种实现方式

    pcl利用ransac实现直线拟合的方法 pcl::SampleConsensusModelLine pcl::SACSegmentation pcl::SampleConsensusModelLin ...

  7. PCL中3D点云特征描述与提取(三)

    PCL中3D点云特征描述与提取(三) 1 如何从一个深度图像中提取NARF特征 2 RoPs特征 2.1 理论基础 2.1.1 生物视觉认知学启示 2.1.2 局部参考坐标框架构建 2.1.3 RoP ...

  8. PCL点云处理与关键点提取

    关键点简介 关键点也称为兴趣点,它是 2D 图像或 3D 点云或曲面模型上,可以通过检测标准来获取的具有稳定性.区别性的点集.从技术上来说,关键点的数量比原始点云或图像的数据量少很多,其与局部特征描述 ...

  9. 利用PCL库从点云数据生成深度图像及关键点提取

    利用PCL库从点云数据生成生成深度图像及关键点提取 利用PCL库从点云数据生成深度图像及关键点提取 本想利用标准点云数据库分割成若干块,利用标准点云数据生成深度图像作为数据库用来验证算法,目前效果不是 ...

  10. 关键点提取:face_recognition、疲劳检测、人脸校准、人脸数据库

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 人脸识别功能实现的原理介绍与算法介绍 人脸识别:人脸数据集 A ...

最新文章

  1. CDN的原理及对SEO的影响
  2. php中的意外type字符串,关于php:解析错误:语法错误,意外’文本’(T_STRING),期待’,’或’;’...
  3. 2015 10月21日 工作计划与执行
  4. Scala入门到精通——第二十七节 Scala操纵XML
  5. 倒排索引原理_搜索引擎都在用的倒排索引——原理与实现
  6. 自己动手开发调试器 01
  7. 【ACM】nyoj_139_我排第几个_201308062046
  8. 程序员谈网络改变我们的生活
  9. 第5章 数据的共享与保护
  10. Java 面向对象:重写的理解
  11. mysql创建表有则删除_MySQL创建表和删除表
  12. Unity 随机生成中文名字
  13. Nature综述|整合组学分析护航健康,推动精准医学时代的到来!
  14. linux系统清理命令行,告诉你Ubuntu系统较全面清理的方法及命令
  15. 如何给女朋友解释什么是面向对象编程?
  16. 网络文件系统——上(samba,NFS,实现网络共享文件)
  17. 停止对初创企业的限制
  18. 【网络通信】【GNS3】Window10 下 GNS3 安装与配置
  19. 怎样用python定位别人在哪_python程序员教你用微信给对方定位!你说回家!却还在外面鬼混?...
  20. mac/windows下查看端口号占用情况以及杀死端口进程

热门文章

  1. 无人车业务中的视觉三维重建
  2. 小Q正在给一条长度为n的道路设计路灯安置方案。 为了让问题更简单,小Q把道路视为n个方格,需要照亮的地方用'.'表示, 不需要照亮的障碍物格子用'X'表示。
  3. 增强for循环 泛型
  4. wordpress模板
  5. Unity之UGUI初探—按钮动画
  6. ajax调用webService
  7. 智能优化算法:被囊群算法-附代码
  8. 【C++】判断指定元素是否在vector中的若干种方法小结
  9. arcgis缓冲区分析(结合案例)-国家边界缓冲区的建立
  10. 国内外网站服务器研究现状,国内地学科普网站现状研究