从两张任意拍摄的一对图像(得有大部分重合面积)和相机内参矩阵开始,重建出基于Mesh的三维模型,美观又实用,还不赶快学起来。本文也是记录一下自己学习过程,废话较多,请多包涵,主要代码已注释,请自行下载观看。

总体路线及原理如下:

为了方便地实现三维重建,本文从多张RGB彩色影像出发,结合相机内参,即可重建出近景的三维模型。第一步,利用RGB彩色图像进行极线校正,将两幅影像中的同名点重映射到同一水平方向。程序中使用Opencv计算图像中的ORB特征点和BRIEF描述子,进行匹配,恢复本质矩阵E,再分解本质矩阵E得到左视图到右视图的旋转矩阵R和平移向量T。经过Opencv中的stereoRectify,initUndistortRectifyMap,remap函数处理,即可得到核线像对。第二步,使用核线像对进行立体匹配,得到视差图。立体匹配有传统的SGM方法,也有基于深度学习的方法。从目前研究进展来看,基于深度学习的端到端神经网络在预测速度和精度上较传统方法都有一定优势,但缺点是不容易部署到实际应用中,训练过程需要较大数据集和显存足够大的GPU。本文比较了端到端的深度学习方法和传统的SGM方法,也在各种端到端深度学习方法之间进行了比较,最终选择了在精度效果较好的方法PSM-Net和实时性较好的方法Any-Net上进行改进,最终得到一个平衡了速度和精度的端到端深度神经网络模型。第三步,对视差图进行后处理。将其转换成点云模型,再做点云配准和融合,最后三角化投影重建曲面。有了融合后的点云模型,可以通过PCL库进行下采样,统计滤波去除离群点,mls移动最小二乘法进行平滑处理,对平滑后的点云进行法线估计,将法线和平滑后的点云拼接到一起,经过三角化得到网格模型。

所有代码可以在这里得到:https://github.com/gpcv-luochong/3d_reconstruction

首先是原始影像加相机内参矩阵:

K=【 2905.88 0 1416
0 2905.88 1064
0 0 1】

1.核线校正(ubuntu下配置好opencv,使用VSCode打开文件夹。)

点击rectify_image.cpp,配置好launch.json,tasks.json,c_cpp_properties.json这三个文件,如下图所示

launch.json
{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387"version": "0.2.0","configurations": [{"name": "(gdb) Launch","type": "cppdbg","request": "launch","program": "${workspaceFolder}/${fileBasenameNoExtension}.out","args": [],"stopAtEntry": false,"cwd": "${workspaceFolder}","environment": [],"externalConsole": true,"preLaunchTask": "build","MIMode": "gdb","setupCommands": [{"description": "Enable pretty-printing for gdb","text": "-enable-pretty-printing","ignoreFailures": true}]}]
}
tasks.json
{"version": "2.0.0","tasks": [{"type": "cppbuild","label": "build","command": "/usr/bin/g++","args": ["-fdiagnostics-color=always","-g","${file}","-o","${fileBasenameNoExtension}.out","-I", "/usr/local/include","-I", "/usr/local/include/opencv2","-L", "/usr/local/lib","-l", "opencv_calib3d","-l", "opencv_core","-l", "opencv_imgproc","-l", "opencv_imgcodecs","-l", "opencv_video","-l", "opencv_ml","-l", "opencv_highgui","-l", "opencv_objdetect","-l", "opencv_features2d","-l", "opencv_flann","-l", "opencv_imgcodecs","-l", "opencv_photo","-l", "opencv_videoio"],"options": {"cwd": "${workspaceFolder}"},"problemMatcher": ["$gcc"],"group": {"kind": "build","isDefault": true},"detail": "compiler: /usr/bin/g++"}]
}
c_cpp_properties.json
{"configurations": [{"name": "Linux","includePath": ["${workspaceFolder}/**","/usr/local/include","/usr/local/include/opencv2"],"defines": [],"compilerPath": "/usr/bin/g++","cStandard": "gnu17","cppStandard": "gnu++14","intelliSenseMode": "linux-gcc-x64"}],"version": 4
}

点击VSCode中Terminal菜单下的的Run Build Task,编译rectify_image.cpp,生成rectify_image.out文件。再点击Terminal菜单下的New Terminal,再输入

./rectify_image.out ./images/001.JPG ./images/002.JPG

就可以校正图片了(注意如果要校正自己的图片,需要修改rectify_image.cpp里的相机内参K)。

在文件夹下可以得到image1.png和image2.png。

2.立体匹配(传统SGBM方法,深度学习方法)

我们先用传统的SGBM方法获得视差图,再转成点云图。(因为单目相机缺少基线距离,深度信息有所丢失,但深度值和视差值相差一个倍率,在显示上来看是没有多大问题的,不妨设基线距离为1。奇怪的是我用VSCode编译sgbm.cpp文件,编译成功,但是使用./sgbm.out命令执行程序时,出现错误double free or corruption (out)。但是从终端进入build文件夹后,cmake ..,make,./sgbm,程序运行良好。真的是奇了怪了,就这个bug,我调了一天,头都是大的。运行代码需要配置opencv和pcl,看看其他博客应该就可以配置成功,祝你好运)

直接调用opencv中sgbm方法得到的视差图效果较差,存在很多空洞,感兴趣的朋友可以继续优化视差图。整个三维重建中如何获得视差图是很重要的一个环节,直接决定了后续结果是否正确,所以值得研究。但本人为了尽快搞完整个流程,就不在此多费时间,进入下一步,构建Mesh啦!

