Structure From Motion 笔记
期末的大作业使用OpenMVG库进行三维重建,笔记如下:
整体过程:
1. 对多张图片提取特征点(SIFT SURF)
2. 匹配特征点,使用RANSAC算法消除干扰
3. 对于可匹配特征点使用矩阵优化求解库(ceres-solver Osi-Clp SoPlex GLPK)求解摄像机矩阵和位置矩阵(Fundamental Matrix & Essential Matrix),推算出每个摄像机位置和特征点位置
4.应用MVS(Multiple View Stereo-vision)库建立三维的网格Mesh,
如PMVS稠密点云
5.将二维图片纹理映射至三维场景,如MVS推荐的FSSR(Floating Scale Surface Reconstruction)库或MVS-texturing
而CMPMVS库(非开源)支持依次建立网格和纹理
针对PMVS,openMVG提供了导出方法
openMVG_main_openMVG2PMVS -i Dataset/outReconstruction/SfM_Output/ -o Dataset/outReconstruction/SfM_Output/
pmvs Dataset/outReconstruction/SfM_Output/PMVS/ pmvs_options.txt
针对CMPMVS,openMVG提供了导出方法
openMVG_main_openMVG2CMPMVS -i Dataset/outReconstruction/SfM_Output/ -o Dataset/outReconstruction/SfM_Output/
5.选用某种格式保存模型及纹理。使用查看器或游戏引擎进行显示。
OpenMVG按照以下步骤进行SFM重建:
Image listing openMVG_main_SfMInit_ImageListing
Image description computation openMVG_main_ComputeFeatures
Corresponding images and correspondences computation openMVG_main_ComputeMatches
SfM solving (2 methods) openMVG_main_IncrementalSfM
openMVG_main_GlobalSfM
Optional further processing openMVG_main_ComputeSfM_DataColor
openMVG_main_ComputeStructureFromKnownPoses
openMVG_main_ExportUndistortedImages
Optional further processing (3rd party)
Multiple View Stereovision
上述步骤被整合在SfM_GlobalPipeline.py脚本中
Polycode 游戏引擎调用了assimp库以进行3D模型的导入和导出,该库提供了可在windows下使用的3D模型查看器open3mod
Polycode的模型格式为.mesh,与OGRE一致。MVE库和FSSR库的导出格式为.ply,Polycode提供了转换工具polyimport
可能改进的地方
1. 提取特征点的算法可以与高层相关。即先用通用特征点算法提取后估算大致对应关系,然后使特征点的有效范围更大,进行线段或纹理捕捉,提高精度
2. RANSAC后针对特征点稀疏的地方,降低阈值再次提取
3. 非线性优化方法,噪声鲁棒性
OpenMVG库依赖于:
OPENEXIF 读取JPEG EXIF信息头
Eigen 矩阵和向量运算库
flann 处理在高维空间的最邻近搜索
lemon 图和网络数据结构及优化算法
progress 显示进度条
CppUnitLite 单元测试
htmlDoc 文档生成
