JoinMap
#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的更多相关文章
- 视觉slam十四讲ch5 joinMap.cpp 代码注释(笔记版)
#include <iostream> #include <fstream> using namespace std; #include <opencv2/core/co ...
- octomap的简介
装载自高翔博士的博客:https://www.cnblogs.com/gaoxiang12/p/5041142.html 什么是octomap? RGBD SLAM的目的有两个:估计机器人的轨迹,并建 ...
- 视觉slam十四讲开源库安装教程
目录 前言 1.Eigen线性代数库的安装 2.Sophus李代数库的安装 3.OpenCV计算机视觉库的安装 4.PCL点云库的安装 5.Ceres非线性优化库的安装 6.G2O图优化库的安装 7. ...
- SLAM拾萃(1):octomap
前言 大家好,时隔多年之后,我又开始了博客旅程.经历了很多事情之后呢,我发现自己的想法真的很简单:好好读书做课题,闲下来时写写博客,服务大家.所以我会继续写SLAM相关的博客.如果你觉得它对你有帮助, ...
- octomap相关
转载自http://blog.csdn.net/linuxarmsummary/article/details/50924947 什么是octomap? RGBD SLAM的目的有两个:估计机器人的轨 ...
- Spark常用算子-KeyValue数据类型的算子
package com.test; import java.util.ArrayList; import java.util.List; import java.util.Map; import or ...
- 在github上下载子文件夹(svn命令)
Q: 平时都是用git clone这个命令从github中克隆出完整的文件,但有时我们仅需要其中某个文件夹时,该如何下载? A: 可以使用svn命令来完成. 具体用法:(以视觉slam14讲的gith ...
- SpringDataJPA对SimpleJpaRepository/JPARepository返回结果的进一步处理(大体浏览,没细看)
package com.yb.fw.core.helper; public enum Op { LIKE,// like NOTLIKE,// notlike EQ,// = NOTEQ,// != ...
- 大数据之路week07--day04 (YARN,Hadoop的优化,combline,join思想,)
hadoop 的计算特点:将计算任务向数据靠拢,而不是将数据向计算靠拢. 特点:数据本地化,减少网络io. 首先需要知道,hadoop数据本地化是指的map任务,reduce任务并不具备数据本地化特征 ...
随机推荐
- vue 整合雪碧图功能
1.通过命令新建一个vue项目 环境要求: 安装有 Node.js. vue. vue-cli . 创建项目: vue init webpack tx_demo cd tx_demo 进入项目,下载依 ...
- Quick guide for converting from JAGS or BUGS to NIMBLE
Converting to NIMBLE from JAGS, OpenBUGS or WinBUGS NIMBLE is a hierarchical modeling package that u ...
- Mysql安装过程中出现apply security settings错误的解决方法
在学习Mysql的过程中,首先要安装Mysql.然而在第一遍安装过程中难免会出现安装错误的时候,当卸载后第二次安装(或者第三次甚至更多次)的时候,往往在安装最后一步会出现apply security ...
- [Android] 开发第六天
Android 布局介绍 LinearLayout 线性布局 RelativeLayout 相对布局 TableLayout 表格布局 FrameLayout 帧布局 ConstraintLayout ...
- Hive-表连接
Hive只支持等值连接,即ON子句中使用等号连接,不支持非等值连接. Hive内置的数据存储类型,TextFile, SequenceFile, ORC(列式存储) 如果连接语句中有WHERE子句,会 ...
- C++ 并发编程 01 线程api
1.使用多线程的好处: 提高性能,分离关注点 2. 多线程所在头文件 <thread> 3. 使用线程方式为std::thread(functioncall),如: #include & ...
- Python中常见的数据类型总结
Python提供多种数据类型来存放数据项集合,主要包括序列(列表list和元组tuple),映射(如字典dict),集合(set),下面对这几种一一介绍: 一 序列 1.列表list 列表是一种有序的 ...
- 《Linux内核精髓:精通Linux内核必会的75个绝技》一HACK #11cpuset
HACK #11cpuset 本节介绍控制物理CPU分配的cpuset.cpuset是Linux控制组(Cgroup)之一,其功能是指定特定进程或线程所使用的CPU组.另外,除CPU以外,同样还能指定 ...
- 关于python-生成HTMLTestRunner测试报告
一.HTMLTestRunner 是 Python 标准库的 unittest 模块的一个扩展,它可以生成 HTML的 测试报告. 1.首先要下 HTMLTestRunner.py 文件,将下载的文件 ...
- selenium webdriver ——执行javascript代码
在代码中import org.openqa.selenium.JavascriptExecutor;就可以使用executeScript.executeAsyncScript这两个方法了 execut ...