PCL安装以及CGAL构建三维凸包

news2024/11/24 4:06:00

基础理论专栏目录 - 知乎 (zhihu.com)

凸包问题——概述 - 知乎 (zhihu.com)

 

1、安装PCL

 安装pcl,我的是window10,vs2019。我安装的是1.13

win10系统下 VS2019点云库PCL1.12.0的安装与配置_windows 10使用pcl-CSDN博客

照着上述博客进行配置,再结合这个设置环境变量pcl1.8.0+vs2013环境配置(详细)_pcl:1.8.0 vs:2013 qt:5.9.0-CSDN博客 

 我对bat进行了修改,寻找lib文件,排除d.lib。旨在寻找release的lib

@echo off
(for %%I in (*.lib) do (
    echo %%I | findstr /i /c:"d.lib" >nul
    if errorlevel 1 echo %%I
)) >> release.txt

pause

我这边做了dll环境变量配置,但找不到dll,我就直接配置在项目的生成路径中了,然后就可以找到,不清楚啥原因,反正先学再说

测试代码

#include <pcl/visualization/cloud_viewer.h>
#include <iostream>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <iostream>
#include <pcl/filters/filter.h>
int user_data;

void
viewerOneOff(pcl::visualization::PCLVisualizer& viewer)
{
	viewer.setBackgroundColor(1.0, 0.5, 1.0);
	pcl::PointXYZ o;
	o.x = 1.0;
	o.y = 0;
	o.z = 0;
	viewer.addSphere(o, 0.25, "sphere", 0);
	std::cout << "i only run once" << std::endl;
}
void
viewerPsycho(pcl::visualization::PCLVisualizer& viewer)
{
	static unsigned count = 0;
	std::stringstream ss;
	ss << "Once per viewer loop: " << count++;
	viewer.removeShape("text", 0);
	viewer.addText(ss.str(), 200, 300, "text", 0);
	//FIXME: possible race condition here:
	user_data++;
}
int
main()
{
	pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGBA>);
	pcl::io::loadPCDFile("test_cloud.pcd", *cloud);
	pcl::visualization::CloudViewer viewer("Cloud Viewer");

	//blocks until the cloud is actually rendered
	viewer.showCloud(cloud);

	//use the following functions to get access to the underlying more advanced/powerful
	//PCLVisualizer

	//This will only get called once
	viewer.runOnVisualizationThreadOnce(viewerOneOff);

	//This will get called once per visualization iteration
	viewer.runOnVisualizationThread(viewerPsycho);

	while (!viewer.wasStopped())
	{
		std::cout << cloud->width << endl;
		std::cout << cloud->height << endl;
		//you can also do cool processing here
		//FIXME: Note that this is running in a separate thread from viewerPsycho
		//and you should guard against race conditions yourself...
		user_data++;
	}
	return 0;
}

 

2、三维凸包

用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边形,它能包含点集中所有的点。

 

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <CGAL/Exact_predicates_inexact_constructions_kernel.h>
#include <CGAL/Polyhedron_3.h>
#include <CGAL/convex_hull_3.h>

typedef CGAL::Exact_predicates_inexact_constructions_kernel Kernel;
typedef CGAL::Polyhedron_3<Kernel> Polyhedron_3;

int main() {
    // 加载三维PCD点云数据
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    if (pcl::io::loadPCDFile<pcl::PointXYZ>(R"(C:\chenqi\CGAL\MeshSimplification\data\chef.pcd)", *cloud) == -1) {
        PCL_ERROR("Could not read file\n");
        return -1;
    }

    // 转换为CGAL支持的格式
    std::vector<Kernel::Point_3> points;
    for (const auto& point : cloud->points) {
        points.push_back(Kernel::Point_3(point.x, point.y, point.z));
    }

    // 计算三维凸包
    Polyhedron_3 poly;
    CGAL::convex_hull_3(points.begin(), points.end(), poly);

    // 输出凸包的顶点数量
    std::cout << poly.size_of_vertices() << " points on the convex hull" << std::endl;

    // 打开文件用于写入
    std::ofstream out_file(R"(C:\chenqi\CGAL\MeshSimplification\data\chef.xyz)");
    if (!out_file) {
        std::cerr << "Failed to open output file." << std::endl;
        return -1;
    }

    // 遍历Polyhedron_3中的每个顶点
    for (Polyhedron_3::Vertex_const_iterator it = poly.vertices_begin(); it != poly.vertices_end(); ++it) {
        // 获取当前顶点的坐标
        Kernel::Point_3 p = it->point();
        // 将顶点坐标写入文件
        out_file << p.x() << " " << p.y() << " " << p.z() << std::endl;
    }

    // 关闭文件
    out_file.close();

    std::cout << "Convex hull vertices saved to 'convex_hull_vertices.xyz'" << std::endl;

    return 0;
}

 

