IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 利用PCL库构建Mesh三维模型 -> 正文阅读

[人工智能]利用PCL库构建Mesh三维模型

从两张任意拍摄的一对图像(得有大部分重合面积)和相机内参矩阵开始,重建出基于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图比较难看,就不放出来啦!但整体流程是走通了的,感觉还是缺少点优化的代码,最终效果有待提高。走过路过,不要错过,记得点赞加三连,你们的支持就是博主的动力,嘿嘿嘿。

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-04-28 11:50:53  更:2022-04-28 11:52:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 8:46:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码