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. 自考网络原理:安全套接字层SSL

    对ssl/tls的理解 前:SSL; 后:TLS: 以下是B站上的up主讲的,非常的深入浅出,讲的很好.感谢技术蛋老师. https://www.bilibili.com/video/BV1KY411 ...

  2. k8s_使用k8s部署博客系统svc、secret、configmap(三)

    service service是抽象Pod对外提供服务的地址,将其固化的作用:屏蔽因pod的创删以及扩缩容带来ip变化.service通过自身定义文件的selector的标签配置匹配到需要提供服务的对 ...

  3. IIS添加MIME类型实现未知文件下载

    application/octet-stream 无需重启

  4. vue 生命周期个人理解

    activated():在vue对象存活的情况下,进入当前存在activated()函数的页面时,一进入页面就触发:可用于初始化页面数据等: created():在模板渲染成html前调用,即通常初始 ...

  5. Apache 基本配置 代理 重定向 跨域 https ssl证书 在windows下常用命令

    官网下载地址 https://httpd.apache.org/ => https://httpd.apache.org/docs/current/platform/windows.html#d ...

  6. MacOS如何使用emoji表情?

    Emoji作为一种表情符号,被现代计算机系统都支持的Unicode编码所采纳,普遍应用于各种社交网络中.而苹果作为第一个引用该这种表情符号的公司,其这种表情符号无疑是同类中最佳的.因为是被Unicod ...

  7. 计算机意外地重新启动或遇到错误windows安装无法继续解决方法

    计算机意外地重新启动或遇到错误windows安装无法继续解决步骤如下: 当win10在安装过程中一直卡在"海内存知己,天涯若比邻"时同样实用 解决方法: 按住shift+f10(或 ...

  8. mybatis动态生成sql示例

  9. freertos 启动任务调度器后卡在svc 0,汇编停在了0x0800014A E7FE B 0x0800014A

    分别引导加载程序和应用程序(带有或不带有FreeRTOS)都可以正常工作. 引导加载程序和应用程序(无需FreeRTOS)可以完美运行. 但是,如果我在应用程序中使用freeRTOS并完成两项任务(显 ...

  10. [2009年NOIP普及组] 分数线划定

    世博会志愿者的选拔工作正在A市如火如荼的进行.为了选拔最合适的人才,A市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试.面试分数线根据计划录取人数的150%划定,即如果计划录取m ...