png格式的深度图像转pcd点云格式(C++)

2023-10-29 12:20

本文主要是介绍png格式的深度图像转pcd点云格式(C++),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

操作系统:Windows 10
IDE:Visual Studio 2017(community)
编程语言:C++
主要环境:OpenCV、PCL
深度图像格式:png
点云格式:pcd
设备:深度相机

1. 应用背景

在进行点云处理时,提供的数据为png格式的深度图片,不方便在PCL框架下使用,需要将对应的深度图像(depth.png)与彩色图像(rgb.png)对应转换成pcd格式。
本文简单介绍一下格式转换方法。
操作前,默认深度图像(depth.png)与彩色图像(rgb.png)已经对齐。一般情况下,深度相机的SDK已提供了相应的处理程序。

2. 格式转换

将深度图像(depth.png)与彩色图像(rgb.png)拷贝到data文件下,创建一个VS空白工程,配置好OpenCV和PCL。创建png2pcd.cpp源文件,代码如下。

#include <iostream>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <opencv2/opencv.hpp>
#include <string>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <pcl/visualization/cloud_viewer.h>
using namespace std;
// 定义点云类型
typedef pcl::PointXYZRGBA PointT;
typedef pcl::PointCloud<PointT> PointCloud;int main(int argc, char** argv)
{// 读取./data/rgb.png和./data/depth.png,并转化为点云// 图像矩阵cv::Mat rgb, depth;// 使用cv::imread()来读取图像rgb = cv::imread("./data/rgb.png");const char filename[] = "./data/depth.png";//“2”拿深度depth = cv::imread(filename, 2);// 点云变量// 使用智能指针,创建一个空点云。这种指针用完会自动释放。PointCloud::Ptr cloud(new PointCloud);// 遍历深度图for (int m = 0; m < depth.rows; m++)for (int n = 0; n < depth.cols; n++){ushort d = depth.ptr<ushort>(m)[n];if (d == 0)continue;PointT p;p.x = m;p.y = n;p.z = double(d);// 从rgb图像中获取它的颜色// rgb是三通道的BGR格式图,所以按下面的顺序获取颜色。p.b = rgb.ptr<uchar>(m)[n * 3];;p.g = rgb.ptr<uchar>(m)[n * 3 + 1];p.r = rgb.ptr<uchar>(m)[n * 3 + 2];//如果不需要将点云上色,可改成单一色。//p.b = 255;;//p.g = 255;//p.r = 255;// 把p加入到点云中cloud->points.push_back(p);}// 设置并保存点云cloud->height = 1;cloud->width = cloud->points.size();cout << "point cloud size = " << cloud->points.size() << endl;cloud->is_dense = false;try {//保存点云图pcl::io::savePCDFile("./data/pcd.pcd", *cloud);}catch (pcl::IOException &e) {cout << e.what() << endl;}//显示点云图pcl::visualization::CloudViewer viewer("Simple Cloud Viewer");//直接创造一个显示窗口viewer.showCloud(cloud);//在这个窗口显示点云while (!viewer.wasStopped()){}// 清除数据并退出cloud->points.clear();cout << "Point cloud saved." << endl;return 0;
}

运行结果如下图。
在这里插入图片描述
可看到上色的点云(PC),其中还夹杂着噪声(noise)。

3. 参考资料

1.彩色图和深度图转点云
2.深度图像+rgb转化点云数据、点云数据打开、显示以及保存
3.其他类似>>>>

这篇关于png格式的深度图像转pcd点云格式(C++)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/300629

相关文章

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷

C/C++ chrono简单使用场景示例详解

《C/C++chrono简单使用场景示例详解》:本文主要介绍C/C++chrono简单使用场景示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录chrono使用场景举例1 输出格式化字符串chrono使用场景China编程举例1 输出格式化字符串示

C++/类与对象/默认成员函数@构造函数的用法

《C++/类与对象/默认成员函数@构造函数的用法》:本文主要介绍C++/类与对象/默认成员函数@构造函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录名词概念默认成员函数构造函数概念函数特征显示构造函数隐式构造函数总结名词概念默认构造函数:不用传参就可以