您当前的位置: 首页 > 

惊鸿一博

暂无认证

  • 1浏览

    0关注

    535博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

三维重建_彩色图和深度图转点云文件、ply和pcd相互转换、点云合并

惊鸿一博 发布时间:2021-03-21 21:09:27 ,浏览量:1

目录

1 彩色图 + 深度图 = 点云

2 ply转pcd

3 pcd转ply

4 点云合并

1 彩色图 + 深度图 = 点云
// C++ 标准库
#include 
#include 
using namespace std;

// OpenCV 库
#include 
#include 

// PCL 库
#include 
#include 
#include 

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

// 相机内参
const double camera_factor = 1000;
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)
{
	// 图像矩阵
	cv::Mat rgb, depth;
	// 使用cv::imread()来读取图像
	// rgb 图像是8UC3的彩色图像
	// depth 是16UC1的单通道图像,注意flags设置-1,表示读取原始数据不做任何修改
	rgb = cv::imread("C:\\Users\\Administrator\\Desktop\\color.png");
	depth = cv::imread("C:\\Users\\Administrator\\Desktop\\depth.png", -1);

	// 点云变量
	// 使用智能指针,创建一个空点云。这种指针用完会自动释放。
	PointCloud::Ptr cloud(new PointCloud);
	// 遍历深度图
	for (int m = 0; m < depth.rows; m++)
		for (int n = 0; n < depth.cols; n++)
		{
			// 获取深度图中(m,n)处的值
			ushort d = depth.ptr(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 points.clear();
	cout             
关注
打赏
1663399408
查看更多评论
0.0367s