TUM RGB-D数据集转换成点云数据

德国慕尼黑工业大学TUM计算机视觉组2012年提出了一个RGB-D数据集,是目前应用最为广泛的RGB-D数据集。数据集使用Kinect采集,包含了depth图像和rgb图像,以及ground truth等数据,具体格式请查看官网。

https://vision.in.tum.de/data/datasets/rgbd-dataset

现需要将深度图像和rgb图像转换成PCL中的点云数据,并使用.pcd格式保存,以便下一步的处理。

环境:Ubuntu16.04 

generatePointCloud.cpp

//参考:https://www.cnblogs.com/gary-guo/p/6542141.html#commentform
//2019-05-05
//实现了将深度图像和RGB彩色图像转换成RGB点云
//*********注意数据集深度图与rgb图像的对应关系***********
// c++标准库 
#include 
#include 
// opencv库
#include 
// PCL库
#include 
#include 

using namespace std;

// 定义点云类型
typedef pcl::PointXYZRGBA PointT;
typedef pcl::PointCloud PointCloud;

// 相机内参
const double camera_factor=5000;
const double camera_cx=325.5;
const double camera_cy=253.5;
const double camera_fx=518.0;
const double camera_fy=519.0;

// 主函数
int main(int argc,char** argv)
{
	//读取rgb图像和depth图像,并转化为点云
	//图像矩阵
	cv::Mat rgb, depth;
	//使用cv::imread()来读取图像
	//rgb图像是8UC3的彩色图像
	rgb = cv::imread("/home/chaoxing/Downloads/rgbd_dataset_freiburg1_desk/rgb/1305031453.359684.png");
	//depth是16UC1的单通道图像,注意flags设置为-1,表示读取原始数据不做修改
	depth = cv::imread("/home/chaoxing/Downloads/rgbd_dataset_freiburg1_desk/depth/1305031453.374112.png", -1);

	//点云变量
	//使用智能指针,创建一个空点云。这种指针用完会自动释放
	PointCloud::Ptr cloud(new PointCloud);
	
	//遍历深度图
	for(int m = 0; m(m)[n];
		//d可能没有值,若如此,跳过此点
		if(d == 0)
			continue;
		//d存在值,则向点云增加一个点
		PointT p;
		//计算这个点的空间坐标
		p.z = double(d)/camera_factor;
		p.x = (n-camera_cx)*p.z/camera_fx;
		p.y = (m-camera_cy)*p.z/camera_fy;
		//从rgb图像中获取它的颜色
		//rgb是三通道的BGR格式图,所以按下面的顺序获取颜色
		p.b = rgb.ptr(m)[n*3];
		p.g = rgb.ptr(m)[n*3+1];
		p.r = rgb.ptr(m)[n*3+2];
		//把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;
	pcl::io::savePCDFile("./pointcloud.pcd", *cloud);
	//清除数据并保存
	cloud->points.clear();
	cout<< "Point cloud saved." << endl;
	return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
 
project(generatePointCloud)
find_package(OpenCV REQUIRED)
find_package(PCL 1.2 REQUIRED)

include_directories(${OpenCV_INCLUDE_DIRS})
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

add_executable(generatePointCloud generatePointCloud.cpp )
target_link_libraries(generatePointCloud ${OpenCV_LIBS} ${PCL_LIBRARIES})

 编译并运行

cmake ..
make 
./generatePointCloud

可以使用PCL_tool显示生成的点云

pcl_viewer pointcloud.pcd

TUM RGB-D数据集转换成点云数据_第1张图片

你可能感兴趣的:(PCL)