PCL vtk 计算点云的体积和表面积

news2024/9/22 10:03:39

一、CC中计算体积和表面积 

 二、PCL中计算体积和表面积

 vtkMassProperties  来计算体积和表面积,但是必须是三角化的模型,不能是多边形的模型

vtkTriangleFilter如果是其他模型的就转换为三角化的模型


// 计算点云的体积和表面积
// 输入的不能是点云,只能是三角化之后的点云模型
int  vtkCalc_Area_Volume(pcl::PolygonMesh  &model, float surface_area, float volume)
{
	vtkSmartPointer<vtkPLYReader> reader = vtkSmartPointer<vtkPLYReader>::New();

	// mesh  ply 格式的模型
	reader->SetFileName("C:\\Users\\Albert\\Desktop\\Halcon2PCL\\bundy.ply");
	reader->Update();

	// 三角化, vtkMassProperties 这个只能计算三角化的模型
	vtkSmartPointer<vtkTriangleFilter> triangle = vtkSmartPointer<vtkTriangleFilter>::New();
	triangle->SetInputData(reader->GetOutput());
	triangle->Update();
	//  vtkMassProperties  来计算体积和表面积
	vtkSmartPointer<vtkMassProperties>  ploy = vtkSmartPointer<vtkMassProperties>::New();
	ploy->SetInputData(triangle->GetOutput());
	ploy->Update();

	  volume = ploy->GetVolume();//  体积

	  // 计算三角形的面积 并求和
	  surface_area = ploy->GetSurfaceArea(); // 表面积

	  cout << "体积: "<< volume << endl;
	  cout << "面积: " << surface_area << endl;
	  double maxArea = ploy->GetMaxCellArea();//最大单元面积
	  double minArea = ploy->GetMinCellArea();//最小单元面积
	  cout << "单元最大面积:   " << maxArea << endl;
	  cout << "单元最小面积:   " << minArea << endl;
	return 0;
}

 

三、vtk 切片法求体积

// 平面切点云模型并求体积
int vtk_Plane_Cut_Model_Volume(std::string stlfile, double &spacing, double &vol)
{
	vtkSmartPointer<vtkPLYReader> reader = vtkSmartPointer<vtkPLYReader>::New();
	reader->SetFileName(stlfile.c_str());  // 读入模型
	reader->Update();

	vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New();
	polyData = reader->GetOutput();


	// 设定平面模型
	vtkSmartPointer<vtkPlane> plane = vtkSmartPointer<vtkPlane>::New();
	//设置切割平面起点
	plane->SetOrigin(polyData->GetCenter());
	cout << "切割平面起点" << plane << endl;
	//设置切割方向为X方向,其实设置Y 方向也可以,只是这里的参数这设置的好的话会减少切的次数
	plane->SetNormal(1, 0, 0);


	// 拿到输入的最小\大坐标
	double min_bound[3], max_bound[3];
	min_bound[0] = polyData->GetBounds()[0];
	min_bound[1] = polyData->GetBounds()[2];
	min_bound[2] = polyData->GetBounds()[4];


	max_bound[0] = polyData->GetBounds()[1];
	max_bound[1] = polyData->GetBounds()[3];
	max_bound[2] = polyData->GetBounds()[5];


	// 拿到点云模型的质心
	double  center[3];
	center[0] = polyData->GetCenter()[0];
	center[1] = polyData->GetCenter()[1];
	center[2] = polyData->GetCenter()[2];
	std::cout << "  中心点:" << center[0] << "," << center[1] << "," << center[2] << endl;
	

	// 计算极值点到中心点的距离
	Eigen::Vector3d  min(min_bound);
	Eigen::Vector3d  max(max_bound);
	Eigen::Vector3d  center_v(center);
	double  dist_min_center  = (min - center_v).norm();
	double  dist_max_center = (max - center_v).norm();
	cout << "距离:      "<< dist_min_center<<"           "<< dist_max_center << endl;

	// 计算切片的次数
	int  number = (int)(dist_min_center + dist_max_center) / spacing;
	vtkSmartPointer<vtkCutter> cutter = vtkSmartPointer<vtkCutter>::New();
	 // 设置切割平面
	cutter->SetCutFunction(plane);
	// 输入切割的模型
	cutter->SetInputData(polyData);
	// 设置切片的范围
	cutter->GenerateValues(number,-dist_min_center, dist_max_center);
	cutter->Update();

	std::cout << "  切片个数:" << number << "     切片间距:     " << (dist_min_center + dist_max_center) / (number - 1) << endl;
	// 
	vtkSmartPointer<vtkStripper> cut_Stripper = vtkSmartPointer<vtkStripper>::New();
	cut_Stripper->SetInputConnection(cutter->GetOutputPort());
	cut_Stripper->Update();



	vtkSmartPointer<vtkPolyData> cutPolyData = vtkSmartPointer<vtkPolyData>::New();
	cutPolyData->SetPoints(cut_Stripper->GetOutput()->GetPoints());
	cutPolyData->SetPolys(cut_Stripper->GetOutput()->GetLines());

	//三角化
	vtkSmartPointer<vtkTriangleFilter> cutTriangles = vtkSmartPointer<vtkTriangleFilter>::New();
	cutTriangles->SetInputData(cutPolyData);
	cutTriangles->Update();


	//  计算体积和面积
	vtkSmartPointer<vtkMassProperties> mass = vtkSmartPointer<vtkMassProperties>::New();
	mass->SetInputData(cutTriangles->GetOutput());

	cout << mass->GetSurfaceArea() << endl;
	 vol = (dist_min_center + dist_max_center) / (number - 1)  * mass->GetSurfaceArea();

	return 0;
}

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

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

