点云着色--合成彩色点云(PointXYZRGB点云)

1.版本要求

版本: 暂未知。

2.简介

有时我们想讲双目相机的图形色彩添加到点云上看彩色点云的效果(PointXYZRGB点云)。下面展示如何在PCL中利用双目相机图像和双目相机点云合成彩色点云(PointXYZRGB点云)

3.数据

本例中使用的点云数据(test.pcd,test.jpeg)请见百度网盘分享。
链接:https://pan.baidu.com/s/1anUs2bzOe0-ZYbszJdXEvg
提取码:ak1w

4.代码

#include <iostream>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/point_types.h>
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>

int	main (int argc,char** argv)
{
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);  //加载点云
	pcl::io::loadPCDFile("test.pcd", *cloud);

	cv::Mat img = cv::imread("test.jpeg");  //读入图片

	int length = img.rows * img.cols;
	uchar *R_array = new uchar[length]; //动态创建数组存放rgb值
	uchar*G_array = new uchar[length];
	uchar*B_array = new uchar[length];

	for (int r = 0; r < img.rows; r++) //遍历图片存放rgb值
	{
		for (int c = 0; c < img.cols; c++)
		{
			B_array[r*img.cols+c] = img.at<cv::Vec3b>(r, c)[0];//注意opencvz中Scalar(B,G,R)不是R,G,B这个顺序
			G_array[r*img.cols+c] = img.at<cv::Vec3b>(r, c)[1];
			R_array[r*img.cols+c] = img.at<cv::Vec3b>(r, c)[2];
		}
	}

	pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_RGBA(new pcl::PointCloud<pcl::PointXYZRGB>);  //创建XYZRGB点云
	cloud_RGBA->width = length;  //点云初始化,点云数量和图像像素数量一样
	cloud_RGBA->height = 1;
	cloud_RGBA->is_dense = true;
	cloud_RGBA->resize(length);
	for(int t = 0; t < length; t++) //给点云赋值(RGB值和XYZ坐标)
	{
		cloud_RGBA->points[t].r = R_array[t];
		cloud_RGBA->points[t].g = G_array[t];
		cloud_RGBA->points[t].b = B_array[t];
		cloud_RGBA->points[t].x = cloud->points[t].x;
		cloud_RGBA->points[t].y = cloud->points[t].y;
		cloud_RGBA->points[t].z = cloud->points[t].z;
	}

	cv::imshow("image", img);  //显示图p片

	pcl::visualization::PCLVisualizer viewer;  //显示点云
	viewer.addPointCloud<pcl::PointXYZRGB>(cloud_RGBA);
	viewer.addCoordinateSystem(1000.0);
	while (!viewer.wasStopped())
	{
		viewer.spinOnce(100);
	}

	return 0;
}

5.效果

5.1输入图片
点云着色--合成彩色点云(PointXYZRGB点云)

5.2合成的PointXYZRGB点云
点云着色--合成彩色点云(PointXYZRGB点云)

上一篇:学习笔记:Houdini的Manipulate分类下节点的基本用途


下一篇:凸包算法