sfm算法
㈠ C++怎么调用openMVG库
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一起编译,方法是在CMakeLists.txt文件中修改相应选项为 ON,然后在cmake的GUI中添加一个叫OpenCV_DIR的入口,值就是你已经安装好的opencv的路径。
openMVG写的非常不错,对Windows也提供了良好的支持,所以cmake之后用VS打开生成的openMVG.sln解决方案就可以进行编译了,编译的时间稍久。我用的VS2013不支持C++新特性:constexpr,所以建议你使用VS2015或更新版本,如果一定要用VS2013,可以这样做:在src/openMVG/cameras/Camera_Common.hpp文件中将有constexpr的地方直接去掉,或者改成模板函数也是可以的:
运行样例,这里遇到一个坑:DenseStoraage.h line 86报错:R6010 Assertion failed,这是一个断言错误,在release模式下不会出现,但在debug模式下几乎是必现。原因嘛,打开Eigen给出的网址可以明确:数据结构未对齐(unaligned arrays)。这个问题对于刚接触openMVG的人来说还是很烦人的,openMVG代码很优雅,很多数据类型都是从模板类或函数延伸,通过虚函数扩展各项具体方法,而且非常强烈的依赖Eigen这个库,所以给定位问题带来了阻碍。经过一天的攻坚,最后大概确认了原因:
regions.h这个文件中定义的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. 核心库
#1.1 图像
#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_types.hpp中。
#Image I/O
openMVG支持ppm/pgm,jpeg,png,tiff格式的图片文件,例子:
Image<RGBColor> rgb_image_gray;
bool bRet = ReadImage("Foo.imgExtension", &rgb_image);
#Drawing operations
用于在图像上画圆,椭圆,直线等。
#1.2 数值
openMVG重新包装了Eigen的基本类型和算法,以便更简单的调用。比如 Vec2代表一个二维点(char型)。
#1.3 特征
这个模块主要是提供特征容器的封装,包括特征,特征描述,关键点集等,基本都是模板类,比如顶一个sift特征描述子可以这样做:
// SIFT like descriptor
typedef Descriptor<float, 128> siftDescriptorData;
#1.4 相机
此模块提供不同的相机模型的抽象类,包括:
#小孔相机模型
最简单的相机模型,如图: 相机模型包括内参和外参,关键词也就是大家熟悉的几样:投影矩阵,旋转、平移矩阵,焦距、主点等,具体参见说明。 看一个例子: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 = -R.transpose() * t;
P_From_KRt(_K, _R, _t, &_P);
}
PinholeCamera(const Mat34 & P)
{
_P = P;
KRt_From_P(_P, &_K, &_R, &_t);
_C = -_R.transpose() * _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;
};
#1.5 多视角几何
这部分是比较基础和重要的模块之一,包括了:
多视角集几何中n(>=2)视角的求解算法;
将这些求解算法综合起来以便进行鲁棒估计的通用框架——Kernel;
文档中讲解了单应矩阵,本征矩阵,本质矩阵,位置矩阵等的概念,讲得非常好,建议仔细阅读文档。 简单的解释一下:
单应矩阵:描述两个投影平面之间的关系;
本征矩阵:同一个场景在两个相机成像下的关系,也就是物体上的点A在两个视角下成像位置的关系;
本质矩阵:基于本征矩阵和内参矩阵建立,描述相机和本征矩阵位置之间的相对关系;
位置矩阵:估计相机的绝对位置(被转化为一个最小化问题求解);
Kernel:一个将求解器、数据、度量方案等结合起来的类,这个类将用于鲁棒的估计以上的参数和矩阵;
#1.6 线性规划
一个用于求解多视角几何中线性优化(参数估计)的工具集,文档。
#1.7 鲁棒估计
提供一些列鲁棒估计方法,比如:Max-Consensus,Max-Consensus,AC-Ransac A Contrario Ransac等。
#1.7 匹配
提供的接口包括:NNS,K-NN,FLANN,KVLD,Cascade hashing Nearest Neighbor等。这些接口可用于在二维或三维点集,以及更高维的特征描述集中。
#1.8 追踪
多视几何里的追踪是指在一系列的图片中找到对应的特征点(同一点在不同视角下的位置)。
#1.9 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 view.id_pose)
Poses poses; // 相机的三维位置
/// Considered camera intrinsics (indexed by view.id_cam)
Intrinsics intrinsics; // 相机内参
/// Structure (3D points with their 2D observations)
Landmarks structure; // 二维视图特征关联的3D点
}
下面是例子:
#1. features_siftPutativeMatches
这个样例做了这么几件事(直接翻译官方):
分别提取两张图像的SIFT特征(使用非免费的vlsift)并形成特征描述;
根据特征描述子匹配两张图像上的特征点(BRUTE_FORCE_L2方法);
展示匹配结果;
刚开始的时候会遇到Assertion failed断言错误,处理办法见上一篇文章。运行成功项目目录下会生成三个文件:00_images.jpg,01_features.jpg,02_siftMatches.svg。
#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这个例子中由于之前更改了regions.h中的内容,所以有些函数接口也要做相应改变,具体也是在vector中增加对齐函数选项。
#5. multiview_robust_homography_guided 和 multiview_robust_fundamental_guided
这两个样例是估计单应矩阵和本征矩阵的,并且能够根据这些信息反过来确定匹配点。两个样例运行时间都很长(分辨率教大时),第一个在用另外的照片时还遇到报错,大概是在DoG时出错,具体也没有细究了·····
#6. exif_Parsing
提取EXIF信息,编译后通过命令行执行,给出的参数格式:--imafile 你的照片路径,路径中使用/斜杠。
另一篇:learn openMVG-安装和简介
#7. multiview_robust_essential
估计本质矩阵并计算3D结构。这个例子可以直接运行,生成的点云十分稀疏且不带颜色信息。
㈡ ls-dyna算法的详细介绍
以前有这方面很详细的资料,我简单整理一下,用来回答你的问题
LS-DYNA中的接触类型大体上可以分为五大类:
One-Way Contact (单向接触)
Two-Way Contact( 双向接触)
Single Contact(单面接触)
Entity
Tied Contac(固-连接触)
在以上接触类型中,前四种接触类型的接触算法均采用罚函数法。
固-连接触有的采用的罚函数法,有的采用动约束法,少部分采用分布参数法。
Tied Contac
(1)Translational DOF only, No Failure, No Offset
这种类型接触采用动态约束算法。
如下两个命令是常用的固连接触
*Contact_Tied_Nodes_To_Surface(6)
*Contact_Tied_Surface_To_Surface(2)
(2)Translational DOF only, No Failure, With Offset
这种接触采用罚函数算法,
与上述接触类型2、6对应的为
*Contact_Tied_Nodes_To_Surface_OFFSET(O6)
*Contact_Tied_Surface_To_Surface_OFFSET(O2)
(3)Translational DOF & Rotational DOF, With Failure, No Offset
采用动态约束算法。
(4)Translational DOF & Rotational DOF, With Failure, With Offset
罚函数法。
(5)Translational DOF Only, With Failure, With Offset
动态约束算法。
作爆炸分析采用的是仅滑动接触算法,当炸药和金属的单元节点对应时不会出现节点穿透,可是这样就限制了单元的划分。当炸药和金属的单元节点不对应会出现穿透,而且增加接触刚度的值也控制不了,这个时候还有其它控制穿透的办法吗?
下面仅滑动接触关键字:
*CONTACT_SLIDING_ONLY
$ SSID MSID SSTYP MSTYP ***OXID MBOXID SPR MPR
2 1 0 0 0 0
$ FS FD DC VC VDC PENCHK BT DT
0.0 0.0 0.0 0.0 0.0 0 0.01.0000E+20
$ SFS SFM SST MST SFST SFMT FSF VSF
1.0 1.0 0.0 0.0 1.0 1.0 1.0 1.0
*CONTROL_CONTACT
$ SLSFAC RWPNAL ISLCHK SHLTHK PENOPT THKCHG ORIEN ENMASS
1.00 2 0 1 0 3 0
$ USRSTR USRFRC N***CS INTERM XPENE SSTHK ECDT TIEDPRJ
0 0 10 0 4.0 0 0 0
$ SFRIC DFRIC EDC VFC TH TH_SF PEN_SF
0.0 0.0 0.0 0.0 0.0 0.0 0.0
$ IGNORE FRCENG SKIPRWG OUTSEG SPOTSTP SPOTDEL
1 0 0 0 0 0
㈢ D3群在三维实空间中的矩阵表示是怎么算的
MVS是一种从具有一定重叠度的多视图视角中恢复场景的稠密结构的技术,传统方法利用几何、光学一致性构造匹配代价,进行匹配代价累积,再估计深度值。虽然传统方法有较高的深度估计精度,但由于存在缺少纹理或者光照条件剧烈变化的场景中的错误匹配,传统方法的深度估计完整度还有很大的提升空间。近年来卷积神经网络已经成功被应用在特征匹配上,提升了立体匹配的精度。在这样的背景下,香港科技大学Yaoyao等人,在2018年提出了一种基于深度学习的端到端深度估计框架——MVSNet。
多视图立体匹配(Multi-view Stereo, MVS)是计算机领域中一个核心问题。重建多视图立体匹配,可以认为是拍摄既定场景的一个逆过程。相机映射下,三维场景变换为二维,而多视图立体匹配重建正好相反,其从这样子。不同视点拍摄图像,恢复出真实的三维场景。
传统的方法使用手工设计的相似性度量指标和正则化方法计算场景的稠密对应关系(比如使用归一化互相关Normalized Cross-Correlation和半全局匹配semi-global matching)。这些方法在非朗伯体表面、无弱纹理区域的场景可以达到很好的效果。但是在弱纹理区域,人工设计的相似性指标变得不可信,因此导致重建结果不完整。由MVS数据集的排行榜可知,这些方法具有很高的精度,然而在重建的完整度方法还有很大的空间可以提升。
卷积神经网络的研究的最新进展引发了人们完善立体匹配重建热情。从概念看,基于学习算法能够捕获全局的语义信息,比如基于高光和反射的先验条件,便于得到更加稳健的匹配。目前已经探求一些两视图立体匹配,用神经网络替换手工设计的相似性度量或正则化方法。这些方法展现出更好的结果,并且逐步超过立体匹配领域的传统方法。事实上,立体匹配任务完全适合使用CNN,因为图像对是已经过修正过的,因此立体匹配问题转化为水平方向上逐像素的视差估计。
与双目立体匹配不同的是,MVS的输入是任意数目的视图,这是深度学习方法需要解决的一个棘手的问题。而且只有很少的工作意识到该问题,比如SurfaceNet事先重建彩色体素立方体,将所有像素的颜色信息和相机参数构成一个3D代价体,所构成的3D代价体即为网络的输入。然而受限于3D代价体巨大的内存消耗,SurfaceNet网络的规模很难增大:SurfaceNet运用了一个启发式的“分而治之”的策略,对于大规模重建场景则需要花费很长的时间。
㈣ AR必备一:AR云技术(Cloud Anchor)
AR是增强现实,云是指数据的存储与计算。由于AR技术的特性,在云端储存的信息包括世界坐标信息、特征点云地图等信息,然后被智能终端检索,融合现实与虚拟世界信息的一种能力。
AR云的共享,要求多名玩家共享世界坐标,每位玩家进入“共享”坐标系系统中,需要将自己的坐标系重定位到SLAM地图中,并获得正确的pose信息。接下来每一帧都要做坐标共享的事情,这种坐标同步及时发生,这个耗时即AR云同步速率,反映在用户设备上就是延迟。
例如你在广场的雕塑上创作了一副AR涂鸦,想让其他人也看到你的精美作品,就必须要用到AR云的持久化、世界坐标共享的能力;如果需要协作完成AR作品,也离不开AR云的坐标共享功能。图是Google的Just a Line的多人协作玩法。
如果想解释清楚AR云,就一定绕不开重定位技术,多人共享世界坐标、AR内容持久化都用到的重定位技术。
SLAM技术具有World Tracking的能力,其结果是基于Feature的点云,我们称之为SLAM的地图信息。重定位技术点核心是一种特殊的搜索方法。用户的设备通过当前帧信息,搜索覆盖的物理区域的SLAM地图,以查找自己在SLAM地图中的坐标位置。
这种搜索是耗时的,对普通用户来说甚至要求有些苛刻。上传的关键帧信息,都需要在AR云端做必不可少的暴力运算,如果当前信息和SLAM的地图信息差别较大,容易导致重定位失败或不够准确。当然也是有解决方案的,可以通过数据采集、深度学习的方法增重定位的宽容度,让AR云的能力更普世。
有两种数据采集的模式:
这种方法一般是由供应商提前批量扫描,进行地图数据收集并在云端存储,然后客户再通过重定位技术获得自己在地图中的坐标。这种一般应用与展馆、商场的室内导航,或者多人互动的营销类项目。
人们活动的区域有限,通过每个用户使用自己的摄像头收集地图信息,然后再进行重定位,这样的结果就是世界地图越来越大,总是来说是一种分而化之的方式。
AR云一般指在重定位技术下实现的多人互动、持久化的技术载体,广义的AR云是指和云存储、计算相关的AR内容的一种表现形式,例如云Marker,借助云端存储Marker的patt信息,将Marker的识别放到云端计算,可以突破Marker图像库的数量限制,在手机本地进行计算,中端手机Marker图像库一般不超过备闹1000个,否则会有性能上的影响。当然也可以将Marker的跟踪解析也放到云端,这样可以带来更好的稳定性,跟踪过程实时刷新,这个就要依赖网络的低延迟,5G的普及可以解决这一难题。
其他的AR云形式还有SFM(从运动中恢复结构),即从一段运动中的迟滚歼视频恢复出被拍摄主题的空间三维结构,由于计算量巨大,用户上传视频到服务端进行解析,然后服务端再返回三维模型结果;这也是AR云的一种应用方式。
AR云的的使用规模比较小,基础的AR云地图由用户自己的采集。一般可以用来做多人互动的AR游戏,码冲也能用来做类似ARNote类的应用,记录、分享自己的生活。
AR云所构建的地图比较大,在云端储存了较多的信息,主办方负责扫描场景并上传云端,使用者通过对环境的扫描,和云端地图比对,进行重定位。这种技术尺度级别一般用来做较大展馆或商场的室内导航,或者多人协同合作的商场影响活动。
这种级别的AR云,就能实现AR生活,无处不在的ARlog记录生活点滴,高信息密度的AR信息,还有个性化的空间内容,平行宇宙不再只是出现在科幻小说中;比如站在楼顶可以看到城市街景,利用AR云持久化的能力能看到城市的发展,岁月变迁、沧海桑田,尽收眼底。
持久化的能力能解决AR体验的不可连续性,用户使用智能设备创作的信息,被点云地图的形式保存起来,当用户的智能设备再次扫描到相同的特征点,通过重定位技术,可以再次开启以往的创作内容,并且保留原内容的坐标、方向信息,这极大扩大了AR的应用场景,也是的众包世界地图信息成为可能,是一种能自激发自生长的能力。
所有参与AR体验的用户都会获得同一世界坐标,即所有参与者可以从不同角度观察同一AR物体。改变的AR玩法一直solo的局面,让社交、互动可以融入AR的之中,为AR行业注入新的血液。在游戏类目中,新增了一种多人AR游戏这一类目。
在没有GPS的情况下,依靠视觉信息定位(CPS)的一种方式。当AR信息与真实世界能严丝合缝的对齐,AR导航才有真实的应用价值,让真实世界更准确和直观的通航。
基于室内导航可做很多扩展,比如商场内的购物,门店的招牌广告等,信息以一种密度的形式准确的叠加到真实世界,从而影响人与真实世界的交互行为。
这个能力特性可以让AR云用来做游戏体验,比如Google发布的Just a Line游戏,多名玩家可以创作同一副AR作品;也可以在营销运营类活动中使用,比如会场或商场的互动营销活动。
AR云导航的精确度高于GPS
fantasmo的示例
space的示例
dentreality的示例
YOUAR的示例
placenote的示例
上述了很多AR云的技术特性,但自2017年各个技术公司或应用厂商都发布了在移动端的第一代产品,至今的产品在大众用户眼中,还都是技术尝鲜,在好奇与猎奇心驱使下去尝试,还没能形成真正的产品使用习惯,也就是说AR云还没能真正解决用户需求。
从技术层面上, AR云的技术尚未成熟,比如在做室内导航技术上,很多用户和开发者都表示想做地下车库室内导航,但至今仍没有规模化的产品可用,其中是有技术难题仍未解决的,以停车场导航为例:
在摄像头取景的一帧内,各个地方的物体都非常类似,这种视频流素材作为构建特征地图是非常困难的,在没有GPS的帮助下,重定位误差比较大;
停车场的车是流动的,人也是流动的,再次重定位的时候,会出现关键点匹配失败的情况。
当然,这些技术难题也会不断被攻克,比如未来的深度摄像头,如果产品化,对关键点的提取和跟踪会友好;AI技术的助力,可以识别3D物体,把指定的物体剔除,不再作为MAP保存,以此提高重定位的环境适应性。
现在技术还不算成熟,但从趋势上看,是符合人获取信息的趋势。AR使信息能以更高密度、个性化、精准的存在。目前主流的硬件还是摄像头,甚至仍是单目摄像头,仅靠RGB和算法来优化和识别,但以后有新的成熟赢家的加入,比如TOF,结构光等硬件更新,现在面临的算法瓶颈将不复存在。AR云技术,未来可期。
㈤ 图像视觉算法(深度学习)和SLAM算法哪个更有前景啊
vSALM(Visual SLAM)能够在跟踪摄像机(用于AR的手持或者头盔,或者装备在机器人上)位置和方位的同时构建三维地图. SLAM算法与ConvNets和深度学习是互补的。SLAM关注几何问题,而深度学习主要关注识别问题。如果你想让机器人走到冰箱面前而不撞到墙,就用SLAM。如果你想让机器人识别冰箱里的物品,就用ConvNets。http://openmvg.readthedocs.io/en/latest/
SLAM相当于实时版本的SFM(Structure From Motion)。vSLAM使用摄像机,放弃了昂贵的激光传感器和惯性传感器(IMU)。单目SLAM使用单个相机,而非单目SLAM通常使用预先标定好的固定基线的立体摄像机。SLAM是基于几何方法的计算机视觉的一个主要的例子。事实上,CMU(卡内基梅陇大学)的机器人研究机构划分了两个课程:基于学习方法的视觉和基于几何方法的视觉。
SFM vs vSLAM
SFM和SLAM解决的是相似的问题,但SFM是以传统的离线的方式来实现的。SLAM慢慢地朝着低功耗,实时和单个RGB相机模式发展。下面是一些流行的开源SFM软件库。
Bundler: 一个开源SFM工具箱,http://www.cs.cornell.e/~snavely/bundler/
Libceres: 一个非线性最小二乘法库(对bundle adjustment问题非常有用),http://ceres-solver.org/
Andrew Zisserman's多视图几何Matlab函数库,http://www.robots.ox.ac.uk/~vgg/hzbook/code/
vSLAM vs 自动驾驶
自动驾驶汽车是SLAM最重要的一个应用领域。未来很多年里,在自动驾驶领域将持续地研究SLAM。