openMVG原理、编译、源码理解、实践

1、理论

学习链接:
官方github-wiki链接
官方文档链接
其他链接1
其他链接2
其他链接3
其他链接4

2、实践

2.1、源码编译(重点)

  1. 源码下载
    github链接

  2. Cmake编译> (实质:将源码组织成本地可运行的vs解决方案,并没有对源码进行更改或者执行)
    配置过程参见
    教程1
    其中,可将opencv的编译一同进行,参见:
    教程(含opencv编译)-1
    教程(含opencv编译)-2

  3. 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的组合

  1. 编译生成的dll、lib以及头文件.h配置(重要)可用于其他工程文件,用以调用dll\lib
    操作教程
  2. 遇到的问题
  • 报错:无法打开lemon/config.h(openMVG/src/third_party/lemon/lemon/下不存在该文件)
解决办法:下载源码重新编译lemon
并将config.h文件拷贝至上述目录(openMVG/src/third_party/lemon/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的换算)

xxx
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)、其他
  1. 关键数据及结构理解(官方文档
    在这里插入图片描述
  2. R、C、t理解(注意C与t的区别)
    在这里插入图片描述
  3. kenrel理解与使用
    在这里插入图片描述
  4. keypointSet
    在这里插入图片描述
  5. 代码中常用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)
  1. 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文件夹(存放原始影像)
具体实现及路径设置,还未细看(后期更新)

2)转换至其他格式(JSON/XML)

在这里插入图片描述

  • 5
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值