openMVG原理、编译、源码理解、实践
1、理论
学习链接:
官方github-wiki链接
官方文档链接
其他链接1
其他链接2
其他链接3
其他链接4
2、实践
2.1、源码编译(重点)
-
源码下载
github链接 -
Cmake编译>
(实质:将源码组织成本地可运行的vs解决方案,并没有对源码进行更改或者执行)
配置过程参见
教程1
其中,可将opencv的编译一同进行,参见:
教程(含opencv编译)-1
教程(含opencv编译)-2 -
Vs运行解决方案中不中的项目
- ALL_BUILD:
执行所有的项目文件,运行结果为.lib文件,路径为:
xx\openMVG\build\Windows-AMD64-\
ps: 在debug和release模型下运行分别存储于上述路径的对应文件夹下
- INSTALL:
执行相关项目,生成源码对应的dll\lib\head.h,无论是debug还是release模式下,生成的文件路径及文件名一致,因此为区分两种模式下不同的输出,在生成后将文件名添加’d’/'r’后缀
ps: 结果文件的路径为:CMAKE_PREFIX_PATH
(我的电脑对应于:C:\Program Files (x86)\openMVG)
参考教程
- Samples\
文件夹下为官方示例代码
用于检验先前的步骤是否正确运行
- Softwares\
文件夹下为部分pipeIine的实现,可以理解为是samples的组合
- 编译生成的dll、lib以及头文件.h配置(重要)
可用于其他工程文件,用以调用dll\lib
操作教程 - 遇到的问题
- 报错:无法打开lemon/config.h(openMVG/src/third_party/lemon/lemon/下不存在该文件)
解决办法:下载源码重新编译lemon
并将config.h文件拷贝至上述目录(openMVG/src/third_party/lemon/lemon/)
2.2、其他
- 动态库、静态库的理解 博客讲解
3、 Work1: 根据tutorial_demo.py理解SFM pipeline
(1)、运行tutorial_demo.py:
(2)、源码理解
sfmpipeline 总览(重要)
参考链接
1) 、step1: main_SfMInit_ImageListing.cpp
input:
image、sensor_width_camera_database.txt(相机型号所对应ccdw)
output:
sfmdata.json
sfmdata.json:
SFM算法所需要的相关数据的集合,在初始状态只含有有效的views和intrinsics数据
OpenMVG中 focal length的计算方法:
CCD:相机中镜头后的感光元件,CCD是受光元件(像素)的集合体,接收透过镜头的光并将其转换为电信号。在像素数一样的情况下,CCD尺寸越大单位像素就越大。这样,单位像素可以收集更多的光线,因此,理论上可以说有利于提高画质。参考链接
ccdw:ccd的对角线的长度(涉及英寸与mm的换算)
std::max(width,height)/ccdw
表示单位长度对应的像素数,采用max(…),使长度与对角线长度更接近
exifReader->getFocal()
影像元数据中包含的相机焦距参数——5.58mm
PS:
图像信息“1/400 秒 f/2.8 5.85毫米”,其中,f表示光圈大小
2) 、step2: main_ComputeFeatures.cpp
影像金字塔DOG:
num_octaves = 6,//影像金字塔的层数
num_scales = 3,//影像金字塔的每层的尺度(通过高斯滤波形成不同的尺度)
mask使用:
Region:
3) 、step3: main_MatchingFeatures.cpp
匹配方法:
Putative match——Geometric filter(F\E\H) 几何滤波(涉及RANSAC)
采用基本矩阵F时所采用的方法:A New A Contrario Approach for the Robust Determination of the Fundamental Matrix
Tracks:
(官方链接)
4) 、step4: main_GlobalSFM.cpp
参考另一篇博文:openMVG–GlobalSFM(原理及代码解读)
5)、datacolor\from known pose 暂未细看
6)、其他
- 关键数据及结构理解(官方文档)
- R、C、t理解(注意C与t的区别)
- kenrel理解与使用
- keypointSet
- 代码中常用math类(重定义)
•Vec2将单个2d点存储为列矩阵(x,y)
•Vec3将单个3d点存储为列矩阵(x,y,z)
•Vec2f,Vec3f浮点版本。
•Vec是一个值的向量(双精度)
•Vecf一个浮点值的向量
•Mat对于通用矩阵容器,
•Mat2X收集由2d列存储的列,
•Mat3X将3d点的集合存储为列。
// Create a set of 2D points store as column
//创建一组2D点存储为列
Mat2X A(2, 5);//2行5列
A << 1, 2, 3, 4, 5,
6, 7, 8, 9, 10;
A.col(); // return a column vector : (1,6)^T
A.row(); // return a row vector : (1,2,3,4,5)
- sfm结果查看(可视化)
4、Work2:sfm结果(sfm_data_bin)转换
1)数据转换至openMVS格式(.mvs)
运行编译好的openMVG_main_openMVG2openMVS.exe
xx/openMVG_main_openMVG2openMVS.exe -i sfm_data_bin -o xxx.mvs
PS: 运行过程中自动生成undistorted_images文件夹(存放原始影像)
具体实现及路径设置,还未细看(后期更新)