Windows PCL GPU版本编译过程

news2025/1/9 16:27:10

网上教程很少,但是想用PCL GPU功能,于是决定自己踩坑,我有几个不同的环境组合:

(1)win10+cuda10.0+vs2019+PCL1.11.1+cmake3.18.5(失败)

(2)win10+cuda11.2+vs2019+PCL1.11.1+cmake3.18.5(成功)

(3)win11+cuda11.2+vs2019+PCL1.11.1+cmake3.18.5(未测,应该和2类似)

参考教程:Win10+VS2019编译PCL库1.12.0(含gpu)_pcl编译_番茄V王子的博客-CSDN博客

基础配置:

(1)环境变量:以下变量不必补全所有的变量,缺啥补啥即可

这里用到了PCL官方下载的PCL-1.11.1-AllInOne-msvc2019-win64.exe或者PCL-1.13.1-AllInOne-msvc2022-win64.exe;

类似教程中的,添加EIGEN_ROOT、EIGEN_INCLUDE_DIR、BOOST_ROOT、BOOST_INCLUDEDIR、BOOST_LIBRARYDIR、FLANN_INCLUDE_DIR、FLANN_LIBRARY、FLANN_LIBRARY_DEBUG、VTK_DIR、QHULL_INCLUDE_DIR、QHULL_LIBRARY、QHULL_LIBRARY_DEBUG

(2)cmake-gui设置

首先关于boost的警告我们忽略,保证能够Configuring done即可;

WITH_CUDA、BUILD_CUDA、BUILD_GPU勾选,点一次Configuring;

再勾选我们后面可能会使用到的BUILD_cuda_io、BUILD_gpu_surface,点一次Configuring;

CMAKE_INSTALL_PREFIX选择你希望生成的路径,将关于Anaconda找到的依赖库PNG、ZLIB的路径都删除,点一次Configuring;

然后Generate和Open Project,在VS中选择Release,然后ALL_BUILD,最后INSTALL;

第一次尝试(失败):使用环境(1)

原因是对于PCL1.11.1来说cuda10.0版本太低。

第二次尝试(成功):使用环境(2)

期间报了几个错误:

(1)openni检查MSVC版本,如下图,我这里宏的值为1929,于是后续我改成1929即可;

 (2)eigen的cuda的报错,上述参考教程中也提到了,但是我只报了一处错误,改成如下图就好了;

(3)一些关于gpu_kinfu的错误,忘记截图了,查了一下是kinect fusion算法相关的东西,暂时没用到,所以cmake-gui里面把相关去掉,再重新编译;

(4) 一些关于openni的报错,忘记截图了,从报错信息看的出是openni出的问题,我想着我也没用这玩意,干脆在cmake-gui里面把它两的勾去掉,再重新编译;

  然后就成功编译完成未有任何报错;

最后来运行一下PCL GPU程序:

CMakeLists.txt内容为:

cmake_minimum_required(VERSION 3.1...3.20)

add_compile_options("/std:c++17")

project(pcl_gpu_test)

