目录

1 彩色图 + 深度图 = 点云

2 ply转pcd

3 pcd转ply

4 点云合并


1 彩色图 + 深度图 = 点云

// C++ 标准库
#include <iostream>
#include <string>
using namespace std;// OpenCV 库
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>// PCL 库
#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>// 定义点云类型
typedef pcl::PointXYZRGBA PointT;
typedef pcl::PointCloud<PointT> 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<ushort>(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<uchar>(m)[n * 3];p.g = rgb.ptr<uchar>(m)[n * 3 + 1];p.r = rgb.ptr<uchar>(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::savePLYFile("C:\\Users\\Administrator\\Desktop\\ply.ply", *cloud);   //将点云数据保存为ply文件pcl::io::savePCDFile("C:\\Users\\Administrator\\Desktop\\pcd.pcd", *cloud);   //将点云数据保存为pcd文件// 清除数据并退出cloud->points.clear();cout << "Point cloud saved." << endl;return 0;
}

2 ply转pcd

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/console/print.h>
#include <pcl/console/parse.h>
#include <pcl/console/time.h>
#include <pcl/io/vtk_lib_io.h>
#include <pcl/io/vtk_io.h>
#include <vtkPolyData.h>
#include <vtkSmartPointer.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/conversions.h>
using namespace pcl;
using namespace pcl::io;
using namespace pcl::console;int main()
{pcl::PCLPointCloud2 point_cloud2;pcl::PLYReader reader;reader.read("reconstructed_2_1.ply", point_cloud2);pcl::PointCloud<pcl::PointXYZ> point_cloud;pcl::fromPCLPointCloud2(point_cloud2, point_cloud);pcl::PCDWriter writer;writer.writeASCII("reconstructed_2_1.pcd", point_cloud);cout << "Done!" << endl;return 0;
}

3 pcd转ply

#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include<pcl/PCLPointCloud2.h>
#include<iostream>
#include<string>using namespace pcl;
using namespace pcl::io;
using namespace std;int PCDtoPLYconvertor(string & input_filename, string& output_filename)
{pcl::PCLPointCloud2 cloud;if (loadPCDFile(input_filename, cloud) < 0){cout << "Error: cannot load the PCD file!!!" << endl;return -1;}PLYWriter writer;writer.write(output_filename, cloud, Eigen::Vector4f::Zero(), Eigen::Quaternionf::Identity(), true, true);return 0;}int main()
{string input_filename = "./reconstructed_1_reconstructed_2_1.pcd";string output_filename = "./reconstructed_1_reconstructed_2_1.ply";PCDtoPLYconvertor(input_filename, output_filename);cout << "Done!" << endl;return 0;
}

4 点云合并

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <string>using namespace std;  // 可以加入 std 的命名空间int main(int argc, char** argv)
{string ReviseName;cout << "是否已经修改输出文件的名称和K值?请输入Y或N。" << endl;cin >> ReviseName;if (ReviseName != "Y"){return (-1);//跳出整个程序}pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);    // 总点pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1(new pcl::PointCloud<pcl::PointXYZ>);    // 点云1pcl::PCDReader reader;reader.read<pcl::PointXYZ>("reconstructed_1.pcd", *cloud1);//读取pcd文件,用指针传递给cloud。pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2(new pcl::PointCloud<pcl::PointXYZ>); // 点云2reader.read<pcl::PointXYZ>("reconstructed_2_1.pcd", *cloud2);//读取pcd文件,用指针传递给cloud。//拷贝点云数据*cloud = *cloud1;*cloud += *cloud2;//输出时所用离群点的名字string name_out1 = "reconstructed_1_";   //因为string变量自身就带着隐含的双引号了,所以不用特意加双引号string name_out2 = "reconstructed_2_1.pcd";string name_out = name_out1; name_out += name_out2; cout << name_out << endl;pcl::PCDWriter writer;writer.write<pcl::PointXYZ>(name_out, *cloud, false);//滤波后内点(主体点)cout << "点云合并完成!" << endl;return(0);
}

参考:

  • vs2019+opencv配置方法:https://blog.csdn.net/y18771025420/article/details/110373449
  • vs2019+pcl配置方法:https://blog.csdn.net/y18771025420/article/details/110517524
  • 参考文章:https://blog.csdn.net/stq054188/article/details/106408454

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

  1. Open3d利用彩色图和深度图生成点云进行室内三维重建

    上一次得到的点云图在累加多张后配准会出现少量离群的点云,效果很差,于是考虑从 ICL-NUIM dataset这个数据集获得官方的室内图进行三维重建,数据集网址如下: ICL-NUIM RGB-D B ...

  2. ROS下获取kinectv2相机的仿照TUM数据集格式的彩色图和深度图

    准备工作: 1. ubuntu16.04上安装iai-kinect2, 2. 运行roslaunch kinect2_bridge kinect2_bridge.launch, 3. 运行 rosru ...

  3. ROS获取KinectV2相机的彩色图和深度图并制作bundlefusion需要的数据集

    背景: 最近在研究BundleFusion,跑通官方数据集后,就想着制作自己的数据集来运行bundlefusion.KinectV2相机可直接获取的图像的分辨率分为三个HD 1920x1080, QH ...

  4. 图像处理中涉及的灰度图、彩色图以及深度图概念

    图像处理中涉及最多的概念就是图像的类型,为了很好的理解图像的概念以及处理图片,我们就需要对常见的图像具有一定的概念. 我们首先介绍一下生活中常见的图像格式: 1.bmp格式:这是一种不常见的图像格式, ...

  5. kinect linux 深度处理,kinect彩色图和深度图对齐(一)

    本文主要记录kinect相关的知识和对齐方法,这是第一部分,此记. 深度相机成像方法简介 深度相机就是可以获取场景中物体距离摄像头物理距离的相机.深度相机通常由多种镜头和光学传感器组成,根据测量原理不 ...

  6. wincc的画面怎么用博图打开_博图v13如何打开winccflexible sp4文件

    新款的Winccflexible v3已经没有之前的触摸屏型号了,之前用winccflexible sp4编辑的程序,要怎么打开呢? 问题补充: winccflexible sp4和V3不能同时安装, ...

  7. 彩色图片和深度图片生成点云文件

    输入:深度相机的内参,彩色图和深度图 输出:点云数据 代码:http://download.csdn.net/detail/qq_22904277/9907969

  8. 奥比中光 astra 乐视三合一体感摄像头采集深度图彩色图并保存

    本文参考的文章: 目录 ROS下开发 运行ROS节点 查看相机的话题及画面 订阅画面并保存 Python环境下开发 调用摄像头并保存采集画面 C++环境下开发 C++环境配置 代码编译 ROS下开发 ...

  9. 乐视三合一体感摄像头Astra pro开发记录1(深度图、彩色图及点云简单显示)

    在某鱼上淘的乐视三合一体感摄像头,捡漏价九十几块,买来玩玩. 网上已经有一些关于此款摄像头的开发资料. 官方的开发资料:官网链接 按官方网站以及其他帖子,下载并安装相机的驱动和SDK,不难配置好相机. ...

  10. 渲染彩色图(渲染深度图)

    渲染彩色图(渲染深度图) 彩色图 根据像素的某一属性将像素值由黑白变换到彩色空间,以深度图举例 直方图拉伸 为体现深度差异,对深度图进行直方图拉伸 彩色空间变换 根据直方图0~255的拉伸,变换到彩色 ...

最新文章

  1. ftp 信息服务器日常维护,Web Ftp Mail服务器的日常管理与维护
  2. springboot中aop的应用场景_自然语言处理工具包 HanLP在 Spring Boot中的应用
  3. 明天要中秋节了,先来到简单“类”的题目
  4. python递归求5!_Python | 递归
  5. 复杂一点的二叉树递归
  6. 想减少代码量,快设置一个有感知的 Aware Spring Bean
  7. [Ubuntu] change mouse scrolling between standard and natural
  8. iOS开发UI篇--仿射变换(CGAffineTransform)使用小结
  9. 提取小米主题内部的桌面锁屏壁纸图片步骤
  10. SiteMesh3使用介绍及配置方法
  11. PS2020制作电子签名
  12. android鲁班压缩
  13. T检验是做什么的? --ttest--ttest2--matlab
  14. python模拟ios_使用Xcode + Python进行IOS运动轨迹模拟!
  15. 马尾神经损伤—腰突压迫神经
  16. Java实例——Java方法
  17. Matlab中IFFT/FFT注意事项及在OFDM仿真中的应用问题
  18. PS合成图片#ps抠图#ps视频教程入门基础学习课程小白
  19. 2-4 Python初中级工程师技能要求和面试标准
  20. wampserver下的mysql不能运行以及windows下mysql的启动后马上停止关闭

热门文章

  1. css属性中如果后面个三个值,那么中间的那个一般代表左右元素的值。
  2. samba服务器之无认证进入共享目录
  3. react - next.js 引用本地图片和css文件
  4. SOAP、WSDL、 UDDI之间的关系
  5. 自动化测试selenium(四)check,选中复选框,操作一组元素
  6. 【BZOJ4196】[Noi2015]软件包管理器 树链剖分
  7. proxool数据库连接池使用方法
  8. MEncoder的基础用法—6.3. 编码为双通道MPEG-4 (DivX)
  9. JS在当前页面中调用iframe中的方法
  10. C++11 decltype