三维重建学习之旅(一)

来源:互联网 发布:我的少女时代 知乎 编辑:程序博客网 时间:2024/05/19 00:39

          笔者本身对三维比较感兴趣,无意中在学校中接触到了三维重建,因此在师姐和师兄的指导下,从0开始学习三维重建,越往里面学越感觉到里面的东西很多,在这里我只介绍我自己在三维重建过程中用到的方法、工具和一些算法、参考的博客、论文,其中的很多东西并不是重建中最佳的选择(但每一件我都亲身试验和深入了解过),我在学习中得到的每一点进步都是在前人无私的分享中获得的,因此写此博客的目的也是想将这种分享的精神延续下去。

        我都被自己高大上的言语打动了,不过读者也不要期望太多微笑,本人只是一个不知名大学的在校大学生,水平很有限,接触的东西很有限,阐述过程中也一定会有错误,请大家指正,共同进步。。。。。废话太多了。



1、什么是三维重建?

三维重建 ,英文术语名称是3D Reconstruction.

         顾名思义,三维重建是将三维的物体在虚拟世界中重建出来,通俗点说,我们做的就是照相机的逆操作(照相机是将现实中的物体呈现在二维图片中,而三维重建是将二维图片中的信息在三维虚拟空间中显现)

         如今二维的东西已经不能满足于人们对事物的感知,什么AR、VR炒得很火热,我们不能断定以后的世界将会充满虚拟现实,但我们能肯定的是人类对三维的好奇是不会减少的。

2、三维重建的步骤?

在学习三维重建前,我们可以先大体上了解一下我们在此过程中需要做些什么。所以了解三维重建的一般步骤必不可少,这样我们在做的时候才知道我们为什么要做这个?


(1) 图像获取:
           在进行图像处理之前,先要用摄像机获取三维物体的二维图像。光照条件、相机的几何特性等对后续的图像处理造成很大的影响。

(2)摄像机标定:
          通过摄像机标定来建立有效的成像模型,求解出摄像机的内外参数,这样就可以结合图像的匹配结果得到空间中的三维点坐标,从而达到进行三维重建的目的。

(3)特征提取:
          特征主要包括特征点、特征线和区域。大多数情况下都是以特征点为匹配基元,特征点以何种形式提取与用何种匹配策略紧密联系。因此在进行特征点的提取时需要先确定用哪种匹配方法。

特征点提取算法可以总结为:
           基于方向导数的方法,基于图像亮度对比关系的方法,基于数学形态学的方法三种。
(4)立体匹配:
          立体匹配是指根据所提取的特征来建立图像对之间的一种对应关系,也就是将同一物理空间点在两幅不同图像中的成像点进行一一对应起来。在进行匹配时要注意场景中一些因素的干扰,比如光照条件、噪声干扰、景物几何形状畸变、表面物理特性以及摄像机机特性等诸多变化因素。

(5)三维重建:
          有了比较精确的匹配结果,结合摄像机标定的内外参数,就可以恢复出三维场景信息。由于三维重建精度受匹配精度,摄像机的内外参数误差等因素的影响,因此首先需要做好前面几个步骤的工作,使得各个环节的精度高,误差小,这样才能设计出一个比较精确的立体视觉系统。

上述三维重建的步骤是从百度百科中copy过来的,比较详细地介绍了三维重建的一般过程,笔者也是这样一步步学习的。


3、笔者用到的平台和工具

vs2013+opencv2.4.9

因为opencv 3.0后很多函数发生了一些变化,现在网上的很多资料都是基于opencv3.0以前的版本,所以安装2.0以后的版本便于参考和学习。

4、vs2013+opencv.4.9环境配置

具体参考:http://jingyan.baidu.com/article/75ab0bcbee4b47d6864db2fc.html

按照上述步骤将环境配置完成以后,可以运行以下代码验证是否配置成功:

       

#include <opencv2/opencv.hpp> using namespace std;using namespace cv; int main(){         Mat srcImage1= imread("1.jpg",1);//该图片必须在工程目录下         //如果读入图像失败        if(!srcImage1.data)        {            printf("error");       return false;        }         //显示图像,在哪个个窗口显示        namedWindow("image", CV_NORMAL);//此函数以后会很有用,CV_NORMAL保证输出的图片可拉伸       imshow("image", srcImage1); //void namedWindow(const string& winname, int flags = WINDOW_AUTOSIZE)//用来创建窗口的函数        //此函数等待按键,按键盘任意键就返回        waitKey();         return 0;}

5、学习工程中经常访问的网站和参考书籍

作为开源的计算机视觉库,opencv提供了很多对图像处理的函数,因此对opencv的操作必不可少(相关资料):

《learning opencv》是很经典的一本书

  opencv中文论坛

http://blog.csdn.net/chenyusiyuan/article/details/5072597    邹老师的opencv学习笔记,对学习opencv很有帮助

http://www.opencv.org.cn/opencvdoc/2.3.2/html/modules/calib3d/doc/calib3d.html  opencv相关函数的帮助文档

另外国内现在以三维重建为题材的论文很多,可以到中国知网等搜索阅读。


路漫漫其修远兮。。。共勉



       




          

1 0
原创粉丝点击