如何安装openmvG?有教程吗?

开放MVG (Open Multiple View Geometry):开源多视图立体几何库,是cv中处理多视图立体几何的著名开源库。它相信简单性和可维护性,并提供了一组强大的接口。每个模块都经过测试,并尽力提供一致可靠的体验。

地址:github

文档:文档

OpenMVG可以:

解决多视图立体几何的精确匹配问题;

提供SfM所需的一系列特征提取和匹配方法;

完整的SfM工具链(校准、评估、重建、表面处理等)。);

OpenMVG尽量提供可读的代码供开发者再次开发,核心功能尽量简单,所以你可能需要其他库来完善你的系统。OpenMVG分为几个大模块:

核心库:各功能的核心算法实现;

举例:教你怎么用;

工具链:即一起使用(乱序图像集的特征匹配、SfM、处理颜色和纹理);

#0.安装(win10+VS2013)

当然,第一步是从github clone中克隆代码,然后按照BUILD的说明进行操作。应该指出的是:

模板& ltT类& gt内联测试运算符|(T x,T y){

返回static _ cast & ltT & gt(static _ cast & ltint & gt(x) | static_cast<int & gt(y));

};

建议用opencv编译。方法是在CMakeLists.txt文件中将相应的选项改为on,然后在cmake GUI中添加一个名为opencv_DIR的条目。该值是您已经安装的OpenCV的路径。

OpenMVG写的非常好,也为Windows提供了很好的支持。所以cmake之后就可以编译用VS打开生成的openMVG.sln的解决方案了,时间稍微长一点。我用的VS2013不支持C++: constexpr的新特性,所以建议你用VS2015或者更高版本。如果一定要用VS2013,可以这样做:直接删除src/open mvg/camera/camera _ common . HPP文件中带constexpr的地方,或者改为它。

运行示例,在这里遇到了一个坑:DenseStoraage.h第86行报错:R6010断言失败,这是一个断言错误,在发布模式下不会出现,但在调试模式下几乎是不可避免的。原因是打开Eigen给出的网站可以清楚的看到数据结构是未对齐数组。这个问题对于刚接触openMVG的人来说还是很烦的。openMVG代码优雅,很多数据类型都是从模板类或函数中扩展出来的,各种具体的方法都是通过虚函数来扩展的,而且对Eigen库依赖很大,阻碍了定位问题。经过一天的努力,我终于确定了原因:

文件regions.h中定义的Regions类包含固定大小的可矢量化特征类型的stl容器向量。根据Eigen提供的解决方案,需要做的是:

//最初

typedef STD::vector & lt;FeatureT & gtFeatsT

//更改为

typedef STD::vector & lt;FeatureT,Eigen::aligned _ allocator & lt;FeatureT & gt& gtFeatsT

//其他类似的地方要改,包括返回vector的函数,最好加上Eigen _ make _ aligned _ operator _ new。

#1.核心库

#1.1图像

#图像容器

OpenMVG提供了一个作为图像容器的基本类:image

//8位灰度图像:

图片& lt无符号字符& gt灰度_图像_ 8bit

//多通道图像:(使用预定义的像素类型)

//8位RGB图像:

图片& ltRGBColor & gtrgb _ image _ 8bit

// 8位RGBA图像

图片& ltRGBAColor & gtrgba _ image _ 8bit

图片& ltRgba & lt无符号字符& gt& gtrgba _ image2 _ 8bit

这里的RGBColor和RGBAColor是openMVG基于Eigen定义的类型,具体在pixel_types.hpp中

#图像输入/输出

OpenMVG支持ppm/PGM、JPEG、PNG和TIFF格式的图像文件。示例:

图片& ltRGBColor & gtrgb _ image _ gray

bool bRet = ReadImage(" foo . img extension ",& ampRGB _ image);

#绘图操作

用于画圆、椭圆、直线等。在图像上。

#1.2值

OpenMVG重新打包了Eigen的基本类型和算法,以便于调用。例如,Vec2表示二维点(char类型)。

#1.3功能

该模块主要提供特征容器的封装,包括特征、特征描述、关键点集等。,基本上都是模板类。例如,顶部sift特征描述符可以这样做:

// SIFT like描述符

typedef描述符& ltfloat,128 & gt;siftDescriptorData

#1.4摄像头

该模块提供不同相机型号的抽象类,包括:

#针孔摄像机型号

最简单的相机模型,如图:相机模型包括内部参数和外部参数,关键词大家都很熟悉:投影矩阵、旋转平移矩阵、焦距、主点等。详见说明。看一个例子:openMVG提供的PinholeCamera类:

///针孔摄像机P = K[R|t],t = -RC

结构针孔照相机

