《PCL Docs 案例详解》KeyPoint——SIFT 关键点提取

article/2025/9/10 8:39:42

SIFT 关键点提取

本节演示如何检测点云的SIFT 关键点。SIFT 即尺度不变特征变换(Scale-invariant feature transform,SIFT) ,最初用于图像处理领域的一种描述。这种描述具有尺度不变性,可以在图像中检测出关键点,是一种局部特征描述。

完整代码

#include <iostream>
#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>using namespace std;int main(int argc, char *argv[])
{pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_xyz (new pcl::PointCloud<pcl::PointXYZRGB>);pcl::io::loadPCDFile (argv[1], *cloud_xyz);const float min_scale = stof(argv[2]);   //string turn into digit       const int n_octaves = stof(argv[3]);            const int n_scales_per_octave = stof(argv[4]);  const float min_contrast = stof(argv[5]);       pcl::SIFTKeypoint<pcl::PointXYZRGB, pcl::PointWithScale> sift;//创建sift关键点检测对象pcl::PointCloud<pcl::PointWithScale> result;sift.setInputCloud(cloud_xyz);//设置输入点云pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZRGB> ());sift.setSearchMethod(tree);//创建一个空的kd树对象tree,并把它传递给sift检测对象sift.setScales(min_scale, n_octaves, n_scales_per_octave);//指定搜索关键点的尺度范围sift.setMinimumContrast(min_contrast);//设置限制关键点检测的阈值sift.compute(result);//执行sift关键点检测,保存结果在resultpcl::PointCloud<pcl::PointXYZ>::Ptr cloud_temp (new pcl::PointCloud<pcl::PointXYZ>);copyPointCloud(result, *cloud_temp);//将点类型pcl::PointWithScale的数据转换为点类型pcl::PointXYZ的数据//可视化输入点云和关键点pcl::visualization::PCLVisualizer viewer("Sift keypoint");viewer.setBackgroundColor( 255, 255, 255 );viewer.addPointCloud(cloud_xyz, "cloud");viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR,0,0,0,"cloud");viewer.addPointCloud(cloud_temp, "keypoints");viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 9, "keypoints");viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR,0,255,0,"keypoints");while(!viewer.wasStopped ()){viewer.spinOnce ();}return 0;}

1、setInputCloud

创建输入点云数据的存储容器,SIFT检测推荐使用pcl::PointXYZRGB类别,

pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_xyz (new pcl::PointCloud<pcl::PointXYZRGB>);
pcl::io::loadPCDFile (argv[1], *cloud_xyz);

2、setSIFTfeatures

1.创建SIFT算法估计实例pcl::SIFTKeypoint<x,x> sift
2.设置SIFT 关键点检测对象的相关参数sift.func()
将输入点云引导到算法实例的输入口sift.setInputCloud
sift.setSearchMethod建立一个基于RGB Point的 kdtree空对象,并将其搭载到SIFT算法实例上,作为快速检索的工具载体
setScale用于指定搜索尺度范
sift.setMinimumContrast设置检测下限

pcl::SIFTKeypoint<pcl::PointXYZRGB, pcl::PointWithScale> sift;//创建sift关键点检测对象
pcl::PointCloud<pcl::PointWithScale> result;//设置输出keypoint存储对象
sift.setInputCloud(cloud_xyz);//设置输入点云pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZRGB> ());
sift.setSearchMethod(tree);//创建一个空的kd树对象tree,并把它传递给sift检测对象
sift.setScales(min_scale, n_octaves, n_scales_per_octave);//指定搜索关键点的尺度范围
sift.setMinimumContrast(min_contrast);//设置限制关键点检测的阈值
sift.compute(result);//执行sift关键点检测,保存结果在result

3、GetSIFTkeypoint

将获得resultpcl::PointWithScale 转变为pcl::PointXYZ方便打印

pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_temp (new pcl::PointCloud<pcl::PointXYZ>);
copyPointCloud(result, *cloud_temp);//将点类型pcl::PointWithScale的数据转换为点类型pcl::PointXYZ的数据

4、Visualize PointCloud&Keypoint

//可视化输入点云和关键点
pcl::visualization::PCLVisualizer viewer("Sift keypoint");
viewer.setBackgroundColor( 255, 255, 255 );
viewer.addPointCloud(cloud_xyz, "cloud");
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR,0,0,0,"cloud");
//将keypoint存储对象输入时tag为keypoint格式
viewer.addPointCloud(cloud_temp, "keypoints");
viewer.setPointCloudRenderingProperties (pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 9, "keypoints");
viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_COLOR,0,255,0,"keypoints");

