操作系统: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.其他类似>>>>

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