SLCM真是博大精深。之前简单的学习了OpenCV,主要是是使用python语言,现在学习SLAM需要使用C++,略难,但比起SLAM本身,不值一提。

《视觉SLAM十四讲》里面的环境主要是在Ubuntu下的,我在虚拟机和JetsonTX2上分别试了一下,按照教程就可以。不过我觉着在Windows10下也能行,所以就搭建了一遍环境,运行完全没问题。其源码的3rdparty文件夹中提供了几个功能库,只需要把头文件和可能有的链接库等加进去就好了,完全可以通过编译,个别还是不行的话,把.cpp文件也用 #include 包含进去试试。后来在第五章时遇到点小问题,但最终还是跑起来了。

  安装PCL等主要参考博客如下: https://blog.csdn.net/weixin_41991128/article/details/83864713

他用的visual studio 2017,我用的visual studio 2019,但是没发现啥区别,所有东西都按2017的装就可以了。

就像里面介绍的,需要把那一大堆的.lib链接库都写进去。注意查看自己的链接库对应的版本,把后面的数字修改为自己的版本就可以了。而且里面有一个快速获取自己的链接库的做法,很方便。还要注意在 属性->c++目录 中的 可执行文件库、包含目录、引用目录、库目录 等选项中将所有的 .h .lib .dll 文件所在的文件夹的绝对目录都加进去。 而一旦报错:..无法解析的外部函数..  以我的经验来看都是链接库没加全造成的。报错:找不到 xx.dll xx.lib  xx.h等都是你的绝对路径没包含全的问题,在前面说的属性中对应的项目里面包含上这些地址好让编译器能找到就可以了。最后就是,包含完后还有问题的话,重新启动一次visual studio 再编译试试。

另外,本测试需要支持opencv,我用的opencv4.1.0版本。因为使用了最基本的opencv操作,所以我觉得opencv3.x以上的版本都能正常运行。

所有的处理都做完后,就可以测试代码了。源码->ch5->joinMap 中的代码直接复制粘贴,修改其中 psoe.txt 和两种图片的地址,然后就能编译了。可是编译后人家是在Ubuntu中显示点云的,在Windows10下命令没用,所以就自己加一个显示的函数。整个函数如下:

  1 #include <opencv2/opencv.hpp>
