两点云求差集和交集

news2024/9/22 5:32:04

这里两点云的差集指从点云1中删除属于点云2的点得到的点集,并集指既属于点云1又属于点云2的点集。

两点云求差集

基于kd-tree搜索的方法较快速,当然也可以暴力搜索。思路如下:
step1 在点云2建立kd-tree,设置容忍误差(搜索半径)
step2 遍历点云1中的点,记录下到点云2中的点的距离小于搜索半径的点的索引
step3 方法一:将点云1中不在索引中的点保存下来作为结果点云3
方法二:直接对点云1操作,删除索引点
建议使用方法一,代码实现更简单,而且速度较快(erase操作会使迭代器位置改变,影响效率);除非要对原点云操作用方法二。

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/common/io.h>
#include <pcl/search/kdtree.h> 


int main(int argc, char** argv)
{
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2(new pcl::PointCloud<pcl::PointXYZ>);

	pcl::io::loadPCDFile("bunny1.pcd", *cloud1);
	pcl::io::loadPCDFile("bunny2.pcd", *cloud2);

	pcl::search::KdTree<pcl::PointXYZ>::Ptr kdtree(new pcl::search::KdTree<pcl::PointXYZ>);
	kdtree->setInputCloud(cloud2);

	std::vector<int> pointIdxRadiusSearch;
	std::vector<float> pointRadiusSquaredDistance;
	std::vector<int> indices;
	float radius = 0.0001;

	for (size_t i = 0; i < cloud1->size(); i++)
	{
		if (kdtree->radiusSearch(cloud1->points[i], radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0)
		{
			indices.push_back(i);
		}
	}

	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud3(new pcl::PointCloud<pcl::PointXYZ>);
	for (size_t i = 0; i < cloud1->size(); i++)
	{
		if (find(indices.begin(), indices.end(), i) == indices.end())
			cloud3->push_back(cloud1->points[i]);
	}

	//for (size_t i = 0; i < indices.size(); i++)
	//{
	//	cloud1->erase(cloud1->begin() + indices[i] - i);
	//}

	std::cout << "cloud1 has " << cloud1->size() << " points" << std::endl;
	std::cout << "cloud2 has " << cloud2->size() << " points" << std::endl;
	std::cout << "cloud3 has " << cloud3->size() << " points" << std::endl;
	pcl::io::savePCDFile("cloud3.pcd", *cloud3);

	system("pause");
	return 0;
}

两点云求并集

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/common/io.h>
#include <pcl/search/kdtree.h> 


int main(int argc, char** argv)
{
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2(new pcl::PointCloud<pcl::PointXYZ>);

	pcl::io::loadPCDFile("bunny1.pcd", *cloud1);
	pcl::io::loadPCDFile("bunny2.pcd", *cloud2);

	pcl::search::KdTree<pcl::PointXYZ>::Ptr kdtree(new pcl::search::KdTree<pcl::PointXYZ>);
	kdtree->setInputCloud(cloud2);

	std::vector<int> pointIdxRadiusSearch;
	std::vector<float> pointRadiusSquaredDistance;
	std::vector<int> indices;
	float radius = 0.0001;

	for (size_t i = 0; i < cloud1->size(); i++)
	{
		if (kdtree->radiusSearch(cloud1->points[i], radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0)
		{
			indices.push_back(i);
		}
	}

	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud3(new pcl::PointCloud<pcl::PointXYZ>);
	for (size_t i = 0; i < cloud1->size(); i++)
	{
		if (find(indices.begin(), indices.end(), i) != indices.end())
			cloud3->push_back(cloud1->points[i]);
	}

	std::cout << "cloud1 has " << cloud1->size() << " points" << std::endl;
	std::cout << "cloud2 has " << cloud2->size() << " points" << std::endl;
	std::cout << "cloud3 has " << cloud3->size() << " points" << std::endl;
	pcl::io::savePCDFile("cloud3.pcd", *cloud3);

	system("pause");
	return 0;
}

cloud1 (bunny.pcd裁掉耳朵)
在这里插入图片描述
cloud2 (bunny.pcd裁掉尾巴)
在这里插入图片描述

cloud1-cloud2
在这里插入图片描述

cloud1∩cloud2
在这里插入图片描述

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

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

相关文章

UI控件DevExpress WinForm新手指南——如何在应用启动时执行操作

DevExpress WinForm拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜任…

RESTful 接口设计

文章目录RESTful 接口设计1.获取所有员工列表2.增加一个员工3.更新员工4.删除员工5.查询单个员工RESTful 接口设计 1.获取所有员工列表 /*** 获取所有员工* 1. 请求路径--确认资源--员工--/employees* 2. 请求方法--get* 3. 请求参数--无* 4. 请求响应--多个员工--List<Em…

苹果iOS App Store上架操作流程

很多开发者在开发完iOS APP、进行内测后&#xff0c;下一步就面临上架App Store&#xff0c;不过也有很多同学对APP上架App Store的流程不太了解&#xff0c;下面我们来说一下iOS APP上架App Store的具体流程&#xff0c;如有未涉及到的部分&#xff0c;大家可以及时咨询&#…

基于微信小程序的学生购电系统设计与实现-计算机毕业设计源码+LW文档

小程序开发说明 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Mave…

服务端Skynet(二)——消息调度机制

服务端Skynet(二)——消息调度机制 文章目录服务端Skynet(二)——消息调度机制1、提前了解知识1.1、互斥锁&#xff08;mutex lock : **mut**ual **ex**clusion lock&#xff09;1.2、自旋锁&#xff08;spinlock&#xff09;1.3、读写锁&#xff08;readers–writer lock&…

最简单的git图解(多远程仓库)

上一节我们讲了git操作最基本的命令&#xff1a;最简单的git图解&#xff08;最基本命令&#xff09;_jerry_dyy的博客-CSDN博客 这一节我们来讲一下面对多个远程仓库的场景&#xff0c;应该如何来处理。 为什么要有多个远程仓库&#xff1f; 在企业内部开发团队开发过程中&a…

什么是CDN?CDN的技术原理是什么?

什么是CDN&#xff1f; CDN的全称是Content Delivery Network&#xff0c;中文名称“内容分发网络”。其主要原理是在现有网络中增加一层新的网络架构&#xff0c;将源站中的内容发布到不同的网络节点上&#xff0c;使用户可以就近获得所需的内容&#xff0c;从而提高用户访问…

【学习记录】镭神激光雷达与PC机的NTP同步

本文仅用于记录自己在实现镭神C32激光雷达和PC机进行NTP同步时的一些总结。 吐槽在先&#xff0c;镭神的文档写极其不完善&#xff0c;很多都只是提了一句&#xff0c;但并没有完整的说应该具体怎么做。前前后后折腾了三四天&#xff0c;在一知半解的官方技术支持和实验室大佬…

立创EDA仿真入门1 基本操作

立创EDA仿真入门1 基本操作一、进入EDA仿真环境二、画原理图1. 新建工程2. 绘制如下电路图三、仿真1. 运行仿真2. 导出波形图3. 查看仪表一、进入EDA仿真环境 网址&#xff1a; https://lceda.cn/ 进入EDA标准版&#xff0c;点击左上角切换到仿真模式。 二、画原理图 1. 新…

java毕业设计——基于java+Socket+sqlserver的办公自动化系统设计与实现(毕业论文+程序源码)——办公自动化系统

基于javaSocketsqlserver的办公自动化系统设计与实现&#xff08;毕业论文程序源码&#xff09; 大家好&#xff0c;今天给大家介绍基于javaSocketsqlserver的办公自动化系统设计与实现&#xff0c;文章末尾附有本毕业设计的论文和源码下载地址哦。 文章目录&#xff1a; 基于…

qemu创建linux虚拟机(亲测有效)

1&#xff0c;网桥的搭建 Bridge方式原理 Bridge方式即虚拟网桥的网络连接方式&#xff0c;是客户机和子网里面的机器能够互相通信。可以使虚拟机成为网络中具有独立IP的主机。 桥接网络&#xff08;也叫物理设备共享&#xff09;被用作把一个物理设备复制到一台虚拟机。网桥多…

【语义分割】数据增强方法(原图与标签同时扩增)

1、数据增强作用 避免过拟合 提升模型的鲁棒性 提高模型的泛化能力 避免样本不均衡的问题 2.、数据增强分类 可分为两类&#xff1a;在线增强和离线增强。这两者的区别在于离线增强是在训练前对数据集进行处理&#xff0c;往往能得到多倍的数据集&#xff0c;在线增强是在训练…

javaEE高阶---Spring 更简单的读取和存储对象

一 : 引言 经过前面的学习&#xff0c;我们已经可以实现基本的 Spring 读取和存储对象的操作了&#xff0c;但在操作的过程中我们发现读取和存储对象并没有想象中的那么“简单”&#xff0c;所以接下来我们要学习更加简单的操作 Bean 对象的方法 . 二 : 存储Bean对象 2.1 使…

【Hack The Box】windows练习-- Reel

HTB 学习笔记 【Hack The Box】windows练习-- Reel &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &#x1f3…

视频清晰度优化指南

一、背景介绍 随着移动互联网的深入发展&#xff0c;视频消费场景逐渐变成主流&#xff0c;早期由于手机硬件的限制问题&#xff0c;导致生产出来的视频画质、清晰度存在较大的问题&#xff0c;用户体验不太好&#xff0c;当时的网络也处于4G的发展阶段&#xff0c;网络的限制…

【Hack The Box】windows练习-- support

HTB 学习笔记 【Hack The Box】windows练习-- support &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &#x…

策略验证_买入口诀_双管齐下买进不怕

写在前面&#xff1a; 1. 本文中提到的“股票策略校验工具”的具体使用操作请查看该博文&#xff1b; 2. 文中知识内容来自书籍《同花顺炒股软件从入门到精通》 3. 本系列文章是用来学习技法&#xff0c;文中所得内容都仅仅只是作为演示功能使用 目录 解说 策略代码 结果 解…

【正点原子FPGA连载】 第一章 MPSoC简介 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第一章 MPSoC简介…

【Loadrunner】学习loadrunner——Controller与Analysis的使用(三)

文章目录1.controller的使用1.1.创建场景的方式1.2.页面的介绍1.3.场景的设置1.2.1.设置初始化1.2.2.设置启动机制1.2.3.设置性能测试脚本的执行时间1.2.4.设置虚拟用户推出机制1.3.场景的运行1.4.场景的运行方式1.4.1.按照场景的方式运行1.4.2.按照group运行2.analysis的使用2…

[数据结构] 图---图的邻接矩阵存储方式模拟实现,包括BFS广度优先遍历和DFS深度优先遍历(上)

图的邻接矩阵存储1&#xff09;邻接矩阵表示法相关概念实现基础框架Graph_matrix构造函数实现基础操作获取某一顶点的下标添加边打印邻接矩阵2&#xff09;BFS广度优先遍历3&#xff09;DFS深度优先遍历4&#xff09;最小生成树之克鲁斯卡尔算法5&#xff09;最小生成树之普里姆…