如何安装openmvG?有教程吗?
地址: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结构。这个例子可以直接运行,生成的点云非常稀疏,没有颜色信息。