以下为执行结果
若输入cloud模板类型为PointXYZ,执行结果的SIFT特征点个数明显会少很多
在这里插入图片描述
在这里插入图片描述


http://chatgpt.dhexx.cn/article/3qjjfXXG.shtml

相关文章

OpenCV中KeyPoint类

https://blog.csdn.net/u010821666/article/details/52883580 Opencv中KeyPoint类中的默认构造函数如下&#xff1a; CV_WRAP KeyPoint() : pt(0,0), size(0), angle(-1), response(0), octave(0), class_id(-1) {} 现分析各项属性 pt(x,y):关键点的点坐标&#xff1b; si…

Anchor-free目标检测综述 -- Keypoint-based篇

早期目标检测研究以anchor-based为主&#xff0c;设定初始anchor&#xff0c;预测anchor的修正值&#xff0c;分为two-stage目标检测与one-stage目标检测&#xff0c;分别以Faster R-CNN和SSD作为代表。后来&#xff0c;有研究者觉得初始anchor的设定对准确率的影响很大&#x…

Opencv中特征点Keypoint的解读(特征点与坐标的相互转换)

Opencv中特征点Keypoint的解读 特征点的生成特征点到坐标的转换坐标到特征点的转换 在我们学习特征点检测时&#xff0c;使用特征点检测器&#xff0c;比如ORB和SIFT生成特征点(FAST和SURF好像已经申请专利&#xff0c;较新版本可能用不了)&#xff0c;通常生成的特征点形式是一…

COCO数据集Keypoint标注格式梳理和使用COCO-Annotator在自有数据集上进行标注

这里写自定义目录标题 COCO数据集Keypoint标注格式COCO数据集官网Keypoint Detection关键点检测统一数据格式Keypoint标注 使用COCO-Annotator标注自有数据集在Ubuntu 18.04上安装COCO-Annotator安装Docker和Docker-Compose安装COCO Annotator启动COCO Annotator使用COCO Annot…

OpenCV学习之KeyPoint

OpenCV中CV_EXPORTS类别KeyPoint与KeyPointsFilter头文件分析 用OpenCV一段时间了&#xff0c;说实话KeyPoint接触也算比较多&#xff0c;一直没有时间对其数据结构进行分析。今天打开源码对其keypoint.cpp文件进行简单分析一下&#xff1a;keypoint.cpp主要包含两个类KeyPoint…

ubuntu引导删除+win10引导修复

Windowsubuntu双系统&#xff0c;删除安装linux磁盘后没有删除其引导&#xff0c;删其引导的步骤为 使用快捷键winx&#xff0c;打开Windows PowerShell(管理员)(A)&#xff0c;依次输入如下命令&#xff1a; 打开diskpart diskpart 列出系统中所有的磁盘 list disk 选择…

win10+ubuntu18.04 双系统修复ubuntu启动引导

win10ubuntu18.04 双系统修复ubuntu启动引导 因为windows是不能引导linux的&#xff0c;而每次win10升级或恢复都会将linux的启动引导覆盖掉&#xff0c;导致无法进入linux, 所以一直就禁止了win10更新&#xff0e;这几天win10出了点小毛病&#xff0c;所以就狠下心来恢复了系…

ubuntu 双系统启动引导修复

1、 准备一个安装&#xff35;盘&#xff0c;插入电脑开机>选择U盘启动>选择试用Try ubuntu without install。 2、 进入系统后&#xff0c;用CtrlAltT快捷键打开终端&#xff0c;获取root权限&#xff0c;执行以下命令&#xff1a; sodu passwd sudo apt-get install s…

win10+ubuntu双系统,重装win10后修复ubuntu引导的方法

笔记本型号&#xff1a;联想拯救者Y7000P 2019版 操作系统&#xff1a;Windows 10Ubuntu 18.04 LTS 问题&#xff1a;重装系统后发现没办法进入到Ubuntu 解决办法&#xff1a; 首先&#xff0c;我们需要准备一个Ubuntu安装U盘&#xff0c;也就是我们之前进行Ubuntu系统安装…

Windows\Ubuntu修复UEFI引导