2 #include<opencv2\core\core.hpp>
3 #include<opencv2\highgui\highgui.hpp>
4
5 #include <boost/format.hpp> // for formating strings
6 #include <pcl/visualization/cloud_viewer.h>
7 #include <iostream>
8 #include <pcl/io/io.h>
9 #include <pcl/io/pcd_io.h>
10 #include <pcl/surface/3rdparty/poisson4/vector.h>
11 #include <pcl/point_types.h>
12
13
14 int main()
15 {
16 pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);//创建一个共享指针并且实例化。注意两个PointXYZRGB要统一,最后显示时还有一个也要统一。当改为PointXYZ表示只输入XYZ坐标值,凸显改为黑白的
17
18 //以下为十四讲中的源码
19 //向量 vector 是一种对象实体, 能够容纳许多其他类型相同的元素, 因此又被称为容器。
20 std::vector<cv::Mat> colorImgs, depthImgs; // 彩色图和深度图
21 std::vector<Eigen::Isometry3d, Eigen::aligned_allocator<Eigen::Isometry3d>> poses; // 相机位姿
22
23 std::ifstream fin("D:\\Mystudy\\opencv_forc\\mycode\\ConsoleApplication1\\ConsoleApplication1\\pose.txt");//注意改成自己存放pose.txt的地址
24 if (!fin)
25 {
26 std::cerr << "请在有pose.txt的目录下运行此程序" << std::endl;
27 return 1;
28 }
29
30 for (int i = 0; i < 5; i++)
31 {
32 boost::format fmt("D:/Mystudy/SLAM/视觉SLAM十四讲源码slambook-master/slambook-master/ch5/joinMap/%s/%d.%s"); //图像文件格式,
33 colorImgs.push_back(cv::imread((fmt % "color" % (i + 1) % "png").str()));
34 depthImgs.push_back(cv::imread((fmt % "depth" % (i + 1) % "pgm").str(), -1)); // 使用-1读取原始图像
35
36 double data[7] = { 0 };
37 for (auto& d : data)
38 fin >> d;
39 Eigen::Quaterniond q(data[6], data[3], data[4], data[5]);
40 Eigen::Isometry3d T(q);
41 T.pretranslate(Eigen::Vector3d(data[0], data[1], data[2]));
42 poses.push_back(T);
43 }
44
45 // 计算点云并拼接
46 // 相机内参
47 double cx = 325.5;
48 double cy = 253.5;
49 double fx = 518.0;
50 double fy = 519.0;
51 double depthScale = 1000.0;
52
53 std::cout << "正在将图像转换为点云..." << std::endl;
54
55 // 定义点云使用的格式:这里用的是XYZRGB
56 typedef pcl::PointXYZRGB PointT;
57 typedef pcl::PointCloud<PointT> PointCloud;
58
59 // 新建一个点云
60 PointCloud::Ptr pointCloud(new PointCloud);
61 for (int i = 0; i < 5; i++)
62 {
63 std::cout << "转换图像中: " << i + 1 << std::endl;
64 cv::Mat color = colorImgs[i];
65 cv::Mat depth = depthImgs[i];
66 Eigen::Isometry3d T = poses[i];
67 for (int v = 0; v < color.rows; v++)
68 for (int u = 0; u < color.cols; u++)
69 {
70 unsigned int d = depth.ptr<unsigned short>(v)[u]; // 深度值
71 if (d == 0) continue; // 为0表示没有测量到
72 Eigen::Vector3d point;
73 point[2] = double(d) / depthScale;
74 point[0] = (u - cx) * point[2] / fx;
75 point[1] = (v - cy) * point[2] / fy;
76 Eigen::Vector3d pointWorld = T * point;
77
78 PointT p;
79 p.x = pointWorld[0];
80 p.y = pointWorld[1];
81 p.z = pointWorld[2];
82 p.b = color.data[v * color.step + u * color.channels()];
83 p.g = color.data[v * color.step + u * color.channels() + 1];
84 p.r = color.data[v * color.step + u * color.channels() + 2];
85
86 //std::cout << p.x<<" "<<p.y<<" "<<p.b<<" " << i + 1 << std::endl;
87 pointCloud->points.push_back(p);
88 }
89 }
90
91 pointCloud->is_dense = false;
92 std::cout << "点云共有" << pointCloud->size() << "个点." << std::endl;
93 pcl::io::savePCDFileBinary("map.pcd", *pointCloud);
94
95 //以下为点云显示代码
96 if (pcl::io::loadPCDFile<pcl::PointXYZRGB>("D:\\Mystudy\\opencv_forc\\mycode\\ConsoleApplication1\\ConsoleApplication1\\map.pcd", *cloud) == -1)//*cloud,指针的内容是文件内容,记得标明点云类型<pcl::PointXYZ>
97 {
98 PCL_ERROR("请检查 xx.pcd 是否存在\n");//pcl有专门的报错函数PCL_ERROR
99 return(-1);
100 }
101 pcl::visualization::CloudViewer viewer("pcd viewer");//给显示窗口命名,CloudViewer
102 viewer.showCloud(cloud);//定义要显示的对象,showCloud
103 //viewer.showCloud(pointCloud);//也可以直接显示上面编译好的点云图,不必保存再读出了
104 system("pause");//此处防止显示闪退
105
106
107 return 0;
108 }

效果图就和在Ubuntu下运行的一样,能够鼠标拖动查看。

本文水平有限,内容很多词语由于知识水平问题不严谨或很离谱,但主要作为记录作用,能理解就好了,希望以后的自己和路过的大神对必要的错误提出批评与指点,对可笑的错误不要嘲笑,指出来我会改正的。

另外,转载使用请注明出处。

随梦,随心,随愿,恒执念,为梦执战,执战苍天!    ------------------执念执战

