OpenMVG (open Multiple View Geometry):开源多视角立体几何库,这是一个cv届处理多视角立体几何的著名开源库,信奉逗简单,可维护地,提供了一套强大的接口,每个模块都被测试过,尽力提供一致可靠的体验。
地址:github
文档:documents
openMVG能够:
解决多视角立体几何的精准匹配问题;
提供一系列SfM需要用到的特征提取和匹配方法;
完整的SfM工具链(校正,参估,重建,表面处理等);
openMVG尽力提供可读性性强的代码,方便开发者二次开发,核心功能是尽量精简的,所以你可能需要其它库来完善你的系统。openMVG分成了几个大的模块:
核心库:各个功能的核心算法实现;
样例:教你怎么用;
工具链:也就是连起来用咯(乱序图像集的特征匹配,SfM,处理色彩和纹理);
#0 安装(win10+VS2013)
第一步当然是从github clone代码,然后按照 BUILD 说明 *** 作,需要注意的是:
template <class T> inline T operator|(T x, T y){
return static_cast<T>(static_cast<int>(x) | static_cast<int>(y));
};
建议和opencv一起编译,方法是在CMakeListstxt文件中修改相应选项为 ON,然后在cmake的GUI中添加一个叫OpenCV_DIR的入口,值就是你已经安装好的opencv的路径。
openMVG写的非常不错,对Windows也提供了良好的支持,所以cmake之后用VS打开生成的openMVGsln解决方案就可以进行编译了,编译的时间稍久。我用的VS2013不支持C++新特性:constexpr,所以建议你使用VS2015或更新版本,如果一定要用VS2013,可以这样做:在src/openMVG/cameras/Camera_Commonhpp文件中将有constexpr的地方直接去掉,或者改成模板函数也是可以的:
运行样例,这里遇到一个坑:DenseStoraageh line 86报错:R6010 Assertion failed,这是一个断言错误,在release模式下不会出现,但在debug模式下几乎是必现。原因嘛,打开Eigen给出的网址可以明确:数据结构未对齐(unaligned arrays)。这个问题对于刚接触openMVG的人来说还是很烦人的,openMVG代码很优雅,很多数据类型都是从模板类或函数延伸,通过虚函数扩展各项具体方法,而且非常强烈的依赖Eigen这个库,所以给定位问题带来了阻碍。经过一天的攻坚,最后大概确认了原因:
regionsh这个文件中定义的Regions类包含了fixed-size vectorizable Eigen types的stl容器vector,按照Eigen提供的解决方法,需要做的是:
//原来
typedef std::vector<FeatureT> FeatsT;
//改成
typedef std::vector<FeatureT, Eigen::aligned_allocator<FeatureT>> FeatsT;
//其它类似的地方都要改,包括返回vector的函数,最好也加上 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
#1 核心库
#11 图像
#Image Container
openMVG提供一个基本的类用作图像容器:Image<T>,T代表像素类型,这个类可以处理灰度,RGB,RGBA或者自定义类型的图像。用法很简单:
// A 8-bit gray image:
Image<unsigned char> grayscale_image_8bit;
// Multichannel image: (use pre-defined pixel type)
// A 8-bit RGB image:
Image<RGBColor> rgb_image_8bit;
// 8-bit RGBA image
Image<RGBAColor> rgba_image_8bit;
Image<Rgba<unsigned char> > rgba_image2_8bit;
这里的 RGBColor,RGBAColor等是openMVG基于Eigen定义好的类型,具体是定义在pixel_typeshpp中。
#Image I/O
openMVG支持ppm/pgm,jpeg,png,tiff格式的文件,例子:
Image<RGBColor> rgb_image_gray;
bool bRet = ReadImage("FooimgExtension", &rgb_image);
#Drawing operations
用于在图像上画圆,椭圆,直线等。
#12 数值
openMVG重新包装了Eigen的基本类型和算法,以便更简单的调用。比如 Vec2代表一个二维点(char型)。
#13 特征
这个模块主要是提供特征容器的封装,包括特征,特征描述,关键点集等,基本都是模板类,比如顶一个sift特征描述子可以这样做:
// SIFT like descriptor
typedef Descriptor<float, 128> siftDescriptorData;
#14 相机
此模块提供不同的相机模型的抽象类,包括:
#小孔相机模型
最简单的相机模型,如图: 相机模型包括内参和外参,关键词也就是大家熟悉的几样:投影矩阵,旋转、平移矩阵,焦距、主点等,具体参见说明。 看一个例子:openMVG提供的PinholeCamera类:
/// Pinhole camera P = K[R|t], t = -RC
struct PinholeCamera
{
//构造函数
PinholeCamera(
const Mat3 & K = Mat3::Identity(),
const Mat3 & R = Mat3::Identity(),
const Vec3 & t = Vec3::Zero())
: _K(K), _R(R), _t(t)
{
_C = -Rtranspose() t;
P_From_KRt(_K, _R, _t, &_P);
}
PinholeCamera(const Mat34 & P)
{
_P = P;
KRt_From_P(_P, &_K, &_R, &_t);
_C = -_Rtranspose() _t;
}
/// Projection matrix P = K[R|t]
Mat34 _P;
/// Intrinsic parameter (Focal, principal point)
Mat3 _K;
/// Extrinsic Rotation
Mat3 _R;
/// Extrinsic translation
Vec3 _t;
/// Camera center
Vec3 _C;
};
#15 多视角几何
这部分是比较基础和重要的模块之一,包括了:
多视角集几何中n(>=2)视角的求解算法;
将这些求解算法综合起来以便进行鲁棒估计的通用框架——Kernel;
文档中讲解了单应矩阵,本征矩阵,本质矩阵,位置矩阵等的概念,讲得非常好,建议仔细阅读文档。 简单的解释一下:
单应矩阵:描述两个投影平面之间的关系;
本征矩阵:同一个场景在两个相机成像下的关系,也就是物体上的点A在两个视角下成像位置的关系;
本质矩阵:基于本征矩阵和内参矩阵建立,描述相机和本征矩阵位置之间的相对关系;
位置矩阵:估计相机的绝对位置(被转化为一个最小化问题求解);
Kernel:一个将求解器、数据、度量方案等结合起来的类,这个类将用于鲁棒的估计以上的参数和矩阵;
#16 线性规划
一个用于求解多视角几何中线性优化(参数估计)的工具集,文档。
#17 鲁棒估计
提供一些列鲁棒估计方法,比如:Max-Consensus,Max-Consensus,AC-Ransac A Contrario Ransac等。
#17 匹配
提供的接口包括:NNS,K-NN,FLANN,KVLD,Cascade hashing Nearest Neighbor等。这些接口可用于在二维或三维点集,以及更高维的特征描述集中。
#18 追踪
多视几何里的追踪是指在一系列的中找到对应的特征点(同一点在不同视角下的位置)。
#19 sfm
openMVG提供的sfm模块包含了处理SfM问题的一系列方法个数据存储接口,例如相机位置估计,结构测量,BA等。 SfM_Data类包含了SfM所有的输入:
struct SfM_Data
{
/// Considered views
Views views; // 包含图像文件名,id_view,id_pose,id_intrinsic,image size。
/// Considered poses (indexed by viewid_pose)
Poses poses; // 相机的三维位置
/// Considered camera intrinsics (indexed by viewid_cam)
Intrinsics intrinsics; // 相机内参
/// Structure (3D points with their 2D observations)
Landmarks structure; // 二维视图特征关联的3D点
}
下面是例子:
#1 features_siftPutativeMatches
这个样例做了这么几件事(直接翻译官方):
分别提取两张图像的SIFT特征(使用非免费的vlsift)并形成特征描述;
根据特征描述子匹配两张图像上的特征点(BRUTE_FORCE_L2方法);
展示匹配结果;
刚开始的时候会遇到Assertion failed断言错误,处理办法见上一篇文章。运行成功项目目录下会生成三个文件:00_imagesjpg,01_featuresjpg,02_siftMatchessvg。
#2 features_affine_demo
这个例子是图像MSER(参考)和TBMR特征提取的样例,MSER(Maximally Stable Extremal Regions)最大极值稳定区域是一种对图像灰度具有仿射变换不变性,也许也是这个样例起名的原因。TBMR(tree-based Morse regions)这个算法不是特别了解,具体可以在google学术中搜索。
#3 features_image_matching
这个样例给出了利用Image_describer接口提取特征描述子,并匹配和显示结果的样例。示例中可以选择SIFT,AKAZE_MLDB或者AKAZE算法,AKAZE介绍可看这里,是一种比SIFT更稳定的特征检测算法。程序中关于解析输入参数的部分可以注释掉(如果你是用过VS2013 debug),直接修改sImage_describer_type这个值以测试。
#4 features_kvld_filter 和 features_repeatability
这两个也是关于特征提取和匹配的,kvld这个例子中由于之前更改了regionsh中的内容,所以有些函数接口也要做相应改变,具体也是在vector中增加对齐函数选项。
#5 multiview_robust_homography_guided 和 multiview_robust_fundamental_guided
这两个样例是估计单应矩阵和本征矩阵的,并且能够根据这些信息反过来确定匹配点。两个样例运行时间都很长(分辨率教大时),第一个在用另外的照片时还遇到报错,大概是在DoG时出错,具体也没有细究了·····
#6 exif_Parsing
提取EXIF信息,编译后通过命令行执行,给出的参数格式:--imafile 你的照片路径,路径中使用/斜杠。
另一篇:learn openMVG-安装和简介
#7 multiview_robust_essential
估计本质矩阵并计算3D结构。这个例子可以直接运行,生成的点云十分稀疏且不带颜色信息。
由于交易所没有在行情库中公开发布成交笔数数据,因此目前在软件中,市场股票的成交笔数,是指通过行情系统接收到的成交次数,而不是真正的撮合成交次数。而数据分析家筹码雷达的成交笔数是交易所公布的。
笔均量=成交量/成交笔数。每笔成交均量是使用成交量除以沪深交易所公布的个股成交笔数。
每笔金额=成交金额/成交笔数。
每笔均量与成交量的区别
成交量反映了整个市场的交易量的水平。每笔均量是市场每笔成交的水平。
笔均量分析原理,每笔均量在分析中的特殊意义
笔均量只反应主力当天的参与程度。主力吸筹和出货要有一个过程。反映了主力机构参与(控盘)的程度。笔均量一般不能用于横向对比。排序要用笔均额。发现主力要通过个股现在数据与历史数据进行自我对比进行。
许多不少投资者产生了消息是造成股价变动根本原因的误解,整天忙于打探各路消息。一年到头,解套和被套的循环。
笔均量就是一天平均每一张合同的成交量,合同数和行情接收的笔数是完全不同的两样东西。大家体会一下你下一张300手合同的单在分时图上分两三笔成交就可理解其中的不同了。正是因为主力的运作和散户不同:其资金量往往较大,所以每张合同的数量就会比较大。当这些合同较多时,当天的平均量就会较大。笔均量就是利用这个来观察主力的活动的。
当然主力可以用软件把同一数量的股票分成很多合同来降低笔均量,这样笔均量就没用了。不错主力是可以这样做,但是,这也是需要相当的成本的(多了每笔的过户费用)。但这一般只能用在收筹的初级阶段,这个阶段不是我们的介入点,所以不知也罢。随着收筹的完毕,主力必然要令股价有异常的波动,要令股价有所波动就要用大手笔的成交。大家不防想一下,下一张100万的单可能可以让股价波动几毛钱,将其分成100张1万的单股价能波动多少呢?所以股价波动是主力活动的结果,其幅度与主力的资金实力相关,主力如果想把资金分散,那么他就变成散户了。这是必然的!
OpenMVG (open Multiple View Geometry):开源多视角立体几何库,这是一个cv届处理多视角立体几何的著名开源库,信奉逗简单,可维护地,提供了一套强大的接口,每个模块都被测试过,尽力提供一致可靠的体验。
地址:github
文档:documents
openMVG能够:
解决多视角立体几何的精准匹配问题;
提供一系列SfM需要用到的特征提取和匹配方法;
完整的SfM工具链(校正,参估,重建,表面处理等);
openMVG尽力提供可读性性强的代码,方便开发者二次开发,核心功能是尽量精简的,所以你可能需要其它库来完善你的系统。openMVG分成了几个大的模块:
核心库:各个功能的核心算法实现;
样例:教你怎么用;
工具链:也就是连起来用咯(乱序图像集的特征匹配,SfM,处理色彩和纹理);
#0 安装(win10+VS2013)
第一步当然是从github clone代码,然后按照 BUILD 说明 *** 作,需要注意的是:
template <class T> inline T operator|(T x, T y){
return static_cast<T>(static_cast<int>(x) | static_cast<int>(y));
};
建议和opencv一起编译,方法是在CMakeListstxt文件中修改相应选项为 ON,然后在cmake的GUI中添加一个叫OpenCV_DIR的入口,值就是你已经安装好的opencv的路径。
openMVG写的非常不错,对Windows也提供了良好的支持,所以cmake之后用VS打开生成的openMVGsln解决方案就可以进行编译了,编译的时间稍久。我用的VS2013不支持C++新特性:constexpr,所以建议你使用VS2015或更新版本,如果一定要用VS2013,可以这样做:在src/openMVG/cameras/Camera_Commonhpp文件中将有constexpr的地方直接去掉,或者改成模板函数也是可以的:
运行样例,这里遇到一个坑:DenseStoraageh line 86报错:R6010 Assertion failed,这是一个断言错误,在release模式下不会出现,但在debug模式下几乎是必现。原因嘛,打开Eigen给出的网址可以明确:数据结构未对齐(unaligned arrays)。这个问题对于刚接触openMVG的人来说还是很烦人的,openMVG代码很优雅,很多数据类型都是从模板类或函数延伸,通过虚函数扩展各项具体方法,而且非常强烈的依赖Eigen这个库,所以给定位问题带来了阻碍。经过一天的攻坚,最后大概确认了原因:
regionsh这个文件中定义的Regions类包含了fixed-size vectorizable Eigen types的stl容器vector,按照Eigen提供的解决方法,需要做的是:
//原来
typedef std::vector<FeatureT> FeatsT;
//改成
typedef std::vector<FeatureT, Eigen::aligned_allocator<FeatureT>> FeatsT;
//其它类似的地方都要改,包括返回vector的函数,最好也加上 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
#1 核心库
#11 图像
#Image Container
openMVG提供一个基本的类用作图像容器:Image<T>,T代表像素类型,这个类可以处理灰度,RGB,RGBA或者自定义类型的图像。用法很简单:
// A 8-bit gray image:
Image<unsigned char> grayscale_image_8bit;
// Multichannel image: (use pre-defined pixel type)
// A 8-bit RGB image:
Image<RGBColor> rgb_image_8bit;
// 8-bit RGBA image
Image<RGBAColor> rgba_image_8bit;
Image<Rgba<unsigned char> > rgba_image2_8bit;
这里的 RGBColor,RGBAColor等是openMVG基于Eigen定义好的类型,具体是定义在pixel_typeshpp中。
#Image I/O
openMVG支持ppm/pgm,jpeg,png,tiff格式的文件,例子:
Image<RGBColor> rgb_image_gray;
bool bRet = ReadImage("FooimgExtension", &rgb_image);
#Drawing operations
用于在图像上画圆,椭圆,直线等。
#12 数值
openMVG重新包装了Eigen的基本类型和算法,以便更简单的调用。比如 Vec2代表一个二维点(char型)。
#13 特征
这个模块主要是提供特征容器的封装,包括特征,特征描述,关键点集等,基本都是模板类,比如顶一个sift特征描述子可以这样做:
// SIFT like descriptor
typedef Descriptor<float, 128> siftDescriptorData;
#14 相机
此模块提供不同的相机模型的抽象类,包括:
#小孔相机模型
最简单的相机模型,如图: 相机模型包括内参和外参,关键词也就是大家熟悉的几样:投影矩阵,旋转、平移矩阵,焦距、主点等,具体参见说明。 看一个例子:openMVG提供的PinholeCamera类:
/// Pinhole camera P = K[R|t], t = -RC
struct PinholeCamera
{
//构造函数
PinholeCamera(
const Mat3 & K = Mat3::Identity(),
const Mat3 & R = Mat3::Identity(),
const Vec3 & t = Vec3::Zero())
: _K(K), _R(R), _t(t)
{
_C = -Rtranspose() t;
P_From_KRt(_K, _R, _t, &_P);
}
PinholeCamera(const Mat34 & P)
{
_P = P;
KRt_From_P(_P, &_K, &_R, &_t);
_C = -_Rtranspose() _t;
}
/// Projection matrix P = K[R|t]
Mat34 _P;
/// Intrinsic parameter (Focal, principal point)
Mat3 _K;
/// Extrinsic Rotation
Mat3 _R;
/// Extrinsic translation
Vec3 _t;
/// Camera center
Vec3 _C;
};
#15 多视角几何
这部分是比较基础和重要的模块之一,包括了:
多视角集几何中n(>=2)视角的求解算法;
将这些求解算法综合起来以便进行鲁棒估计的通用框架——Kernel;
文档中讲解了单应矩阵,本征矩阵,本质矩阵,位置矩阵等的概念,讲得非常好,建议仔细阅读文档。 简单的解释一下:
单应矩阵:描述两个投影平面之间的关系;
本征矩阵:同一个场景在两个相机成像下的关系,也就是物体上的点A在两个视角下成像位置的关系;
本质矩阵:基于本征矩阵和内参矩阵建立,描述相机和本征矩阵位置之间的相对关系;
位置矩阵:估计相机的绝对位置(被转化为一个最小化问题求解);
Kernel:一个将求解器、数据、度量方案等结合起来的类,这个类将用于鲁棒的估计以上的参数和矩阵;
#16 线性规划
一个用于求解多视角几何中线性优化(参数估计)的工具集,文档。
#17 鲁棒估计
提供一些列鲁棒估计方法,比如:Max-Consensus,Max-Consensus,AC-Ransac A Contrario Ransac等。
#17 匹配
提供的接口包括:NNS,K-NN,FLANN,KVLD,Cascade hashing Nearest Neighbor等。这些接口可用于在二维或三维点集,以及更高维的特征描述集中。
#18 追踪
多视几何里的追踪是指在一系列的中找到对应的特征点(同一点在不同视角下的位置)。
#19 sfm
openMVG提供的sfm模块包含了处理SfM问题的一系列方法个数据存储接口,例如相机位置估计,结构测量,BA等。 SfM_Data类包含了SfM所有的输入:
struct SfM_Data
{
/// Considered views
Views views; // 包含图像文件名,id_view,id_pose,id_intrinsic,image size。
/// Considered poses (indexed by viewid_pose)
Poses poses; // 相机的三维位置
/// Considered camera intrinsics (indexed by viewid_cam)
Intrinsics intrinsics; // 相机内参
/// Structure (3D points with their 2D observations)
Landmarks structure; // 二维视图特征关联的3D点
}
下面是例子:
#1 features_siftPutativeMatches
这个样例做了这么几件事(直接翻译官方):
分别提取两张图像的SIFT特征(使用非免费的vlsift)并形成特征描述;
根据特征描述子匹配两张图像上的特征点(BRUTE_FORCE_L2方法);
展示匹配结果;
刚开始的时候会遇到Assertion failed断言错误,处理办法见上一篇文章。运行成功项目目录下会生成三个文件:00_imagesjpg,01_featuresjpg,02_siftMatchessvg。
#2 features_affine_demo
这个例子是图像MSER(参考)和TBMR特征提取的样例,MSER(Maximally Stable Extremal Regions)最大极值稳定区域是一种对图像灰度具有仿射变换不变性,也许也是这个样例起名的原因。TBMR(tree-based Morse regions)这个算法不是特别了解,具体可以在google学术中搜索。
#3 features_image_matching
这个样例给出了利用Image_describer接口提取特征描述子,并匹配和显示结果的样例。示例中可以选择SIFT,AKAZE_MLDB或者AKAZE算法,AKAZE介绍可看这里,是一种比SIFT更稳定的特征检测算法。程序中关于解析输入参数的部分可以注释掉(如果你是用过VS2013 debug),直接修改sImage_describer_type这个值以测试。
#4 features_kvld_filter 和 features_repeatability
这两个也是关于特征提取和匹配的,kvld这个例子中由于之前更改了regionsh中的内容,所以有些函数接口也要做相应改变,具体也是在vector中增加对齐函数选项。
#5 multiview_robust_homography_guided 和 multiview_robust_fundamental_guided
这两个样例是估计单应矩阵和本征矩阵的,并且能够根据这些信息反过来确定匹配点。两个样例运行时间都很长(分辨率教大时),第一个在用另外的照片时还遇到报错,大概是在DoG时出错,具体也没有细究了·····
#6 exif_Parsing
提取EXIF信息,编译后通过命令行执行,给出的参数格式:--imafile 你的照片路径,路径中使用/斜杠。
另一篇:learn openMVG-安装和简介
#7 multiview_robust_essential
估计本质矩阵并计算3D结构。这个例子可以直接运行,生成的点云十分稀疏且不带颜色信息。
OpenMVG (open Multiple View Geometry):开源多视角立体几何库,这是一个cv届处理多视角立体几何的著名开源库,信奉逗简单,可维护地,提供了一套强大的接口,每个模块都被测试过,尽力提供一致可靠的体验。
地址:github
文档:documents
openMVG能够:
解决多视角立体几何的精准匹配问题;
提供一系列SfM需要用到的特征提取和匹配方法;
完整的SfM工具链(校正,参估,重建,表面处理等);
openMVG尽力提供可读性性强的代码,方便开发者二次开发,核心功能是尽量精简的,所以你可能需要其它库来完善你的系统。openMVG分成了几个大的模块:
核心库:各个功能的核心算法实现;
样例:教你怎么用;
工具链:也就是连起来用咯(乱序图像集的特征匹配,SfM,处理色彩和纹理);
#0 安装(win10+VS2013)
第一步当然是从github clone代码,然后按照 BUILD 说明 *** 作,需要注意的是:
template <class T> inline T operator|(T x, T y){
return static_cast<T>(static_cast<int>(x) | static_cast<int>(y));
};
建议和opencv一起编译,方法是在CMakeListstxt文件中修改相应选项为 ON,然后在cmake的GUI中添加一个叫OpenCV_DIR的入口,值就是你已经安装好的opencv的路径。
openMVG写的非常不错,对Windows也提供了良好的支持,所以cmake之后用VS打开生成的openMVGsln解决方案就可以进行编译了,编译的时间稍久。我用的VS2013不支持C++新特性:constexpr,所以建议你使用VS2015或更新版本,如果一定要用VS2013,可以这样做:在src/openMVG/cameras/Camera_Commonhpp文件中将有constexpr的地方直接去掉,或者改成模板函数也是可以的:
运行样例,这里遇到一个坑:DenseStoraageh line 86报错:R6010 Assertion failed,这是一个断言错误,在release模式下不会出现,但在debug模式下几乎是必现。原因嘛,打开Eigen给出的网址可以明确:数据结构未对齐(unaligned arrays)。这个问题对于刚接触openMVG的人来说还是很烦人的,openMVG代码很优雅,很多数据类型都是从模板类或函数延伸,通过虚函数扩展各项具体方法,而且非常强烈的依赖Eigen这个库,所以给定位问题带来了阻碍。经过一天的攻坚,最后大概确认了原因:
regionsh这个文件中定义的Regions类包含了fixed-size vectorizable Eigen types的stl容器vector,按照Eigen提供的解决方法,需要做的是:
//原来
typedef std::vector<FeatureT> FeatsT;
//改成
typedef std::vector<FeatureT, Eigen::aligned_allocator<FeatureT>> FeatsT;
//其它类似的地方都要改,包括返回vector的函数,最好也加上 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
#1 核心库
#11 图像
#Image Container
openMVG提供一个基本的类用作图像容器:Image<T>,T代表像素类型,这个类可以处理灰度,RGB,RGBA或者自定义类型的图像。用法很简单:
// A 8-bit gray image:
Image<unsigned char> grayscale_image_8bit;
// Multichannel image: (use pre-defined pixel type)
// A 8-bit RGB image:
Image<RGBColor> rgb_image_8bit;
// 8-bit RGBA image
Image<RGBAColor> rgba_image_8bit;
Image<Rgba<unsigned char> > rgba_image2_8bit;
这里的 RGBColor,RGBAColor等是openMVG基于Eigen定义好的类型,具体是定义在pixel_typeshpp中。
#Image I/O
openMVG支持ppm/pgm,jpeg,png,tiff格式的文件,例子:
Image<RGBColor> rgb_image_gray;
bool bRet = ReadImage("FooimgExtension", &rgb_image);
#Drawing operations
用于在图像上画圆,椭圆,直线等。
#12 数值
openMVG重新包装了Eigen的基本类型和算法,以便更简单的调用。比如 Vec2代表一个二维点(char型)。
#13 特征
这个模块主要是提供特征容器的封装,包括特征,特征描述,关键点集等,基本都是模板类,比如顶一个sift特征描述子可以这样做:
// SIFT like descriptor
typedef Descriptor<float, 128> siftDescriptorData;
#14 相机
此模块提供不同的相机模型的抽象类,包括:
#小孔相机模型
最简单的相机模型,如图: 相机模型包括内参和外参,关键词也就是大家熟悉的几样:投影矩阵,旋转、平移矩阵,焦距、主点等,具体参见说明。 看一个例子:openMVG提供的PinholeCamera类:
/// Pinhole camera P = K[R|t], t = -RC
struct PinholeCamera
{
//构造函数
PinholeCamera(
const Mat3 & K = Mat3::Identity(),
const Mat3 & R = Mat3::Identity(),
const Vec3 & t = Vec3::Zero())
: _K(K), _R(R), _t(t)
{
_C = -Rtranspose() t;
P_From_KRt(_K, _R, _t, &_P);
}
PinholeCamera(const Mat34 & P)
{
_P = P;
KRt_From_P(_P, &_K, &_R, &_t);
_C = -_Rtranspose() _t;
}
/// Projection matrix P = K[R|t]
Mat34 _P;
/// Intrinsic parameter (Focal, principal point)
Mat3 _K;
/// Extrinsic Rotation
Mat3 _R;
/// Extrinsic translation
Vec3 _t;
/// Camera center
Vec3 _C;
};
#15 多视角几何
这部分是比较基础和重要的模块之一,包括了:
多视角集几何中n(>=2)视角的求解算法;
将这些求解算法综合起来以便进行鲁棒估计的通用框架——Kernel;
文档中讲解了单应矩阵,本征矩阵,本质矩阵,位置矩阵等的概念,讲得非常好,建议仔细阅读文档。 简单的解释一下:
单应矩阵:描述两个投影平面之间的关系;
本征矩阵:同一个场景在两个相机成像下的关系,也就是物体上的点A在两个视角下成像位置的关系;
本质矩阵:基于本征矩阵和内参矩阵建立,描述相机和本征矩阵位置之间的相对关系;
位置矩阵:估计相机的绝对位置(被转化为一个最小化问题求解);
Kernel:一个将求解器、数据、度量方案等结合起来的类,这个类将用于鲁棒的估计以上的参数和矩阵;
#16 线性规划
一个用于求解多视角几何中线性优化(参数估计)的工具集,文档。
#17 鲁棒估计
提供一些列鲁棒估计方法,比如:Max-Consensus,Max-Consensus,AC-Ransac A Contrario Ransac等。
#17 匹配
提供的接口包括:NNS,K-NN,FLANN,KVLD,Cascade hashing Nearest Neighbor等。这些接口可用于在二维或三维点集,以及更高维的特征描述集中。
#18 追踪
多视几何里的追踪是指在一系列的中找到对应的特征点(同一点在不同视角下的位置)。
#19 sfm
openMVG提供的sfm模块包含了处理SfM问题的一系列方法个数据存储接口,例如相机位置估计,结构测量,BA等。 SfM_Data类包含了SfM所有的输入:
struct SfM_Data
{
/// Considered views
Views views; // 包含图像文件名,id_view,id_pose,id_intrinsic,image size。
/// Considered poses (indexed by viewid_pose)
Poses poses; // 相机的三维位置
/// Considered camera intrinsics (indexed by viewid_cam)
Intrinsics intrinsics; // 相机内参
/// Structure (3D points with their 2D observations)
Landmarks structure; // 二维视图特征关联的3D点
}
下面是例子:
#1 features_siftPutativeMatches
这个样例做了这么几件事(直接翻译官方):
分别提取两张图像的SIFT特征(使用非免费的vlsift)并形成特征描述;
根据特征描述子匹配两张图像上的特征点(BRUTE_FORCE_L2方法);
展示匹配结果;
刚开始的时候会遇到Assertion failed断言错误,处理办法见上一篇文章。运行成功项目目录下会生成三个文件:00_imagesjpg,01_featuresjpg,02_siftMatchessvg。
#2 features_affine_demo
这个例子是图像MSER(参考)和TBMR特征提取的样例,MSER(Maximally Stable Extremal Regions)最大极值稳定区域是一种对图像灰度具有仿射变换不变性,也许也是这个样例起名的原因。TBMR(tree-based Morse regions)这个算法不是特别了解,具体可以在google学术中搜索。
#3 features_image_matching
这个样例给出了利用Image_describer接口提取特征描述子,并匹配和显示结果的样例。示例中可以选择SIFT,AKAZE_MLDB或者AKAZE算法,AKAZE介绍可看这里,是一种比SIFT更稳定的特征检测算法。程序中关于解析输入参数的部分可以注释掉(如果你是用过VS2013 debug),直接修改sImage_describer_type这个值以测试。
#4 features_kvld_filter 和 features_repeatability
这两个也是关于特征提取和匹配的,kvld这个例子中由于之前更改了regionsh中的内容,所以有些函数接口也要做相应改变,具体也是在vector中增加对齐函数选项。
#5 multiview_robust_homography_guided 和 multiview_robust_fundamental_guided
这两个样例是估计单应矩阵和本征矩阵的,并且能够根据这些信息反过来确定匹配点。两个样例运行时间都很长(分辨率教大时),第一个在用另外的照片时还遇到报错,大概是在DoG时出错,具体也没有细究了·····
#6 exif_Parsing
提取EXIF信息,编译后通过命令行执行,给出的参数格式:--imafile 你的照片路径,路径中使用/斜杠。
另一篇:learn openMVG-安装和简介
#7 multiview_robust_essential
估计本质矩阵并计算3D结构。这个例子可以直接运行,生成的点云十分稀疏且不带颜色信息。
以上就是关于openmVG库怎么用全部的内容,包括:openmVG库怎么用、什么软件里有“均笔成交量指标”、openMVG是用来做什么的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)