{

//构造函数

针孔摄像机(

const Mat3 & ampK = Mat3::Identity(),

const Mat3 & ampR = Mat3::Identity(),

const Vec3 & ampt = Vec3::Zero())

:_K(K),_R(R),_t(t)

{

_ C =-r . transpose()* t;

P_From_KRt(_K,_R,_t,& amp_ P);

}

针孔摄像机(const Mat34 & ampp)

{

_ P = P

KRt_From_P(_P,& amp_K,& amp_R,& amp_ t);

_ C =-_ r . transpose()* _ t;

}

///投影矩阵P = K[R|t]

mat 34 _ P;

///固有参数(焦点,主点)

mat 3 _ K;

///外部旋转

mat 3 _ R;

///外部转换

ve C3 _ t;

///摄像机中心

ve C3 _ C;

};

#1.5多视图几何图形

这一部分是基本且重要的模块之一,包括:

n(& gt;=2)求解视角的算法;

——内核;,组合这些算法进行稳健估计的通用框架;

文档里解释了单应矩阵,特征矩阵,本质矩阵,位置矩阵的概念,很好。建议仔细阅读文档。简单解释一下:

单应矩阵:描述两个投影平面之间的关系;

特征矩阵:两个相机成像的同一场景之间的关系,即两个视角下物体上A点的成像位置之间的关系;

本质矩阵:在建立内禀矩阵和内参数矩阵的基础上,描述摄像机与内禀矩阵位置的相对关系;

位置矩阵:估计摄像机的绝对位置(转化为极小化问题);

内核:结合了求解器、数据、测量方案等的类。,其将用于稳健地估计上述参数和矩阵;

#1.6线性规划

用于解决多视图几何中的线性优化(参数估计)的工具集,文档。

#1.7稳健估计

提供了一些列的稳健估计方法,如最大一致性、最大一致性、AC-Ransac和反向Ransac等。

#1.7匹配

提供的接口包括:NNS,K-NN,FLANN,KVLD,级联哈希最近邻等。这些接口可用于二维或三维点集和更高维的特征描述集中。

#1.8跟踪

多视角几何中的跟踪是指在一系列图片中寻找对应的特征点(同一点在不同视角下的位置)。

#1.9平方英尺

openMVG提供的sfm模块包含了一系列处理SfM问题的方法和数据存储接口,如相机位置估计、结构测量、BA等。SfM_Data类包含SfM的所有输入:

结构SfM_Data

{

///考虑的视图

视图视图;//包含图像文件名,id_view,id_pose,id_intrinsic,图像大小。

///考虑的姿势(由view.id_pose索引)

摆poses;//摄像机的3D位置

///被认为是相机的内在特性(由view.id_cam索引)

Intrinsics intrinsics//相机内部参考

///结构(3D点及其2D观测值)

地标结构;//与2D视图要素相关联的3D点

}

以下是一些例子:

#1.features_siftPutativeMatches

这个例子做了几件事(直接翻译成官方):

提取两幅图像的SIFT特征(使用非自由vlsift)并形成特征描述;

根据特征描述符匹配两幅图像上的特征点(强力L2方法);

显示匹配结果;

刚开始会遇到断言失败断言错误,处理方法见上一篇文章。成功的项目目录中会生成三个文件:00_images.jpg、01_features.jpg、02_siftMatches.svg

#2.特征_仿射_演示

这个例子是图像的MSER(参考)和TBMR特征提取的例子。MSER(最大稳定极值区域)是一种对图像灰度不变的仿射变换,这可能是这个例子被命名的原因。TBMR(基于树的莫尔斯区域)的算法不是特别了解,但可以在谷歌学术搜索。

#3.特征_图像_匹配

本例给出了一个使用Image_describer接口提取特征描述符并匹配显示结果的例子。例子中可以选择SIFT,AKAZE_MLDB或者AKAZE算法,这里可以看到AKAZE的介绍,这是一种比SIFT更稳定的特征检测算法。程序中关于解析输入参数的部分可以注释掉(如果你用过VS2013 debug),直接修改sImage_describer_type _ Type的值进行测试即可。

#4.特征_ kvld _滤波器和特征_可重复性

这两个也是关于特征提取和匹配的。在这个kvld的例子中,因为regions.h中的内容之前已经被改变了,所以一些函数接口也要做相应的改变,具体来说就是在vector中增加了对齐函数选项。

# 5.多视图_鲁棒_同调_引导和多视图_鲁棒_基本_引导

这两个例子估计了单应矩阵和特征矩阵,可以根据这些信息依次确定匹配点。这两个样本已经运行了很长时间(当分辨率太高时)。第一张在使用另一张照片时遇到错误,大概是狗的时候,我就不细说了...

#6.exif _解析

提取EXIF信息,编译并通过命令行执行。给定的参数格式是:- imafile,你的照片路径,在路径中使用/斜杠。

另一篇文章:学习openMVG-安装和介绍

#7.多视图_鲁棒_基本

估计本质矩阵并计算3D结构。这个例子可以直接运行,生成的点云非常稀疏,没有颜色信息。