当前位置: 首页 > news >正文

艺术留学机构seo网站文章编辑软件

艺术留学机构,seo网站文章编辑软件,网站ul优化,中小企业名录目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 SIFT关键点检测 2.1.2 可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总(长期更新&#…

目录

一、概述

1.1原理

1.2实现步骤

1.3应用场景

二、代码实现

2.1关键函数

2.1.1 SIFT关键点检测

2.1.2 可视化函数

2.2完整代码

三、实现效果


PCL点云算法汇总及实战案例汇总的目录地址链接:

PCL点云算法与项目实战案例汇总(长期更新)


一、概述

        3D-SIFT关键点检测是SIFT算法在三维点云中的扩展应用。与二维图像的SIFT类似,它通过尺度空间的构建和局部特征检测来提取点云的关键点。在三维点云中,SIFT可以通过计算每个点在Z方向的梯度,找到具有几何显著特征的关键点,适用于物体识别、特征匹配、点云配准等应用场景。

1.1原理

        SIFT(Scale-Invariant Feature Transform)算法通过建立图像的尺度空间来提取关键点。在三维点云中,我们可以通过分析Z轴方向的变化(梯度)来检测点云的关键点。其核心步骤包括:

  1. 尺度空间构建:通过不同尺度的高斯核卷积,构造尺度空间,使得算法能够在不同的尺度下检测关键点。最小尺度通过参数 min_scale 设置,尺度空间的层数和每个层次的尺度数量由 n_octaves n_scales_per_octave 控制。
  2. 关键点检测:通过对尺度空间的极值点检测来提取关键点,极值点通过比较邻域点在不同尺度下的响应得到。为了减少检测到的无效点,需要设置最小对比度 min_contrast,以过滤掉噪声。
  3. 梯度估计:利用Z方向的变化,估计点云中每个点的局部梯度,作为响应值。Z轴梯度用于构建响应函数,并检测局部极值。

参数解释

  • min_scale:最小尺度,控制高斯核的最小标准差。
  • n_octaves:尺度空间的层数。
  • n_scales_per_octave:每个层次的尺度数量。
  • min_contrast:最小对比度,用于过滤掉低响应值的点。

1.2实现步骤

  1. 加载点云数据。
  2. 初始化SIFT关键点提取器,设置所需的参数(如尺度、对比度等)。
  3. 通过SIFT算法提取点云中的关键点,并将结果转换为标准的XYZ点云格式。
  4. 可视化原始点云和提取的SIFT关键点。

1.3应用场景

  1. 三维物体识别:通过SIFT提取点云的关键点进行特征匹配和物体识别。
  2. 点云配准:利用关键点信息对不同视角的点云进行精确对齐。
  3. 特征提取:用于三维重建、机器人导航等领域中的特征提取和环境感知。

二、代码实现

2.1关键函数

2.1.1 SIFT关键点检测

void extractSIFTKeypoints(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, pcl::PointCloud<pcl::PointWithScale>::Ptr keypoints)
{// 设置SIFT算法参数const float min_scale = 0.001f;           // 设置尺度空间中最小尺度的标准偏差          const int n_octaves = 3;                  // 设置尺度空间层数,越小则特征点越多           const int n_scales_per_octave = 15;       // 设置尺度空间中计算的尺度个数const float min_contrast = 0.0001f;       // 设置限制关键点检测的阈值   // 创建SIFT关键点检测对象pcl::SIFTKeypoint<pcl::PointXYZ, pcl::PointWithScale> sift;sift.setInputCloud(cloud);                // 设置输入点云pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ> ());sift.setSearchMethod(tree);               // 设置KdTree搜索sift.setScales(min_scale, n_octaves, n_scales_per_octave); // 设置尺度范围sift.setMinimumContrast(min_contrast);    // 设置最小对比度// 执行SIFT关键点检测sift.compute(*keypoints);
}

2.1.2 可视化函数

void visualizeSIFTKeypoints(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, pcl::PointCloud<pcl::PointXYZ>::Ptr keypoints)
{boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("SIFT Keypoints Viewer"));int v1(0), v2(0);viewer->createViewPort(0, 0.0, 0.5, 1.0, v1);viewer->setBackgroundColor(1.0, 1.0, 1.0, v1); // 设置白色背景viewer->addText("Original Point Cloud", 10, 10, "v1_text", v1);viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);viewer->setBackgroundColor(0.98, 0.98, 0.98, v2); // 设置灰色背景viewer->addText("SIFT Keypoints", 10, 10, "v2_text", v2);// 原始点云显示为绿色pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> original_color(cloud, 0, 255, 0);viewer->addPointCloud(cloud, original_color, "original_cloud", v1);// 关键点显示为红色pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> keypoints_color(keypoints, 255, 0, 0);viewer->addPointCloud(keypoints, keypoints_color, "keypoints_cloud", v2);// 设置点大小viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 5, "keypoints_cloud");// 添加坐标系viewer->addCoordinateSystem(1.0);while (!viewer->wasStopped()){viewer->spinOnce(100);boost::this_thread::sleep(boost::posix_time::microseconds(100000));}
}