CGAL 二维点集的凸包提取_二维凸包提取-CSDN博客

CGAL 快速构建三维凸包_bcn三元凸包图-CSDN博客

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

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

相关文章

LeAPI 后端接口开发 - 发布、下线接口

一、上线接口&#xff08;仅管理员&#xff09; 1. 校验请求参数 2. 判断&#xff08;测试&#xff09;接口是否可以调用 引入调用接口的客户端&#xff08;自己写的 SDK&#xff09;注入客户端实例调用接口 3. 修改数据库中接口的状态 /*** 上线&#xff08;发布&#xff…

070:vue中provide、inject的使用方法(图文示例)

第070个 查看专栏目录: VUE 本文章目录 示例背景示例效果图示例源代码父组件代码子组件代码孙组件代码 基本使用步骤 示例背景 本教程是介绍如何在vue中使用provide和inject。在 Vue 中&#xff0c;provide 和 inject 是用于实现祖先组件向后代组件传递数据的一种方式。 在这个…

Linux一些实用操作

学习笔记&#xff0c;记录以下课程中关于Linux的一些实用操作。黑马程序员新版Linux零基础快速入门到精通&#xff0c;全涵盖linux系统知识、常用软件环境部署、Shell脚本、云平台实践、大数据集群项目实战等_哔哩哔哩_bilibili 目录 1 各类小技巧&#xff08;快捷键&#xff…

计算机速成课Crash Course - 28. 计算机网络

今天继续计算机速成课Crash Course的系列讲解。 更多技术文章&#xff0c;全网首发公众号 “摸鱼IT” 锁定 -上午11点 - &#xff0c;感谢大家关注、转发、点赞&#xff01; 计算机速成课Crash Course - 28. 计算机网络 (qq.com) 28. 计算机网络 互联网太棒啦&#xff0c;键…

java05 数组

一 概念介绍 指的是一种容器&#xff0c;可以同来存储同种数据类型的多个值。 但是数组容器在存储数据的时候&#xff0c;需要结合隐式转换考虑。 比如&#xff1a; 定义了一个int类型的数组。那么boolean。double类型的数据是不能存到这个数组中的&#xff0c; 但是byte类…

Linux文本三剑客-sed

一、sed介绍&#xff1a; sed&#xff08;Stream Editor&#xff09;是一种流编辑器&#xff0c;用于对文本进行处理和转换。它可以从输入流中读取文本&#xff0c;并根据指定的规则进行编辑和替换。sed通常用于在命令行中进行文本处理&#xff0c;可以实现搜索、替换、删除、…

Python对日期的一些操作

1. 把这种日期 Mon Jan 29 11:10:49 0800 2024 转换成 ‘2024/2/1 10:50:38’ 这里定义一个func 传入英文日期&#xff0c;返回标准日期格式 def time_formater(input_time_str): input_format %a %b %d %H:%M:%S %z %Y output_format %Y-%m-%d %H:%M:%S return dat…

springboot154基于Spring Boot智能无人仓库管理

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

【Win10下实现开机Jar启动的CICD自动化流程】

目录 在Win10下实现开机Jar启动的CICD自动化流程,可以按照以下步骤进行操作:在Win10下实现开机Jar启动的CICD自动化流程,可以按照以下步骤进行操作: 安装Java环境:确保你的计算机上已经安装Java环境,可以通过命令行运行java -version来验证Java环境是否已安装。 编写启动…

操作符重点

简介 移位操作符 <<:左移操作符 移动的是二进制的数&#xff0c;即存储在计算机内部的数的补码 移动之后再右边补零 >>:右移操作符 同左移操作符 移动之后补的数分两种情况: (1).逻辑右移:移动后左边补1 (2).算术右移:移动后左边补原符号位 位操作符: (1).&a…