《视觉SLAM十四讲》visual studio 19 + PCL点云创建图像与现实的更多相关文章

  1. 高博-《视觉SLAM十四讲》

    0 讲座 (1)SLAM定义 对比雷达传感器和视觉传感器的优缺点(主要介绍视觉SLAM) 单目:不知道尺度信息 双目:知道尺度信息,但测量范围根据预定的基线相关 RGBD:知道深度信息,但是深度信息对 ...

  2. 《视觉SLAM十四讲》第2讲

    目录 一 视觉SLAM中的传感器 二 经典视觉SLAM框架 三 SLAM问题的数学表述 注:原创不易,转载请务必注明原作者和出处,感谢支持! 本讲主要内容: (1) 视觉SLAM中的传感器 (2) 经 ...

  3. 浅读《视觉SLAM十四讲:从理论到实践》--操作1--初识SLAM

    下载<视觉SLAM十四讲:从理论到实践>源码:https://github.com/gaoxiang12/slambook 第二讲:初识SLAM 2.4.2 Hello SLAM(书本P2 ...

  4. 《视觉SLAM十四讲》第1讲

    目录 一 视觉SLAM 注:原创不易,转载请务必注明原作者和出处,感谢支持! 一 视觉SLAM 什么是视觉SLAM? SLAM是Simultaneous Localization and Mappin ...

  5. 视觉slam十四讲第七章课后习题6

    版权声明:本文为博主原创文章,转载请注明出处: http://www.cnblogs.com/newneul/p/8545450.html 6.在PnP优化中,将第一个相机的观测也考虑进来,程序应如何 ...

  6. 视觉slam十四讲第七章课后习题7

    版权声明:本文为博主原创文章,转载请注明出处:http://www.cnblogs.com/newneul/p/8544369.html  7.题目要求:在ICP程序中,将空间点也作为优化变量考虑进来 ...

  7. 视觉SLAM十四讲:从理论到实践 两版 PDF和源码

    视觉SLAM十四讲:从理论到实践 第一版电子版PDF 链接:https://pan.baidu.com/s/1SuuSpavo_fj7xqTYtgHBfw提取码:lr4t 源码github链接:htt ...

  8. 高翔《视觉SLAM十四讲》从理论到实践

    目录 第1讲 前言:本书讲什么:如何使用本书: 第2讲 初始SLAM:引子-小萝卜的例子:经典视觉SLAM框架:SLAM问题的数学表述:实践-编程基础: 第3讲 三维空间刚体运动 旋转矩阵:实践-Ei ...

  9. 《视觉SLAM十四讲》学习日志(二)——初识SLAM

    小萝卜机器人的例子: 就像这种机器人,它的下面有一组轮子,脑袋上有相机(眼睛),为了让它能够探索一个房间,它需要知道: 1.我在哪——定位 2.周围环境怎么样——建图 定位和建图可以理解成感知的 &q ...

  10. 《视觉SLAM十四讲》学习日志(一)——预备知识

    SLAM简介 : SLAM是 Simultaneous Localization and Mapping 的缩写,中文译作 " 同时定位与地图构建 ".它是指搭载特定传感器的主题, ...

随机推荐

  1. Navicate破解安装

    1.安装Navicate客户端     2. 注意安装完毕不要打开navicate,打开后后面可能出现rsa public key not found之类的错误,直接点击注册机,选择版本,点击patc ...

  2. centos 6.5 docker  安装

    https://www.cnblogs.com/zhangzhen894095789/p/6641981.html?utm_source=itdadao&utm_medium=referral

  3. EXCEL函数总结

    ------------------截取"号"之前的字符 =MID(A45,1,FIND("号",A45,1)-1)

  4. WSL2安装了Ubuntu之后root不知道密码

    更新了WSL2,安装完 Ubuntu 只要求新建账号和密码,不知道root密码,各种不方便Ubuntu 的默认 root 密码是随机的,即每次开机都有一个新的 root 密码在终端输入命令 sudo ...

  5. mybatis-关联查询2-多对一关联查询

    或者多表单独查询方式

  6. db2iupgrade / db2ckupgrade failure due to SQL0551N

    db2iupgrade / db2ckupgrade failure due to SQL0551N Troubleshooting Problem db2iupgrade or db2ckupgra ...

  7. vite vue插件打包配置

    import { defineConfig, UserConfigExport, ConfigEnv } from "vite"; import externalGlobals f ...

  8. No.1.3

    CSS层叠样式表   /* css注释 */ CSS引入方式 内嵌式:CSS写在style标签中 提示:style标签虽然可以写在页面任意位置,但是通常约定写在 head 标签中(作用范围:当前页面: ...

  9. D2-Net: Weakly-Supervised Action Localization via Discriminative Embeddings and Denoised Activations概述

    1.针对的问题 目前大多数弱监督动作定位方法通常依赖于分离前景和背景区域(前-背景分离)学习TCAMs,但是在弱监督设置下,学习到的TCAM会存在噪声,而这些方法并没有明确地处理其噪声输出. 2.主要 ...

  10. Access denied You do not have access to chat.openai.com. The site owner may have set restrictions that prevent you from accessing the site.解决办法

    报错 Access denied You do not have access to chat.openai.com. The site owner may have set restrictions ...