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

相关文章

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

C++中全局变量和局部变量的区别

《C++中全局变量和局部变量的区别》本文主要介绍了C++中全局变量和局部变量的区别,全局变量和局部变量在作用域和生命周期上有显著的区别,下面就来介绍一下,感兴趣的可以了解一下... 目录一、全局变量定义生命周期存储位置代码示例输出二、局部变量定义生命周期存储位置代码示例输出三、全局变量和局部变量的区别作用域

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被