相关文章

限时等待

如果一个线程要等待的线程的目标没有实现&#xff0c;那么他会一直等下去&#xff0c;此时就陷入了阻塞等待。 还有一种等待状态叫做延时等待&#xff0c;如果如果我去吃饭&#xff0c;但是饭店已经客满&#xff0c;需要排号&#xff0c;当排到我号时&#xff0c;饭店会叫我&am…

持续挖掘助力创新,亚马逊云科技全新开启“创业加速器”第一期招募

就像人从婴儿开始成长&#xff0c;参天大树从嫩芽开始成长一样&#xff0c;所有成功的企业都是从几个人、初创团队起步发展的。例如&#xff0c;当今全球云计算的 Top 巨头亚马逊云科技&#xff0c;就是从亚马逊内部孵化出来的创业团队&#xff0c;亚马逊现任 CEO Andy Jassy&a…

查看windows上的dll内容

1、安装Visual Studio时选择c桌面开发和通用Windows平台开发 2、cmd运行在Visual Studio安装路径下的VC\Auxiliary\Build\vcvars64.bat 3、在这个窗口中运行dumpbin

【从零开始学习JAVA | 第二十七篇】JAVA期末练习(PTA)

目录 前言&#xff1a; R7-5 Count the letters in a string &#xff08;统计字符串中的字符&#xff09; R7-1 找素数 R7-3 电话号码同步&#xff08;Java&#xff09; 总结&#xff1a; 前言&#xff1a; 临近期末&#xff0c;我也更新一下PTA上的JAVA大题&#xff0c;希望…

TensorFlow项目练手(二)——猫狗熊猫的分类任务

项目介绍 通过猫狗熊猫图片来对图片进行识别&#xff0c;分类出猫狗熊猫的概率&#xff0c;文章会分成两部分&#xff0c;从基础网络模型->利用卷积网络经典模型Vgg。 基础网络模型 基础的网络模型主要是用全连接层来分类&#xff0c;比较经典的方法&#xff0c;也是祖先…

(c语言)给定两个数,求这两个数的最大公约数

目录 方法一 方法二&#xff1a;辗转相除法 方法一 找出两个数中的较小值&#xff0c;从较小值减至两个数%这个数0即可。 //给定两个数&#xff0c;求这两个数的最大公约数 #include <stdio.h>int main() {int a 0;int b 0;scanf("%d %d", &a, &…

【力扣】145、二叉树的后序遍历

145、二叉树的后序遍历 注&#xff1a;二叉树的后序遍历&#xff1a;左右根&#xff1b; // 递归 var postorderTraversal function (root){const arr [];//新建一个数组&#xff1b;const fun (node) >{if(node){fun(node.left);fun(node.right);arr.push(node.val)}}f…

STM32单片机蓝牙APP自动量程万用表电流电压电阻表LCD1602

实践制作DIY- GC0149---蓝牙APP自动量程万用表 基于STM32单片机设计---蓝牙APP自动量程万用表 二、功能介绍&#xff1a; STM32F103C系列最小系统板LCD1602显示器模拟开关信号选择电路电压采集电路电流测量电路&#xff08;康铜丝采样&#xff09;电阻测量电路1个黑色公共端子…

