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

相关文章

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

python dict转换成json格式的实现

《pythondict转换成json格式的实现》本文主要介绍了pythondict转换成json格式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下... 一开始你变成字典格式data = [ { 'a' : 1, 'b' : 2, 'c编程' : 3,

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

Redis中高并发读写性能的深度解析与优化

《Redis中高并发读写性能的深度解析与优化》Redis作为一款高性能的内存数据库,广泛应用于缓存、消息队列、实时统计等场景,本文将深入探讨Redis的读写并发能力,感兴趣的小伙伴可以了解下... 目录引言一、Redis 并发能力概述1.1 Redis 的读写性能1.2 影响 Redis 并发能力的因素二、