👑主页:吾名招财
👓简介:工科学硕,研究方向机器视觉,爱好较广泛…
💫签名:面朝大海,春暖花开!
open3d将彩色图和深度图转换成点云(C++)
- 1,引言
- 2,相关数据集资源如下
- 3,彩色图、深度图和相机内参
- 4,C++代码
- 5,生成的彩色点云效果如下
1,引言
必备条件需要3D相机生成的彩色图及深度图,注意要将深度图与彩色图对齐(一般3D相机自带对齐算子),以及3D相机的彩色图内参(相机自带内参获取功能)。有了此彩色图、对齐后的深度图以及相机内参就能使用open3d生成彩色点云了.
2,相关数据集资源如下
本人上传了一个用于三维重建测试的公开数据集,内含彩色图、深度图、相机内参、相机位姿等相关数据,可用于相关测试
https://download.csdn.net/download/qq_44870829/90236553
3,彩色图、深度图和相机内参
4,C++代码
#include <string>
#include <iostream>
#include "Open3D/Open3D.h"using namespace std;int main(int argc, char* argv[])
{// ----------------------------------------读取图像-------------------------------------open3d::geometry::Image color, depth;open3d::io::ReadImage("frame-000000.color.jpg", color); // 读取彩色图像open3d::io::ReadImage("frame-000000.depth.png", depth); // 读取深度图像// -------------------------------------输出图像基本信息--------------------------------open3d::utility::LogInfo("Reading RGBD image : ");open3d::utility::LogInfo(" Color : {:d} x {:d} x {:d} ({:d} bits per channel)",color.width_, color.height_, color.num_of_channels_,color.bytes_per_channel_ * 8);open3d::utility::LogInfo("Depth : {:d} x {:d} x {:d} ({:d} bits per channel)",depth.width_, depth.height_, depth.num_of_channels_,depth.bytes_per_channel_ * 8);// --------------------------------------相机内参设置----------------------------------int width = 640; // 输入图像的宽度int height = 480; // 输入图像的高度double fx = 585; // x轴焦距 double fy = 585; // y轴焦距double cx = 320; // 相机原点的x坐标double cy = 240; // 相机原点的y坐标// 方式一auto intrinsic = open3d::camera::PinholeCameraIntrinsic(width, height, fx, fy, cx, cy); // 使用自定义内参方式二open3d::camera::PinholeCameraIntrinsic intrinsic = open3d::camera::PinholeCameraIntrinsic();intrinsic.SetIntrinsics(width, height, fx, fy, cx, cy);//open3d::camera::PinholeCameraIntrinsic intrinsic = open3d::camera::PinholeCameraIntrinsic(// open3d::camera::PinholeCameraIntrinsicParameters::PrimeSenseDefault); // 使用默认内参// -------------------------------------RGBD图像参数设置-------------------------------double depth_scale = 1000.0; // 深度值的缩放倍数double depth_trunc = 3.0; // 深度值的截断系数bool convert_rgb_to_intensity = false; // 是否将彩色图转为强度图// --------------------------------------生成RGBD图像----------------------------------std::shared_ptr<open3d::geometry::RGBDImage> rgbd_image = open3d::geometry::RGBDImage::CreateFromColorAndDepth(color, // 输入的彩色图像depth, // 输入的深度图像depth_scale, // 深度值的缩放倍数depth_trunc, // 深度值大于该值将被截断为0convert_rgb_to_intensity);// 设置是否将彩色图像转为强度图
// ---------------------------------------RGBD转点云-----------------------------------auto pcd = open3d::geometry::PointCloud::CreateFromRGBDImage(*rgbd_image, intrinsic);open3d::visualization::DrawGeometries({ pcd });return 0;
}