html掉落本地图片效果

实现一个加载本地图片并掉落的html页面。 说明 将DuanWu.html与zongzi_1.png, zongzi_2.png, zongzi_3.png, yadan.png4张图片放在同一个目录下&#xff0c;然后双击打开DuanWu.html即可。 使用Chrome或Microsoft Edge浏览器打开 若使用IE浏览器打开&#xff0c;下方会出现In…

Java框架之springboot starter

写在前面 本文一起看下springboot starter相关的内容。 1&#xff1a;官方提供的starter 在spring-boot-autocongure包中定义了官方提供的一百多个starter&#xff0c;如下&#xff1a; 2&#xff1a;框架是如何定义starter的&#xff1f; 因为springboot的普及度逐步提高&…

Unity Sponza(斯蓬扎宫)场景-BuildIn-URP-HDRP

Sponza&#xff08;斯蓬扎宫&#xff09;场景 &#x1f354;URP &#x1f354;URP 资源下载

Linux: hang: 线程太多,导致的一个例子

今天遇到了一个Linux系统hang住的情况&#xff0c;从vmcore里看bt&#xff0c;没有看到明显的crash、lockup等信息&#xff1b; 而且从vmcore里也不能看具体的当时CPU事情情况。 不过还是怀疑&#xff0c;是因为线程太多&#xff0c;导致资源占用比较严重&#xff0c;从而导致一…

GeForce RTX 40系列显卡哪个更好?这个避坑测评攻略快收下

自2022年底以来&#xff0c;Nvidia一直在推出基于Ada Lovelace架构的GeForce RTX 40系列消费级GPU&#xff0c;旨在取代之前基于Ampere架构的GeForce RTX 30系列和基于Turing架构的GeForce RTX 20系列。 Nvidia称其RTX 40系列GPU的性能比前代产品有了显着提升&#xff0c;许多…

写给新手程序员的一封信

为什么写这篇文章 我是一名毕业四年的后端开发&#xff08;可能会很多人来说&#xff0c;工作时间也没多长嘛&#xff09;&#xff0c;但是在这四年里&#xff0c;我写过PHP、Go、vue、做了两年多的敏捷团队管理&#xff0c;也设计过一些系统的架构。也算是有着相对较丰富的项…

数据结构-手撕单链表+代码详解

⭐️ 往期相关文章 ✨ 链接1&#xff1a;数据结构-手撕顺序表(动态版)代码详解 ✨ 链接2&#xff1a;数据结构和算法的概念以及时间复杂度空间复杂度详解 ⭐️ 链表 &#x1f320; 什么是链表&#xff1f; 链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据…

OPLS-DA分析,组间差异 图形详解

OPLS-DA分析&#xff0c;组间差异 在上一场小工具讲解中&#xff0c;小姐姐给大家介绍了PLS-DA的原理及用途&#xff0c;而在代谢组学数据分析中&#xff0c;除去PLS-DA以外&#xff0c;OPLS-DA分析也是非常常见的&#xff0c;仅一个字母之差&#xff0c;那二者到底有何差别&am…

HTML select 用法及常用事件

前言 用于记录开发中常用到的&#xff0c;快捷开发 简单实例 <select><option value"volvo">Volvo</option><option value"saab">Saab</option><option value"mercedes">Mercedes</option><opt…

【WSN定位】基于浣熊优化算法的多通信半径和跳距加权Dvhop定位算法【Matlab代码#46】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. Dvhop定位算法2. 原始浣熊优化算法2.1 开发阶段2.2 探索阶段 3. 多通信半径和跳距加权策略3.1 多通信半径策略3.2 跳距加权策略 4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他…

超细,设计一个“完美“的测试用例,用户登录模块实例...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 好的测试用例一定…

ad18学习笔记七:drc检查在线和批量的区别

Altium Designer 22 DRC规则检查解析 - 哔哩哔哩 硬件工程师基本功&#xff1a;DRC设置要点详解-凡亿课堂 AD中PCB检查设计错误规则设置&#xff08;DRC检查配置&#xff09;_ad怎么检查pcb有没有错误_没有价值的生命的博客-CSDN博客 Altium Designer之DRC检查学习笔记_ad d…