#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> //#define EIGEN_DONT_VECTORIZE
//#define EIGEN_DISABLE_UNALIGNED_ARRAY_ASSERT int main( int argc, char** argv )
{
vector<cv::Mat> colorImgs, depthImgs; // 彩色图和深度图
vector<Eigen::Isometry3d, Eigen::aligned_allocator<Eigen::Isometry3d>> poses; // 相机位姿 ifstream fin("./pose.txt");//读取相机位姿 如果没有相机位姿呢?相机位姿在哪里?
if (!fin)
{
cerr<<"请在有pose.txt的目录下运行此程序"<<endl;
//return 1;
} for ( int i=; i<; i++ )
{
boost::format fmt( "./%s/%d.%s" ); //图像文件格式
colorImgs.push_back( cv::imread( (fmt%"color"%(i+)%"jpg").str() ));
depthImgs.push_back( cv::imread( (fmt%"depth"%(i+)%"jpg").str(), - )); // 使用-1读取原始图像 double data[] = {};
for(int j=;j<;j++)
{
double d=;
fin>>d;
data[j]=d;
}
//for ( auto& d:data )
//fin>>d;
Eigen::Quaterniond q( data[], data[], data[], data[] ); //旋转4变量
Eigen::Isometry3d T(q);
T.pretranslate( Eigen::Vector3d( data[], data[], data[] )); //平移3变量
poses.push_back( T );
} // 计算点云并拼接
// 相机内参
double cx = 315.9;// 319.5
double cy = 230.3;// 239.5
double fx = 371.5;// 490.3
double fy = 374.2;// 490.3
double depthScale = 1000.0; cout<<"正在将图像转换为点云..."<<endl; // 定义点云使用的格式:这里用的是XYZRGB
typedef pcl::PointXYZRGB PointT;
typedef pcl::PointCloud<PointT> PointCloud; // 新建一个点云
PointCloud::Ptr pointCloud( new PointCloud );
for ( int i=; i<; i++ )
{
cout<<"转换图像中: "<<i+<<endl;
cv::Mat color = colorImgs[i];
cv::Mat depth = depthImgs[i];
Eigen::Isometry3d T = poses[i]; //姿态
for ( int v=; v<color.rows; v++ )
for ( int u=; u<color.cols; u++ )
{
unsigned int d = depth.ptr<unsigned short> ( v )[u]; // 深度值
if ( d== ) continue; // 为0表示没有测量到
Eigen::Vector3d point;
point[] = double(d)/depthScale; //深度值除以1000
point[] = (u-cx)*point[]/fx; //X
point[] = (v-cy)*point[]/fy; //Y
Eigen::Vector3d pointWorld = *point; //转世界坐标 PointT p ;
p.x = pointWorld[]; //世界坐标x
p.y = pointWorld[]; //世界坐标y
p.z = pointWorld[]; //世界坐标z
p.b = color.data[ v*color.step+u*color.channels() ]; //颜色b
p.g = color.data[ v*color.step+u*color.channels()+ ]; //颜色g
p.r = color.data[ v*color.step+u*color.channels()+ ]; //颜色r
pointCloud->points.push_back( p );
}
} pointCloud->is_dense = false;
cout<<"点云共有"<<pointCloud->size()<<"个点."<<endl;
pcl::io::savePCDFileBinary("map.pcd", *pointCloud );
system("pause");
return ;
}

VS生成的C++项目常用目录设置:https://blog.csdn.net/CreateUserName_Keep/article/details/78884195

VS2010项目属性的默认包含路径设置方法:

可是用cloud_viewer.exe map.pcd在命令行却说“应用程序无法正常启动0xc000007b”,这一定是因为pcl的外部链接库没有添加到path路径或者是缺少dll文件导致的。但是在pcl目录下却可以

这个很明显不大对

https://blog.csdn.net/u012423865/article/details/78036543

https://blog.csdn.net/blademan1234/article/details/79796901

问题:真实距离是多少?为什么绘制的效果很差。。。噪声太多?

操作:

JoinMap的更多相关文章

  1. 视觉slam十四讲ch5 joinMap.cpp 代码注释(笔记版)

    #include <iostream> #include <fstream> using namespace std; #include <opencv2/core/co ...

  2. octomap的简介

    装载自高翔博士的博客:https://www.cnblogs.com/gaoxiang12/p/5041142.html 什么是octomap? RGBD SLAM的目的有两个:估计机器人的轨迹,并建 ...

  3. 视觉slam十四讲开源库安装教程

    目录 前言 1.Eigen线性代数库的安装 2.Sophus李代数库的安装 3.OpenCV计算机视觉库的安装 4.PCL点云库的安装 5.Ceres非线性优化库的安装 6.G2O图优化库的安装 7. ...

  4. SLAM拾萃(1):octomap

    前言 大家好,时隔多年之后,我又开始了博客旅程.经历了很多事情之后呢,我发现自己的想法真的很简单:好好读书做课题,闲下来时写写博客,服务大家.所以我会继续写SLAM相关的博客.如果你觉得它对你有帮助, ...

  5. octomap相关

    转载自http://blog.csdn.net/linuxarmsummary/article/details/50924947 什么是octomap? RGBD SLAM的目的有两个:估计机器人的轨 ...

  6. Spark常用算子-KeyValue数据类型的算子

    package com.test; import java.util.ArrayList; import java.util.List; import java.util.Map; import or ...

  7. 在github上下载子文件夹(svn命令)

    Q: 平时都是用git clone这个命令从github中克隆出完整的文件,但有时我们仅需要其中某个文件夹时,该如何下载? A: 可以使用svn命令来完成. 具体用法:(以视觉slam14讲的gith ...

  8. SpringDataJPA对SimpleJpaRepository/JPARepository返回结果的进一步处理(大体浏览,没细看)

    package com.yb.fw.core.helper; public enum Op { LIKE,// like NOTLIKE,// notlike EQ,// = NOTEQ,// != ...

  9. 大数据之路week07--day04 (YARN,Hadoop的优化,combline,join思想,)

    hadoop 的计算特点:将计算任务向数据靠拢,而不是将数据向计算靠拢. 特点:数据本地化,减少网络io. 首先需要知道,hadoop数据本地化是指的map任务,reduce任务并不具备数据本地化特征 ...

随机推荐

  1. Kotlin Android学习入门

    1.基本语法 https://github.com/mcxiaoke/kotlin-notes/blob/master/kotlin-tutorial-basic.md 2.推荐两篇Kotlin An ...

  2. 【android】SDK在线升级

    1.修改本地hosts文件 hosts文件位置:C:\Windows\System32\drivers\etc\hosts 在底部添加:203.208.46.146 dl-ssl.google.com ...

  3. 【升级至sql 2012】sqlserver mdf向上兼容附加数据库(无法打开数据库 'xxxxx' 版本 611。请将该数据库升级为最新版本。)

    sqlserver mdf向上兼容附加数据库(无法打开数据库 'xxxxx' 版本 611.请将该数据库升级为最新版本.) 最近工作中有一个sqlserver2005版本的mdf文件,还没有log文件 ...

  4. VBA7种文档遍历法

    Sub 在选定文档最后加入一句话() '遍历文件 Dim MyDialog As FileDialog On Error Resume Next Application.ScreenUpdating ...

  5. gmake与make的区别

    gnu make在linux下一般是叫make但是如果是在其他的unix系统下,因为有一个原生的makegnu make就改个名字叫gmake了.就这们简单 当port一个老的unix程序,如老的Su ...

  6. win7右下角的网络连接图标不见了~终极必杀技

    1.打开程序管理器(ctrl+alt+delete) 2.在进程那里找到"explorer.exe",然后按结束进程(此时工具栏会消失) 3.然后在文件(程序管理器左上角),点击& ...

  7. 双系统(Windows+Ubuntu)重装Ubuntu后,修复引导

    重装Ubuntu后,重启机器,Windows系统消失了.进入BIOS修改启动顺序,Windows系统恢复了,但是,刚装好的Ubuntu没了,一开机,电脑自动进入Windows. 解决办法: 用装系统的 ...

  8. redis for windows之nosql还需要入门?

    RT:nosql给很多人的感觉就是上手特别快,本文也是一篇入门级的,哎~~ 又写了一篇没有卵用的博文,姑且把它当作一篇文档吧,还是没有发布/订阅.事件...等介绍的一篇残缺文档,幸好废话不是很多,凑合 ...

  9. 浅谈Laravel框架的CSRF

    前文 CSRF攻击和漏洞的参考文章: http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html Laravel默认是开启了CSRF功能, ...

  10. jquery中的data-icon和data-role

    转自:https://blog.csdn.net/Sayesan/article/details/83378524 jquery中的data-icon和data-role    data-role参数 ...