2.2完整代码

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/keypoints/sift_keypoint.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/common/time.h>
#include <boost/thread/thread.hpp>// 基于Z梯度估计3D点云的SIFT关键点
namespace pcl
{template<>struct SIFTKeypointFieldSelector<PointXYZ>{inline floatoperator () (const PointXYZ& p) const{return p.z;}};
}// 提取SIFT关键点
void extractSIFTKeypoints(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, pcl::PointCloud<pcl::PointWithScale>::Ptr keypoints)
{const float min_scale = 0.001f;           // 设置尺度空间中最小尺度的标准偏差          const int n_octaves = 3;                  // 设置尺度空间层数,越小则特征点越多           const int n_scales_per_octave = 15;       // 设置尺度空间中计算的尺度个数const float min_contrast = 0.0001f;       // 设置限制关键点检测的阈值   // 创建SIFT关键点检测对象pcl::SIFTKeypoint<pcl::PointXYZ, pcl::PointWithScale> sift;sift.setInputCloud(cloud);                // 设置输入点云pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>());sift.setSearchMethod(tree);               // 设置KdTree搜索sift.setScales(min_scale, n_octaves, n_scales_per_octave); // 设置尺度范围sift.setMinimumContrast(min_contrast);    // 设置最小对比度// 执行SIFT关键点检测sift.compute(*keypoints);
}// 可视化SIFT关键点
void visualizeSIFTKeypoints(pcl::PointCloud<pcl::PointXYZ>::Ptr cloud, pcl::PointCloud<pcl::PointXYZ>::Ptr keypoints)
{boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("SIFT Keypoints Viewer"));int v1(0), v2(0);viewer->createViewPort(0, 0.0, 0.5, 1.0, v1);viewer->setBackgroundColor(1.0, 1.0, 1.0, v1); // 设置白色背景viewer->addText("Original Point Cloud", 10, 10, "v1_text", v1);viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);viewer->setBackgroundColor(0.98, 0.98, 0.98, v2); // 设置灰色背景viewer->addText("SIFT Keypoints", 10, 10, "v2_text", v2);// 原始点云显示为绿色pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> original_color(cloud, 0, 255, 0);viewer->addPointCloud(cloud, original_color, "original_cloud", v1);// 关键点显示为红色pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> keypoints_color(keypoints, 255, 0, 0);viewer->addPointCloud(keypoints, keypoints_color, "keypoints_cloud", v2);// 设置点大小viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "keypoints_cloud");// 添加坐标系viewer->addCoordinateSystem(0.1);while (!viewer->wasStopped()){viewer->spinOnce(100);boost::this_thread::sleep(boost::posix_time::microseconds(100000));}
}int main(int argc, char* argv[])
{pcl::StopWatch watch; // 计时器pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_xyz(new pcl::PointCloud<pcl::PointXYZ>);pcl::io::loadPCDFile("bunny.pcd", *cloud_xyz);// 提取SIFT关键点pcl::PointCloud<pcl::PointWithScale>::Ptr sift_keypoints(new pcl::PointCloud<pcl::PointWithScale>);extractSIFTKeypoints(cloud_xyz, sift_keypoints);// 将SIFT关键点转换为标准XYZ格式pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_temp(new pcl::PointCloud<pcl::PointXYZ>);pcl::copyPointCloud(*sift_keypoints, *cloud_temp);std::cout << "Extracted " << sift_keypoints->size() << " keypoints" << std::endl;std::cout << "SIFT关键点提取用时: " << watch.getTimeSeconds() << "秒" << std::endl;// 可视化输入点云和SIFT关键点visualizeSIFTKeypoints(cloud_xyz, cloud_temp);return 0;
}

三、实现效果

http://www.yayakq.cn/news/638380/

相关文章:

  • 青海省建设厅网站首页免费0代码开发平台
  • 网站设计网站建设网站制作银行网站建设方案视频
  • 西宁做网站公司wordpress 小程序
  • 网站打不开什么原因wordpress 最近访客
  • 《水利建设与管理》杂志社网站金山网站建设费用
  • 做灯箱到哪个网站找业务服装类电子商务网站建设报告
  • 做外贸需要哪些网站有哪些工业设计产品图
  • 如何发布网站到域名快速网络推广
  • 手机ui设计网站中国物流企业网
  • 建设网站提供资料的函专业团队建设实施方案
  • 邢台企业做网站报价小程序到哪里去找
  • 服务器网站备案找人做网站被骗
  • 建网站保定开发一个小程序大概要多少钱
  • 企业网站的分类网页制作与网站建设江西
  • 如何在后台做网站分页wordpress 群发邮件
  • 会员中心网站模板买公司 网站建设
  • 微信网站域名备案成功后怎么做wordpress做出影视网站
  • 佛山网站优化包年如何建立网站数据库连接
  • 怎么自己在家做网站手机免费建立网站吗
  • 百度不收录网站怎么办公司官网开发
  • 给网站添加代码长沙高校网站制作公司
  • 郑州网站建设排行榜微信软文范例大全100
  • 自己弄网站需要多少钱网站页面设计布局
  • 免费的海报模板网站成都时代装饰工程有限公司
  • 网站开发的一般步骤wordpress大学最新模板下载地址
  • 青岛网站建设哪里好赣州seo外包
  • 关于做情侣的网站的图片大全营销型网站解决方案
  • 郴州网站网络推广平台迪士尼网站是谁做的
  • 做网站推广维护需要学些什么湖州服装网站建设
  • 网址域名ip查询淮南网站优化公司