目录 1、修复Windows引导2、修复Ubuntu的引导 1、修复Windows引导 修复Windows的EFI引导需要使用到的工具为大白菜装机工具&#xff0c;官网是http://www.winbaicai.com/。使用大白菜制作好装机工具以后&#xff0c;重启选择U盘启动&#xff08;一定要选“UEFI&#xff1a;你的…

Ubuntu boot-repair系统修复引导

Ubuntu系统修复引导 笔记本上本来已经有了一个ubuntu和一个windows&#xff0c;但是那天作死&#xff0c;想要在移动固态硬盘上安装一个ubuntu&#xff0c;方便使用&#xff0c;结果装完了之后必须要将移动固态插在笔记本上&#xff0c;才能够正常引导。 上网查了半天&#xf…

ubuntu修复启动引导

1. 解决步骤&#xff1a; &#xff11;&#xff1a;准备一个安装&#xff35;盘&#xff0c;插入电脑&#xff0d;&#xff1e;开机&#xff0d;&#xff1e;选择试用Try ubuntu without install &#xff12;&#xff1a;打开终端(Open Terminal)&#xff0c;获取root权限…

双系统Ubuntu 引导修复(Boot Repair)

安装完双系统&#xff0c;如果在使用过程中不小心删除了Ubuntu引导向&#xff0c;则会导致开机后无法选择进入Ubuntu系统。或者当我们重装了windows系统后&#xff0c;也会发现原来的Ubuntu引导不见了&#xff0c;当出现这两种情况之一时&#xff0c;最好的解决办法不是重新把U…

Win10+Ubuntu双系统修复Ubuntu系统引导

这两天笔者安装win10ubuntu16.04双系统&#xff0c;因为网络上能找到大量的资料&#xff0c;安装过程此处就不多讲。因为笔者电脑是华硕主板&#xff0c;bios默认设置为安全启动&#xff0c;笔者猜测会阻止加载ubuntu引导&#xff0c;导致双系统不能随意引导。先不管那么多&…

Ubuntu20.04 引导修复(亲测有效)

我电脑装了win10Ubuntu20.04。 Ubuntu的引导因为某种原因被我删了。ESP分区下的文件夹也删除了。 然后就想着怎么把Ubuntu的引导给整回来。 在网上搜索大多有几种 1.通过boot-repair来修复&#xff0c;然而我试过还是不行&#xff0c;提示找不到esp分区&#xff0c;我明明有e…

ubuntu启动盘修复grub引导

提示&#xff1a;点击关注作者&#xff0c;以获取其他的最新消息推送。 文章目录 ubuntu启动盘修复grub引导1.准备1个清空的U盘做系统启动盘2.查找本机的启动选项3.进入Ubuntu试用系统并打开终端4.插入网线确保能够正常访问网络5.添加更新下载源6.安装boot-repair7.点击Recomme…

win+ubuntu系统引导修复

windowsubuntu系统引导修复 0 前言1 新建ESP分区并修复windows引导2 Ubuntu系统引导修复3 问题总结4 参考 0 前言 之前由于启动项中有一个多余的ubuntu引导&#xff0c;看着不顺眼想要删除&#xff0c;结果失败&#xff0c;最终格式化了整个EFI分区&#xff0c;导致win10和ubu…

Ubuntu引导修复/Ubuntu的暴力安装方法

Linux操作系统拥有很多Windows系统所无法比拟的优势&#xff0c;并且深受专业人士的喜爱。在Linux的众多发行版中&#xff0c;Ubuntu是十分受欢迎一款。然而&#xff0c;很多朋友却因为无法正常安装Ubuntu而难以继续往下学习。当然我知道&#xff0c;装虚拟机是一个很不错的选择…

Ubuntu引导修复

转载自&#xff1a;https://blog.csdn.net/u012260238/article/details/52713724 安装完双系统&#xff0c;如果在使用过程中不小心删除了Ubuntu引导向&#xff0c;则会导致开机后无法选择进入Ubuntu系统。或者当我们重装了windows系统后&#xff0c;也会发现原来的Ubuntu引导不…

Ubuntu20.04.3引导修复(Boot Repair)

Ubuntu20.04引导修复&#xff08;Boot Repair&#xff09; 最近Ubuntu20.04时&#xff0c;出现了无法进入系统的问题。 第一时间用再生龙将系统盘备份&#xff0c;然后找一个新盘还原&#xff0c;发现还原后的硬盘是可以正常进入系统的。 现在对出问题的硬盘进行修复&#x…