该代码源于《视觉SLAM十四讲》 joinMap.cpp
主要是用已知的图片(5张彩色+5张深度图)+ pose.txt(相机位姿-> 前三位是xyz轴方向上的平移量,后四位是旋转四元数实部+虚部; 用以上数据得到点云
思路: 先用位姿数据计算得出旋转矩阵T
而后根据图片的像素坐标以及相机内参计算得出实物的相机坐标;最后将相机坐标转换为世界坐标
操作注意事项:
1. 先在build文件夹路径下编译源码 得到可执行文件;
2. 将可执行文件复制到 pose.txt路径下(该路径下还有存放彩色图和深度图的文件夹) 而后执行./joinMap 得到.pcd 地图
3. 执行pcl_viewer map.pcd 用可视化程序显示拼接的地图

该页代码用于日后查找方便 (添加了部分笔记)

#include <iostream>
#include <fstream>
using namespace std;
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <Eigen/Geometry>
#include <boost/format.hpp>  // for formating strings#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>int main( int argc, char** argv )
{vector<cv::Mat> colorImgs, depthImgs;    // 彩色图和深度图 每张图用矩阵存储 多张图以向量形式表示vector<Eigen::Isometry3d> poses;   //欧式变换矩阵  4 *4    // 相机位姿//读操作(输入)的文件类ifstream fin("./pose.txt");//每行前三个数是平移(xyz) 后四个是四元数 指的是相机姿态if (!fin){cerr<<"请在有pose.txt的目录下运行此程序"<<endl;return 1;}for ( int i=0; i<5; i++ ){//boost::format 类似C++中的printfboost::format fmt( "./%s/%d.%s" ); //图像文件格式colorImgs.push_back( cv::imread( (fmt%"color"%(i+1)%"png").str() ));//str() 函数将对象转化为适于人阅读的形式。depthImgs.push_back( cv::imread( (fmt%"depth"%(i+1)%"pgm").str(), -1 )); // 使用-1读取原始图像double data[7] = {0};for ( auto& d:data )fin>>d;//最后一位是四元数实部Eigen::Quaterniond q( data[6], data[3], data[4], data[5] );Eigen::Isometry3d T(q);T.pretranslate( Eigen::Vector3d( data[0], data[1], data[2] ));poses.push_back( T );//T是 相机位姿(装的是5张图的位姿)}// 计算点云并拼接// 相机内参 double cx = 325.5;double cy = 253.5; //平移double fx = 518.0;double fy = 519.0;//缩放×焦距double depthScale = 1000.0;cout<<"正在将图像转换为点云..."<<endl;// 新建一个点云//PointCoud::Ptr是一个智能指针类 通过构造函数初始化指针指向的申请的空间/*Ptr是一个智能指针,返回一个PointCloud<PointT> 其中PointT是pcl::PointXYZRGB类型。它重载了->  返回了指向PointCloud<PointT>的指针*Ptr是下面类型 boost::shared_ptr<PointCloud<PointT> > *//*pointCloud 是一个智能指针类型的对象 具体可以参考http://blog.csdn.net/worldwindjp/article/details/18843087*/// 定义点云使用的格式:这里用的是XYZRGBtypedef pcl::PointXYZRGB PointT; typedef pcl::PointCloud<PointT> PointCloud;// 新建一个点云PointCloud::Ptr pointCloud( new PointCloud ); for ( int i=0; i<5; i++ ){cout<<"转换图像中: "<<i+1<<endl; cv::Mat color = colorImgs[i]; cv::Mat depth = depthImgs[i];Eigen::Isometry3d T = poses[i];for ( int v=0; v<color.rows; v++ )for ( int u=0; u<color.cols; u++ ){unsigned int d = depth.ptr<unsigned short> ( v )[u]; // 深度值(第v行u列)if ( d==0 ) continue; // 为0表示没有测量到Eigen::Vector3d point; //像素坐标point[2] = double(d)/depthScale; //Z 深度point[0] = (u-cx)*point[2]/fx;//x坐标point[1] = (v-cy)*point[2]/fy; Eigen::Vector3d pointWorld = T* point ;//将相机坐标系下的坐标变换到世界坐标系PointT p ;p.x = pointWorld[0];p.y = pointWorld[1];p.z = pointWorld[2];/*  color.step 虽然是一个类,但是它内部有一个转换操作符 operator size_t() const;
131                  * 此时的color.size编译器就会把它当做size_t类型的变量,这个值的大小是1920 这个是随着图像的读入MAT类中会有自动转换然后存储的buf[]中 */p.b = color.data[ v*color.step+u*color.channels() ];p.g = color.data[ v*color.step+u*color.channels()+1 ];p.r = color.data[ v*color.step+u*color.channels()+2 ];pointCloud->points.push_back( p );}}pointCloud->is_dense = false;cout<<"点云共有"<<pointCloud->size()<<"个点."<<endl;pcl::io::savePCDFileBinary("map.pcd", *pointCloud );return 0;
}