#pcl
set(PCL_ROOT D:/soft/PCL/PCL_1.11.1_GPU/install)
find_package(PCL 1.11 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
#message(STATUS "PCL include path is: " ${PCL_INCLUDE_DIRS})
#message(STATUS "PCL lib path is: " ${PCL_LIBRARIES})

#include_directories(./include)
FILE(GLOB CPP_FILE0 ${PROJECT_SOURCE_DIR}/src/*.cpp)
add_executable(pcl_gpu_test0 ${CPP_FILE0})
target_link_libraries(pcl_gpu_test0 ${PCL_LIBRARIES})

main.cpp为:

#include <iostream>
#include <string>

#include <pcl/PointIndices.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/obj_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/segmentation/extract_clusters.h>

#include <pcl/gpu/octree/octree.hpp>
#include <pcl/gpu/containers/device_array.hpp>
#include <pcl/gpu/segmentation/gpu_extract_clusters.h>
#include <pcl/gpu/segmentation/impl/gpu_extract_clusters.hpp>

int main()
{
	//例子参考https://zhuanlan.zhihu.com/p/258780417
	using namespace std;
	string obj_path = R"(F:\temp\test.ply)";
	using T = pcl::PointXYZ;
	pcl::PointCloud<T>::Ptr cldPtr(new pcl::PointCloud<T>);
	pcl::io::loadPLYFile(obj_path, *cldPtr);

	double radius = 20.0;
	int minSize = 1;
	int maxSize = INT_MAX;

	//cpu欧式聚类
	std::vector<pcl::PointIndices> cluster_indices_cpu;
	{
		typename pcl::search::KdTree<T>::Ptr tree(new pcl::search::KdTree<T>);
		tree->setInputCloud(cldPtr);

		pcl::EuclideanClusterExtraction<T> ec;
		ec.setClusterTolerance(radius); //设置近邻搜索的搜索半径
		ec.setMinClusterSize(minSize);//设置一个聚类需要的最少点数目
		ec.setMaxClusterSize(maxSize); //设置一个聚类需要的最大点数目
		ec.setSearchMethod(tree);//设置点云的搜索机制
		ec.setInputCloud(cldPtr);
		ec.extract(cluster_indices_cpu);//从点云中提取聚类,并将点云索引保存在cluster_indices中
	}
	cout << "cpu 计算结果:" << endl;
	for (int i = 0; i < (int)cluster_indices_cpu.size(); ++i)
	{
		cout << cluster_indices_cpu[i].indices.size() << endl;
	}

	//gpu欧式聚类
	std::vector<pcl::PointIndices> cluster_indices_gpu;
	{
		pcl::gpu::Octree::PointCloud cldPtr_gpu;
		cldPtr_gpu.upload(cldPtr->points);

		pcl::gpu::Octree::Ptr octree_gpu(new pcl::gpu::Octree);
		octree_gpu->setCloud(cldPtr_gpu);
		octree_gpu->build();

		pcl::gpu::EuclideanClusterExtraction gec;
		gec.setClusterTolerance(radius);
		gec.setMinClusterSize(minSize);
		gec.setMaxClusterSize(maxSize);
		gec.setSearchMethod(octree_gpu);
		gec.setHostCloud(cldPtr);
		gec.extract(cluster_indices_gpu);
	}
	std::sort(cluster_indices_gpu.begin(), cluster_indices_gpu.end(), [](const pcl::PointIndices& a, const pcl::PointIndices& b) 
		{return a.indices.size() < b.indices.size(); });//cluster_indices_gpu是未排序的
	cout << "gpu 计算结果:" << endl;
	for (int i = 0; i < (int)cluster_indices_gpu.size(); ++i)
	{
		cout << cluster_indices_gpu[i].indices.size() << endl;
	}

	return 0;
}

最后我这个例子中结果是一致的,但是!!!我如果把参数radius改成10.0,发现结果不一致,具体原因不知为何。

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

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

相关文章

【算法|动态规划系列No.5】leetcode62. 不同路径

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

No7.精选前端面试题,享受每天的挑战和学习

文章目录 详细说明下 Composition Api 与 Vue 2.x使用的Options Api详细说明下Proxy和Object.defineProperty详细说明下Loader和Plugin分析下vue2.0和vue3.0的原理vue3和react的异同点 详细说明下 Composition Api 与 Vue 2.x使用的Options Api Composition API 是 Vue 3 中引…

弱网测试(Charles模拟)

一、介绍 移动应用的网络环境多样&#xff0c;而且会出现在不同网络之间切换的场景&#xff0c;即使是在同一网络环境下&#xff0c;也会出现网络连接状态时好时坏的情况&#xff0c;比如时高时低的延迟、经常丢包、频繁断线&#xff0c;在乘坐地铁、穿越隧道&#xff0c;和地…

今日大模型日报

XPhoneBERT&#xff5c;文本到语音转换的音素表示的预训练多语言模型 XPhoneBERT: A Pre-trained Multilingual Model for Phoneme Representations for Text-to-Speech Linh The Nguyen, Thinh Pham, Dat Quoc Nguyen Github地址&#xff1a;https://github.com/VinAIResearch…

IO流~~

就是用来读写数据 2&#xff1a;IO流的分类 3&#xff1a;字节流的使用 1&#xff1a;文件字节输入流&#xff1a;每次读取一个字节 作用&#xff1a;以内存为基准&#xff0c;把磁盘文件中的数据以字节的形式读取到内存中去 性能慢读取中文字符输出无法避免乱码问题 2&…

数字化升级提效85%,箭牌不止家居智能

近年来&#xff0c;随着人们对生活品质的追求不断提升&#xff0c;家居行业也逐渐朝着更加智能化、个性化、环保可持续和互联网的方向发展。有数据显示&#xff0c;2023年中国家居市场规模将达到2万亿元人民币&#xff0c;年复合增长率为8.3%。激烈的市场竞争之下&#xff0c;可…

操作系统——第一章概论(下)

提示&#xff1a;冠盖满京华&#xff0c;斯人独憔悴 文章目录 声明1.3.1 操作系统的运行机制1.3.2 中断和异常1.3.3 系统调用1.4.1 操作系统体系结构1.4.2 操作系统体系1.5 操作系统引导1.6 虚拟机 声明 本文章内容是根据王道教材以及王道的视频课所写&#xff0c;写的目的方…

Java中操作文件(一)

目录 一、引入 二、File概述 2.1、属性 2.2、构造方法 2.3、方法 2.4、代码示例 示例1 示例2 示例3 示例4 示例5 示例6 示例7 示例8 一、引入 文件是操作系统中的重要概念&#xff0c;Java作为一个跨平台语言&#xff0c;可以针对不同的操作系统处理文件。…

83、基于STM32单片机录音机录音笔语音存储回放TF卡TFT屏系统设计(程序+原理图+PCB源文件+参考论文+硬件设计资料+元器件清单等)

单片机主芯片选择方案 方案一&#xff1a;AT89C51是美国ATMEL公司生产的低电压&#xff0c;高性能CMOS型8位单片机&#xff0c;器件采用ATMEL公司的高密度、非易失性存储技术生产&#xff0c;兼容标准MCS-51指令系统&#xff0c;片内置通用8位中央处理器(CPU)和Flash存储单元&a…

Springboot 接口对接文件及对象

两个sprongboot项目实现文件对接&#xff0c;在传入文件同时传递其他对象信息&#xff0c;比如接口如下 一、创建文件 例如在D盘下创建1.txt&#xff0c;里边写入内容 2、传送方代码实现 import org.springframework.core.io.FileSystemResource; import org.springframework.…

保护您的密码安全:ADSelfService Plus防止密码被盗

在数字时代&#xff0c;密码的安全性至关重要。随着黑客攻击的不断增加&#xff0c;我们必须采取必要的措施来保护我们的密码免受盗窃和滥用。在这篇文章中&#xff0c;我们将介绍ADSelfService Plus&#xff0c;这是一种强大的密码管理和自助服务解决方案&#xff0c;可以帮助…

反向代理缓存服务器 Squid 、Nginx、CDN部署讲解

目录 一、Squid 反向代理1.1 概念1.2 工作机制1.3 搭建 二、 Nginx 反向代理缓存 一、Squid 反向代理 1.1 概念 如果 Squid 反向代理服务器中缓存了该请求的资源&#xff0c;则将该请求的资源直接返回给客户端&#xff1b;否则反向代理服务器将向后台的 Web 服务器请求资源&a…

三者ICG聚甲基菁染料:ICG COOH,ICG NHS,ICG NH2,具有良好的水溶性

一、ICG-COOH--CAS号&#xff1a;181934-09-8 ICG-COOH&#xff08;吲哚菁绿羧酸&#xff09;中末端羧酸在活化剂&#xff08;如EDC或HATU&#xff09;存在下可与伯胺基反应&#xff0c;形成稳定的酰胺键。ICG是一种带负电荷的聚甲基菁染料&#xff0c;具有良好的水溶性&#…

远程服务器ubuntu安装Jupyter Lab详细教程

不用打开电脑&#xff0c;不用启动anaconda&#xff0c;随时随地&#xff0c;公交地铁上使用手机输入网站就能启动jupyter notebook进行代码编写、数据分析&#xff0c;着实是很方便。在你成功白嫖一台服务器之后&#xff0c;可以按照下面的教程&#xff0c;手把手教你配置一个…

car music

正常车载U盘即可 车载不可用的U盘 车载需要改进遍历文件夹

【机器学习核心总结】什么是BP反向传播算法

什么是BP反向传播算法 神经网络是个好工具&#xff0c;但就像有的刀削铁如泥&#xff0c;有的却只能拿来切豆腐。 真正决定神经网络好不好用的是神经元之间连接的权重和神经元的阈值。 如何确定这些数字&#xff0c;大部分时间我们都在使用反向传播&#xff0c;也就是常说的B…

Opencv图片样本预处理

前因 最近想学学&#xff0c;OPENCV识别物体&#xff0c;但是处理图片正样本时过于繁琐&#xff0c; 遂自己开发了工具&#xff0c;来处理样本图片&#xff0c;基于QT&#xff0c;文末附下载链接 程序 功能 一共有两个功能&#xff0c;一个是处理负样本&#xff0c;一个处理…

UE 5.1.1 引擎源码下载 执行Setup报错解决

Upcoming Disruption of Service Impacting Unreal Engine Users on GitHub - Announcements - Epic Developer Community Forums 文件下载地址&#xff1a;https://github.com/EpicGames/UnrealEngine/blob/9763f4c8f3fb047be1a4b5fee2b080587c1307a1/Engine/Build/Commit.gi…

React之hooks

Hooks函数 1.useState()&#xff1a;状态钩子。纯函数组件没有状态&#xff0c;用于为函数组件引入state状态, 并进行状态数据的读写操作。 const [state, setState] useState(initialValue); // state&#xff1a;初始的状态属性&#xff0c;指向状态当前值&#xff0c;类似…

字节测试8年,肝到50W就剩这份学习笔记了····

在字节工作了8年&#xff0c;工作压力大&#xff0c;节奏快&#xff0c;但是从技术上确实得到了成长&#xff0c;尤其是当你开发框架与平台的时候&#xff0c;熬到年薪50W也费了不少心思&#xff0c;小编也是个爱学习的人&#xff0c;把这几年的工作经验整理成了一份完整的笔记…