PCL入门(四):octree简单使用

news2024/12/26 9:32:41

目录

        • 1. 八叉树(Octree)
        • 2. 简单使用

参考博客《三维点云数据的两种结构Kdtree和Octree》和《八叉树》

1. 八叉树(Octree)

在这里插入图片描述

只需要考虑三维情况下的八叉树的情况,如下

  1. 设置最大的递归深度;
  2. 找出场景的最大尺寸,并据此创建第一个立方体
  3. 若未到达最大递归深度,判断当前立方体是否完全空白,或者完全为目标包含,若满足,则该立方体停止分裂;若不满足,则将立方体进一步分割为8个子立方体;
  4. 对于每一个子立方体,返回步骤3。

2. 简单使用

代码主要参考双愚的代码

  • octree_search.cpp
#include <pcl/point_cloud.h>
#include <pcl/octree/octree.h>
#include <iostream>
#include <vector>
#include <ctime>

int main (int argc, char** argv)
{
	srand((unsigned int)time(NULL));
	
	// 创建点云
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	cloud->width = 1000;
	cloud->height = 1;
	cloud->points.resize(cloud->width * cloud->height);
	for (size_t i=0; i<cloud->points.size(); ++i)
	{
		cloud->points[i].x = 1024.0f * rand() / (RAND_MAX + 1.0f);
		cloud->points[i].y = 1024.0f * rand() / (RAND_MAX + 1.0f);
		cloud->points[i].z = 1024.0f * rand() / (RAND_MAX + 1.0f);
	}
	
	// 创建octree对象
	float resolution = 128.0f; // 八叉树中最小尺寸(分辨率)
	pcl::octree::OctreePointCloudSearch<pcl::PointXYZ> octree(resolution);
	octree.setInputCloud(cloud);
	octree.addPointsFromInputCloud();
	
	// 创建搜索点searchPoint
	pcl::PointXYZ searchPoint;
	searchPoint.x = 1024.0f * rand() / (RAND_MAX + 1.0f);
	searchPoint.y = 1024.0f * rand() / (RAND_MAX + 1.0f);
	searchPoint.z = 1024.0f * rand() / (RAND_MAX + 1.0f);
	std::cout << "Neighbors within voxel search at (" << searchPoint.x
                  << " " << searchPoint.y
                  << " " << searchPoint.z << ")"
                  << std::endl;

	// 任务一:给定搜索点searchPoint,输出该点所在体素内的其他点
	std::vector<int> pointIdxVec;
	if (octree.voxelSearch(searchPoint, pointIdxVec))
	{
		for (size_t i = 0; i < pointIdxVec.size(); ++i) 
		    std::cout << "    " << cloud->points[pointIdxVec[i]].x
		              << " " << cloud->points[pointIdxVec[i]].y
		              << " " << cloud->points[pointIdxVec[i]].z << std::endl;
	}
	
	// 任务二:给定搜索点searchPoint,输出离该点最近的10个点
	int K = 10;
	std::vector<int> pointIdxNKNSearch; // 10个点在点云中的index
	std::vector<float> pointNKNSquaredDistance; // 10个点
	std::cout << "K nearest neighbor search at (" << searchPoint.x
              << " " << searchPoint.y
              << " " << searchPoint.z
              << ") with K=" << K << std::endl;
        if (octree.nearestKSearch(searchPoint, K, pointIdxNKNSearch, pointNKNSquaredDistance) > 0)
        {
        	for (size_t i = 0; i < pointIdxNKNSearch.size(); ++i)
		    std::cout << "    " << cloud->points[pointIdxNKNSearch[i]].x
		              << " " << cloud->points[pointIdxNKNSearch[i]].y
		              << " " << cloud->points[pointIdxNKNSearch[i]].z
		              << " (squared distance: " << pointNKNSquaredDistance[i] << ")" << std::endl;
        }
	
	// 任务三:给定搜索点searchPoint,输出该点一定半径内的所有其他点
	std::vector<int> pointIdxRadiusSearch;
	std::vector<float> pointRadiusSquaredDistance;
	float radius = 256.0f * rand() / (RAND_MAX + 1.0f);
	std::cout << "Neighbors within radius search at (" << searchPoint.x
              << " " << searchPoint.y
              << " " << searchPoint.z
              << ") with radius=" << radius << std::endl;
        if (octree.radiusSearch(searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0)
        {
        	for (size_t i = 0; i < pointIdxRadiusSearch.size(); ++i)
		    std::cout << "    " << cloud->points[pointIdxRadiusSearch[i]].x
		              << " " << cloud->points[pointIdxRadiusSearch[i]].y
		              << " " << cloud->points[pointIdxRadiusSearch[i]].z
		              << " (squared distance: " << pointRadiusSquaredDistance[i] << ")" << std::endl;
        }
}
  • CMakeLists.txt
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

project(cloud_viewer)

find_package(PCL 1.2 REQUIRED)

add_executable(octree octree.cpp)
target_link_libraries(octree ${PCL_LIBRARIES})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1002218.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux安装jdk1.8

1.下载jdk安装包&#xff1a; https://www.oracle.com/cn/java/technologies/downloads/#java8-windows 2.创建java文件夹&#xff1a; mkdir /usr/local/java3.上传安装包并解压&#xff1a; tar -xzf jdk-xxx.tar.gz4.修改profile文件&#xff1a; vim /etc/profile在文…

计算机专业毕业设计项目推荐04-物业管理系统(SpringBoot+原生Js+Mysql)

物业管理系统&#xff08;SpringBoot原生JsMysql&#xff09; **介绍****系统总体开发情况-功能模块****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设计…

物联网 低功耗蓝牙BLE GATT 实现微信小程序通信连接详细教程

蓝牙基本概念 蓝牙技术是一种无线通信的方式&#xff0c;利用特定频率的波段&#xff08;2.4GHz ~ 2.485GHz左右&#xff09;&#xff0c;进行电磁波传输。蓝牙传输原理是主从关系&#xff0c;一个主设备可以与7个蓝牙从设备配对。 经典蓝牙 vs BLE 蓝牙分为经典蓝牙和低功耗…

最新软件测试面试题+笔试题(十个面试官里有九个会问)

2023最新软件测试面试大全看完offer拿到手软_哔哩哔哩_bilibili2023最新软件测试面试大全看完offer拿到手软共计21条视频&#xff0c;包括&#xff1a;1.HR已读不回问题分析以及如何解决、2.HR已读不回之针对性进行简历优化。、3.HR已读不回之针对性进行技能提升路线。等&#…

编程语言流行度排名(每月更新)

2023年09月编程语言流行度排名 编程语言流行度排名是通过分析在谷歌上搜索语言教程的频率而创建的 一门语言教程被搜索的次数越多&#xff0c;大家就会认为该语言越受欢迎。这是一个领先指标。原始数据来自谷歌Trends 如果您相信集体智慧&#xff0c;那么流行编程语言排名可以…

数据结构与算法之二叉树、二叉搜索树、平衡二叉树、红黑树、B - 树、哈夫曼树等详细教程(更新中)

第一章、二叉树概述和基本算法 1.1 二叉树遍历算法概述 对于二叉树&#xff0c;其实遍历顺序一共有6种&#xff0c;基于有左子树&#xff0c;右子树&#xff0c;根这三个因素&#xff0c;即排列组合有3 * 2 * 16种结合顺序&#xff0c;不过因为算法思想是一样的&#xff0c;就…

day 4

#!/bin/bashfunction adda() { #a($*)sum0 for i in $*do ((sumi))donereturn $sum }arr(5 4 3 2 1 50) adda ${arr[*]} add$? echo $addfunction A() { echo id -uecho id -g }BA echo "uid和gid分别是:"$Bxmind

基于springboot2+mybatis-plus+jsp增删改查

概述 编写简单增删改查&#xff0c;理解之后可以自己试着扩展&#xff0c;相信你也可以&#xff0c;加油&#xff0c;我自己懂了的用注释记在下面方便理解 详细 一、需求&#xff08;要做什么&#xff09; 基于现今最流行的技术实现增删改查demo&#xff0c; 便于初学者上手…

JAVAEE初阶相关内容第八弹--多线程(初阶)

本文目录 阻塞队列 阻塞队列是什么&#xff1f; 标准库中的阻塞队列 生产者消费者模型 阻塞队列的实现 普通队列实现&#xff1a; 入队列&#xff1a; 出队列&#xff1a; 完整代码&#xff1a; 加阻塞 加锁 加阻塞 阻塞队列 队列&#xff1a;先进先出&#xff0c;…

福立转债,科数转债上市价格预测

福立转债118043 基本信息 转债名称&#xff1a;福立转债&#xff0c;评级&#xff1a;AA-&#xff0c;发行规模&#xff1a;7.0亿元。 正股名称&#xff1a;福立旺&#xff0c;今日收盘价&#xff1a;20.07元&#xff0c;转股价格&#xff1a;21.28元。 当前转股价值 转债面值…

Java—JDK8新特性—重复注解

目录 重复注解是什么&#xff1f; 常见的重复注解的应用场景 源码&#xff08;JDK中哪里&#xff1f;&#xff09; 在实际开发中哪里使用了注解&#xff08;举例&#xff09; 使用步骤 案例 重复注解是什么&#xff1f; 重复注解&#xff0c;一个注解可以在一个类、方法、…

限流式保护器在古建筑消防安全中的应用

安科瑞 华楠 【摘要】我国古建筑众多且具有自身的消防安全特性。本文结合当前古建筑消防安全形势从消防管理、防火设计及火灾扑救三个方面对我国古建筑消防安全问题进行系统的阐述并提出相关对策。 【关键词】古建筑&#xff1b;消防安全&#xff1b;电气防火&#xff1b;限流…

C++ String类的简单实现(非模板)

头文件 #ifndef MY_STRING_H #define MY_STRING_Hclass Mstring {private:int m_length;char* m_pointer;public://构造函数Mstring();//有参构造Mstring(const char* str);//拷贝构造Mstring(const Mstring& obj);//获取长度int length()const;//转换为C字符串const char…

sprinboot 引入 Elasticsearch 依赖包

1.springboot与es的版本有比较强的绑定关系&#xff0c;如果springboot工程引入es的依赖后报一些依赖的错误&#xff0c;那么就看表格中的对应关系&#xff0c;将sprinboot或者es的版本做对应的调整 2.本人是从springboot1.x升级到springboot2.x&#xff0c;做了排包工作 3.升级…

在海外如何通过App Store本地化提高下载量

随着应用市场的应用持续增长&#xff0c;越来越多的应用和游戏占据了全球排行榜的主导地位。因此本地化应用程序商店的展示&#xff0c;对于吸引更多用户并在当今的市场中竞争至关重要。应用程序本地化不仅仅包括简单的翻译&#xff0c;还需要处理内容本身。 1、针对客户使用的…

HummerRisk V1.4.1 发布

HummerRisk V1.4.1发布&#xff1a; 大家好&#xff0c;增加检测整合报告下载&#xff0c;定制多云整合报告并下载PDF&#xff0c;增加K8s 检测规则组&#xff0c;Kubernetes、Rancher、KubeSphere 检测规则组以及规则。新增云账号管理页面关联菜单&#xff0c;新增资源同步日…

C++QT day4

仿照string类&#xff0c;完成myString类 #include <iostream> #include <cstring> using namespace std; class myString {private:char *str; //记录c风格的字符串int size; //记录字符串的实际长度public://无参构造myString():size(10){s…

【力扣每日一题】2023.9.11 课程表Ⅲ

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 今天是和前两天一样课程表&#xff0c;不过今天不太一样了&#xff0c;今天不是图论了&#xff0c;可以看作是全新的题目。 给我们一个课…

Java——选择语句

if语句 语法格式&#xff1a; if(表达式){若干语句 } 例&#xff1a; ​import java.util.Scanner; public class Test1 {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();if(n%20){System.out.println("even");}…

Linux命令200例:write用于向特定用户或特定终端发送信息

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0…