5张彩色图+5张深度图+PCL= 点云拼接相关推荐

  1. 奥比中光-Astra相机如何用python实现输出RGB彩色图和Depth深度图,并输出三维坐标代码

    目前项目组在做这个跟结构光相机相关的课题,我在网上调研了几款相机后,最终确定了使用国产奥比中光的相机,主要原因还是性价比高. 下面介绍如何通过python代码实现调用相机的彩色图像和深度图像: 首先你 ...

  2. RGB彩色图、Depth深度图

  3. python opencv cv.applyColorMap()函数(颜色映射)ColormapTypes【将Intel Realsense D435深度图的黑白图映射为彩色图】

    文章目录 API ColormapTypes 完整应用代码[将深度图的黑白图映射为彩色图] map原理 能否map CV_24UC3的? API def applyColorMap(src, colo ...

  4. 使用OpenCV可视化Intel Realsensen D435 深度图为彩色图

    使用OpenCV可视化Intel Realsensen D435 深度图为彩色图 使用OpenCV将深度图转化为彩色图像,主要使用下面两个函数: cv2.convertScaleAbs(depth_i ...

  5. c++ opencv 灰度图转彩色图

    灰度图转彩色图______主要作用:在图上画彩色线条等等 //灰度图转彩色图 cv::Mat grayToRGB(const cv::Mat input_img) {//创建一个和灰度图一样大小的0值 ...

  6. 全民直播CTO张云龙:已全面迁移至阿里云

    全民直播CTO张云龙:已全面迁移至阿里云 "建设一家大型的直播平台充满了技术挑战,毫不夸张的说,直播平台囊括了几乎所有的主流互联网技术--Web站点.APP客户端.音视频编解码.即时聊天.充 ...

  7. 数据装载指定一张表或者多张表直接装载到目标表_10

    数据装载指定一张表或者多张表,直接装载到目标表 文章目录 1. 复制脚本 2. 直接加载目标表 1. 复制脚本 # 切换oracle su - oracle# 进入根目录 cd /app/jiazai ...

  8. 云图说|一张图看懂一站式DevOps利器——华为云DevCloud

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要: 华为云DevCl ...

  9. mysql导入库排除某个表_mysql导入数据排除表-mysql导入数据排除某张表或多张表-吾爱编程网...

    mysql在导出数据的时候可以使用--ignore-table参数来排除某张或者多张表,在数据库导入同样也可以使用,接下来吾爱编程就为大家介绍一下关于mysql导入数据排除某张表或多张表的方法,有需要 ...

最新文章

  1. 《kafka中文手册》- 构架设计(一)
  2. #164 (Div. 2)
  3. golang 时间原点 时间日期格式化
  4. 正交相机下实现滚轮按钮拖动,滚动滚轮缩放的功能
  5. 深层学习:心智如何超越经验2.4 前景
  6. EasyUI——实现展示后台数据代码
  7. Teams数据统计 - 用户在线离线状态
  8. 【强化学习】A3C代码注释版本
  9. 去哪儿-12-city-search-logic
  10. iFixit:手机屏幕底部安装小芯片致第三方维修iPhone 13屏幕更难
  11. 【linux】xrander/cvt自定义分辨率
  12. qxdm无法安装问题闪一下_Qualcomm QXDM
  13. linux把mac格式化了,Mac上将树莓派已经写了系统的SD卡(磁盘)抹除、格式化
  14. 2017数学建模b题回顾_年度回顾:2017年的Java
  15. 蔡学镛:架构师最重视的文档 转
  16. dedecms 安装后 管理后台ie假死 无响应的解决方法
  17. html发短信模版,短信模板管理.html
  18. mysql error1682_mysql5.7报错 1546、1577和1682问题分析
  19. Hyperautomation for the enhancement of automation in industries 论文翻译
  20. uni-app 超好用的时间选择器组件(起止时间)

热门文章

  1. Centos7_5(CentOS-7-x86_64-Minimal-1804)+xfce界面环境
  2. Java反射探索研究
  3. Excel单元格格式
  4. 实习面试----苏州意能通一面面试
  5. redis web工具
  6. 骁龙8gen1和a16哪个好 骁龙8gen1和a16差距
  7. 架构师成长系列 - 能力认知(2)
  8. 一个新手第一次做项目的求助
  9. python pdb调试方法
  10. 所谓医者仁心,你配做医生吗?