嵌入式基础知识-逻辑覆盖测试用例设计

1 基础示例 1.1 例题一 有如下程序&#xff0c;设计分别满足语句覆盖和分支覆盖的最有效力的测试用例。 int x 0; int y 0;if (x > 0 && y > 0) {y y/x; }if (x > 1 || y > 1) {y y 1; }x x y;分析&#xff1a; 语句覆盖只需要所有的语句都被执…

【JavaEE spring】SpringBoot 统一功能处理

SpringBoot 统一功能处理 1. 拦截器1.1 拦截器快速⼊⻔1.2 拦截器详解1.2.1 拦截路径1.2.2 拦截器执⾏流程 1.3 登录校验1.3.1 定义拦截器1.3.2 注册配置拦截器 2. 统⼀数据返回格式2.1 快速⼊⻔2.2 存在问题2.3 案例代码修改2.4 优点 3. 统⼀异常处理 1. 拦截器 后端程序根据…

浅谈——开源软件的影响力

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 ✨特色专栏&#xff1a…

立式台灯什么牌子好?立式护眼台灯品牌推荐

经常关灯看小说、凌晨加班的朋友都知道&#xff0c;眼睛很容易出现红血丝酸痛的症状&#xff0c;也有一些学生朋友夜间学习导致眼睛视力模糊。 这一系列的情况归根到底都来源于光线&#xff0c;不良的光线会不断给眼睛造成压力&#xff0c;久而久之出现用眼疲劳引起近视的风险…

C#入门详解_01_课程简介、C#语言简介、开发环境和学习资料的准备

文章目录 1. 课程简介2. C#语言简介3.开发环境与学习资料 1. 课程简介 开设本课程的目的 传播C#开发的知识&#xff0c;让更多的人有机会接触到软件开发行业引导有兴趣或者想转行的朋友进入软件开发行业 课程内容 完整讲述C#语言在实际软件开发中的应用采用知识讲述加实例程序…

Easy Excel导出一个表格多个Sheet

步骤&#xff1a; 1.查找官方API文档理解实现 2.实现融入到代码里面 一&#xff1a;Easy Excel重复多次写入(写到单个或者多个Sheet) 重复多次写入(写到单个或者多个Sheet) 理解重点&#xff1a; // 每次都要创建writeSheet 这里注意必须指定sheetNo 第几个sheetNo 而且sh…

WPF图表库LiveChart异常问题处理-System.ArgumentOutOfRangeException:指定的参数超出了有效值的范围

问题&#xff1a; 在使用liveChart处理一个以时间为X轴的曲线时&#xff0c;遇到一个报错&#xff1a;指定的参数超出了有效值的范围System.ArgumentOutOfRangeException:“Specified argument was out of the range of valid values. Arg_ParamName_Name” 指定的参数超出了有…

PAT-Apat甲级题1007(python和c++实现)

PTA | 1007 Maximum Subsequence Sum 1007 Maximum Subsequence Sum 作者 CHEN, Yue 单位 浙江大学 Given a sequence of K integers { N1​, N2​, ..., NK​ }. A continuous subsequence is defined to be { Ni​, Ni1​, ..., Nj​ } where 1≤i≤j≤K. The Maximum Su…

Empowering Multimodal LLMs with Foresight Minds(Merlin)论文精读

paper&#xff1a;https://arxiv.org/pdf/2312.00589.pdfcode&#xff1a;https://ahnsun.github.io/merlin/ 0 Abstract 根据观测预测未知是人类的一个能力&#xff0c;对MLLM进行“future modeling”可以更好地激发其潜能&#xff1b;物体轨迹是一种连续帧间高度结构化的表…

计算机毕业设计 | vue+springboot 教务管理系统(附源码)

1&#xff0c;项目背景 随着我国高等教育的发展&#xff0c;数字化校园将成为一种必然的趋势&#xff0c;国内高校迫切需要提高教育工作的质量与效率&#xff0c;学生成绩管理工作是高校信息管理工作的重要组成部分&#xff0c;与国外高校不同&#xff0c;他们一般具有较大规模…