3D视觉学习计划之点云的读取和保存

news/2024/11/2 17:24:09/

3D视觉学习计划之点云的读取和保存

一、QT配置PCL

1.Pro文件
这里先贴出我的Pro文件:

TEMPLATE = app
CONFIG += console c++14
CONFIG -= app_bundle
CONFIG -= qtSOURCES += \main.cppINCLUDEPATH += .\/usr/local/include/pcl-1.13 \/usr/include/eigen3 \/usr/include/vtk-7.1 \/usr/include/boostLIBS += /usr/local/lib/lib* \/usr/lib/x86_64-linux-gnu/libpcl_*.so \/usr/lib/x86_64-linux-gnu/libvtk*.so \/usr/lib/x86_64-linux-gnu/libboost_*.so

注意点如下:
1.CONFIG += console c++14这个地方需要改成c++14,之前是11就可以
2.其他的依赖文件和包含路径这些,需要开启自己的路径进行参考。
2.测试代码
测试代码如下:

#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)); //用系统时间初始化随机种子与 srand (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实例,用设置分辨率进行初始化,该octree用它的页节点存放点索引向量,分辨率参数描述最低一级octree的最小体素的尺寸,因此octree的深度是分辨率和点云空间维度的函数,如果知道点云的边界框,应该用defineBoundingbox方法把它分配给octree然后通过点云指针把所有点增加到ctree中。*****************************************************************************/float resolution = 128.0f;pcl::octree::OctreePointCloudSearch<pcl::PointXYZ> octree(resolution); //初始化Octreeoctree.setInputCloud(cloud);      //设置输入点云    这两句是最关键的建立PointCloud和octree之间的联系octree.addPointsFromInputCloud(); //构建octreepcl::PointXYZ searchPoint; //设置searchPointsearchPoint.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);/*************************************************************************************一旦PointCloud和octree联系一起,就能进行搜索操作,这里使用的是“体素近邻搜索”,把查询点所在体素中其他点的索引作为查询结果返回,结果以点索引向量的形式保存,因此搜索点和搜索结果之间的距离取决于octree的分辨率参数
*****************************************************************************************/std::vector<int> pointIdxVec; //存储体素近邻搜索结果向量if (octree.voxelSearch(searchPoint, pointIdxVec)) //执行搜索,返回结果到pointIdxVec{std::cout << "Neighbors within voxel search at (" << searchPoint.x<< " " << searchPoint.y<< " " << searchPoint.z << ")"<< std::endl;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;}/**********************************************************************************K 被设置为10 ,K近邻搜索  方法把搜索结果写到两个分开的向量,第一个pointIdxNKNSearch包含搜索结果(结果点的索引的向量)  第二个向量pointNKNSquaredDistance存储搜索点与近邻之间的距离的平方。
*************************************************************************************///K 近邻搜索int K = 10;std::vector<int> pointIdxNKNSearch;         //结果点的索引的向量std::vector<float> pointNKNSquaredDistance; //搜索点与近邻之间的距离的平方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;}// 半径内近邻搜索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;}
}

输出结果如下图:
在这里插入图片描述

二、C++版本读取文件

#include <pcl/io/pcd_io.h>int main()
{// 读取点云pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);pcl::io::loadPCDFile<pcl::PointXYZ>("path/to/pointcloud.pcd", *cloud);// 对点云进行处理// ...// 保存点云pcl::io::savePCDFile("path/to/new/pointcloud.pcd", *cloud);return 0;
}

二、python 版本

import pclpy
from pclpy import pcl
import numpy as np# 读取点云
cloud = pcl.PointCloud.PointXYZ()
pcl.io.loadPCDFile("path/to/pointcloud.pcd", cloud)# 对点云进行处理
# ...# 保存点云
pcl.io.savePCDFileASCII("path/to/new/pointcloud.pcd", cloud)

http://www.ppmy.cn/news/641590.html

相关文章

3dmax文件保存后超大怎么缩小?想学3D建模,还没软件速来领取

用3d max的时候突然遇到一个棘手的问题&#xff0c;max文件保存的时候突然变的很大&#xff0c;而且很占内存&#xff0c;想想是不是模型面太多了&#xff0c;保存其中的单体模型文件&#xff0c;文件的大小还是变的几百兆&#xff0c;估计是哪里出问题了&#xff0c;复制到哪里…

3D Slicer中文教程(三)—数据加载及保存方式

1.打开数据与保存数据 (1)打开数据 ——可以将数据拖拽到3D Slicer应用窗口或者从菜单栏工具栏打开。 ——多种方式加载大量数据。 有关DICOM数据,请参阅DICOM模块文档。 对于几乎所有其他(包括场景),您可以使用添加数据对话框。 有关支持的数据格式的列表,请参阅此列表…

mmdet3d training 流程

一般大家的pytorch训练代码都比较简洁&#xff0c;mmdet3d为了支持扩展性&#xff0c;把代码进行了很多的抽象和封装&#xff0c;大大降低了可读性。现在简单理一下其training的代码执行逻辑。 实际使用的时候肯定是train几个epoch之后eval一次的&#xff0c;这里只考虑trainin…

模型的保存与加载与多gpu的模型保存和加载

模型保存与加载 模型的保存与加载方式 模型保存有两种形式&#xff0c;一种是保存模型的state_dict()&#xff0c;只是保存模型的参数。那么加载时需要先创建一个模型的实例model&#xff0c;之后通过torch.load()将保存的模型参数加载进来&#xff0c;得到dict&#xff0c;再…

D3D中数据从显存、内存相互拷贝的时间对比

显存到内存&#xff08;分辨率&#xff09;缩放时间(stretchRect)LockRect(调用GetRenderTargetData,空)LockRect(用memcpy复制数据)400*300015~17 ms数据已经到内存&#xff0c;此项无效800*600016~18 ms数据已经到内存&#xff0c;此项无效1920*10800 20~21ms数据已经到内存&…

mmdetection3d 训练

本文为博主原创文章,未经博主允许不得转载。 本文为专栏《python三维点云从基础到深度学习》系列文章,地址为“https://blog.csdn.net/suiyingy/article/details/124017716”。 本节以SECOND算法为例,简要介绍mmdetection3d second算法训练过程,含数据和python源码详细介绍…

3D模型格式的一点总结

通俗来说&#xff0c;你可以把“格式”理解成基于同一规范的技术表征&#xff0c;也可以再简化点把它看成一种分类方式。对于3D模型来说&#xff0c;格式更是种类繁多。不同应用领域的、不同功能属性的&#xff0c;加密的、独有的、通用的&#xff0c;让人眼花缭乱。 目录 我的…

模型取取 很卡、慢

在3dmax里要使用到一些插件&#xff0c;从别的场景里复制模型到当前场景&#xff0c;这种操作比较方便&#xff0c;不用使用3d自带的比较麻烦的合并导入功能&#xff0c;但是有的时候&#xff0c;使用插件复制模型&#xff0c;会比较卡&#xff0c;有的时候会没有响应&#xff…