视差图:

点云图:

3.点云图转Mesh的模型(需要pcl库,自行百度安装)

//ubuntu终端下进入3d_reconstruction/point2mesh文件夹,依次执行以下命令编译point2mesh.cpp文件
cd point2mesh
mkdir build
cmake ..
make
./point2mesh

最终重建出的Mesh图比较难看,就不放出来啦!但整体流程是走通了的,感觉还是缺少点优化的代码,最终效果有待提高。走过路过,不要错过,记得点赞加三连,你们的支持就是博主的动力,嘿嘿嘿。

利用PCL库构建Mesh三维模型相关推荐

  1. 利用PCL库做简单的三维立体图形

    利用PCL库画简单的三维立体图形需要知道各种图形的参数方程,然后给每个参数赋值便可以. 圆柱面的参数方程为:x = R*cos(θ); y = R*sin(θ); z = z;其中 θ范围是[-2*P ...

  2. 利用pcl库实现简单单帧障碍物检测

    利用pcl库实现简单单帧障碍物检测 #include <iostream> #include <pcl/common/common_headers.h> #include &l ...

  3. 利用PCL库从点云数据生成深度图像及关键点提取

    利用PCL库从点云数据生成生成深度图像及关键点提取 利用PCL库从点云数据生成深度图像及关键点提取 本想利用标准点云数据库分割成若干块,利用标准点云数据生成深度图像作为数据库用来验证算法,目前效果不是 ...

  4. 利用Multigen Creator构建地形三维模型(CAD地形图--三维模型)

    (以前做过地形建模方面的经验分享给大家,是从我研一交的一篇当做期末作业的文章中节选的,初始数据为1:2000cad地形图,文中主要介绍从等高线到地形模型的几个关键步骤) 3  基于Creator的地形 ...

  5. 学习PCL库:PCL库中的IO模块介绍

    公众号致力于点云处理,SLAM,三维视觉,高精地图等领域相关内容的干货分享,欢迎各位加入,有兴趣的可联系dianyunpcl@163.com.未经作者允许请勿转载,欢迎各位同学积极分享和交流. IO模 ...

  6. [转载] PCL库相关资源的查找和使用Tip

    前言 学习PCL库的两个月左右时间里,从刚开始的无从下手到慢慢地摸清一些门道,走了很多弯路,也遇到过很多困惑,逐渐有了一些如何查找与利用PCL库学习资源的心得.所以把这些心得记录下来,一是为了给自己以 ...

  7. 学习PCL库你应该知道的C++特性

    要学会PCL首先要对C++进行学习,所以这里我们首先对PCL库的代码中常见的C++的技巧进行整理和概述,并且对其中的难点进行细化讲解.首先我们搞清楚PCL库的文件形式.是一个以CMake构建的项目,库 ...

  8. 随笔:送给初次使用PCL库的小伙伴

    写在前面: PCL库,之前在使用他的时候,只是各种掉库,觉得自己会调库了,根据案例可以跑出来自己想要的结果(比如计算一个点云的边界,使用RANSAC拟合三维直线等)觉得自己就是掌握了,其实并不然,这样 ...

  9. CMake结合PCL库学习(1)

    经常会有有人问到CMake的学习的问题,而且网上也有很多博客是介绍学习CMake 的用法,但是我觉的学习不用这样死板,用到了就顺便学习一下,也就是边做边学,由浅入深,慢慢的就会熟悉了,这个学习的过程中 ...

最新文章

  1. python 图像分割_Python怎么实现图片分割?
  2. BZOJ 2156 「国家集训队」星际探索(最短路)【BZOJ计划】
  3. 400 bad request的原因意思和解决方法
  4. mysql延迟注入br,实验3—SQL注入漏洞的攻击与防御(基于时间延迟的盲注)
  5. OpenStack 企业私有云的若干需求(1):Nova 虚机支持 GPU
  6. HTMLjavaSkcriptCSSjQueryajax(六)
  7. 通过朋友间推广APP,根本不可行
  8. vb科学计算机ppt,科学计算器vb代码.doc
  9. Maven整合SSM项目(七)
  10. ArcGIS API for iOS在俄勒冈大学校园中的创新应用
  11. android 图片释放内存吗,手机内存不足?掌握这几招让手机瞬间释放几个G!
  12. MySQL取离当前时间最近的记录
  13. Mezzanine Markdown的问题
  14. 张艾迪(创始人):世界第一天才的故事
  15. 字符串处理,输入N个学生的名字,按字母顺序输出
  16. 渗透测试漏洞平台DVWA-参考答案
  17. 使用ExcelJs导出表格设置样式、添加边框
  18. Linux下同一个Tomcat部署多个项目不同端口访问
  19. python thinker canvas详解_python thinker canvas create_arc 使用详解
  20. MAC 软件避坑之坚果云

热门文章

  1. HTML 格式化标签
  2. 吸烟的烟民注意了:国家有大动作
  3. c 语言系统下载地址,最新晨晖C语言学习系统下载地址电脑版-CC软件
  4. 如何用PS使图片部分地方变为黑白?
  5. 右手坐标系和左手坐标系(转)很详细,有图示
  6. 多维欧氏距离 余弦相似度 余弦距离 向量求模(范数)计算 pytorch实现
  7. 强化学习入门8—深入理解DDPG
  8. 迟来的《少年的你》短评情感分析
  9. C++ - C - strlen
  10. echarts地图设置区域边界