1.opencv的算算法2D特征模块(8) —— AKAZE局部特征匹配
2.Airtest自动化测试——Airtest进阶和图像识别算法(下)
3.立体匹配算法(Stereo Matching)及其在OpenCV中的应用
4.openmVG库怎么用?
opencv的2D特征模块(8) —— AKAZE局部特征匹配
在本教程的讲解中,我们将深入探讨如何利用AKAZE局部特征检测和匹配两个图像中的法源关键点,特别是原理针对具有预定义单应性矩阵的情况。我们将通过这些步骤,算算法找出匹配且适合特定单应性的法源特征点,并计算它们的原理饿了么活动页源码内层数。
AKAZE算法具有显著的算算法优势,首先,法源它具备尺度不变性,原理能够跨越不同尺寸的算算法图像,准确地提取特征点,法源无论图像大小如何变化。原理其次,算算法它的法源旋转不变性使得在不同角度下,特征点的原理提取依然精确。此外,AKAZE算法通过加速非线性扩散技术构建尺度空间,显著提高了计算速度,提升了工作效率。而且,它在面对噪声和干扰时展现出良好的鲁棒性,能够稳定地提取关键特征点。
然而,尽管有这些优点,AKAZE算法也存在一些局限。例如,它对光照条件的redis源码版本变化较为敏感,可能会导致特征匹配的不准确。另外,局部图像变化可能会导致误检或漏检,影响其性能。值得注意的是,AKAZE算法的使用需要用户手动设置一些参数,如尺度空间的级数和加速非线性扩散的迭代次数,这些参数的选择将直接影响到算法的性能和最终结果的精度。
Airtest自动化测试——Airtest进阶和图像识别算法(下)
Airtest图像识别算法深入解析
2.1 Airtest图像识别算法的实现原理
以"touch"操作为例,分析其日志信息,Airtest尝试使用SURFMatching、TemplateMatching和BRISKMatching算法进行图像识别。识别结果中,'confidence':0.表示算法的可信度。若该值超过预设阈值(默认0.7),则认为识别成功;反之,则认为失败。
默认设置的算法为CVSTRATEGY = ["surf", "tpl", "brisk"],Airtest按此顺序执行算法,直到找到符合阈值的识别结果或超时。
2.2 Airtest图像识别算法分类
Airtest支持opencv3中的8种图像识别算法。
这8种算法分为两类:
1. 模板匹配(TemplateMatching)
2. 基于特征点的图像识别
2.2.1 模板匹配(TemplateMatching)
模板匹配是一种基本的模式识别方法,通过查找与给定子图像匹配的小块区域来识别对象。其局限性在于仅支持平行移动,对旋转、大小变化不敏感。vuepress源码解析
2.2.2 基于特征点的图像识别
SIFT、SURF、BRISK、ORB、AKAZE和BRIEF等算法属于此类。以下以SIFT为例,具体说明如下:
2.2.2.1 SIFT
SIFT算法具有尺度不变性,能够有效表达目标特征信息。其优点包括:
1) 具有旋转、尺度、平移、视角及亮度不变性,有利于特征信息的有效表达。
2) 参数调整鲁棒性好,可根据场景需求调整特征点数量,便于特征分析。
测试代码以lena.png为示例。
2.2.2.2 SURF
SURF算法简化了SIFT中的高斯二阶微分模板,使得卷积平滑操作转换为加减运算,提高了鲁棒性和降低时间复杂度。最终生成的特征向量维度为维。
测试代码以lena.png为示例。
2.2.2.3 BRISK
BRISK算法基于二进制、鲁棒、不变、可缩放和关键点(Binary Robust Invariant Scalable Keypoints),jwt实战源码提供高效的特征检测和描述。
测试代码以lena.png为示例。
2.2.2.4 KAZE
KAZE算法基于非线性插值,适用于图像处理,因为图像通常非连续。与SIFT/SURF相比,KAZE更稳定,采用非线性尺度空间构造关键点。
测试代码以lena.png为示例。
2.2.2.5 AKAZE
AKAZE算法提供更快的速度,是较新的算法,仅在较新版本的opencv中可用。
测试代码以lena.png为示例。
2.2.2.6 ORB
ORB算法结合了FAST角点检测与描述技术,提供尺度和旋转不变性,且对噪声和透视仿射具有不变性。适用于实时应用。
测试代码以lena.png为示例。
2.2.2.7 BRIEF
BRIEF算法提供高效的特征描述,对大范围平面旋转具有较好的识别率。
测试代码以lena.png为示例。
2.3 自定义默认识别算法
通过修改ST.CVSTRATEGY = ["tpl", "sift","brisk"],可以调整默认的图像识别算法。
2.4 图像识别算法总结
性能解析包括单张、多张和内存、CPU使用情况,ngx源码分析内存最大:kaze > sift > akaze > surf > brief > brisk > orb;CPU最大:kaze > surf > akaze > brisk > sift > brief > orb;识别效果:sift > surf > kaze > akaze > brisk > brief > orb。
总结:
1. 当分辨率不变时,模板匹配算法速度更快,优先考虑。
2. 分辨率变化时,推荐使用特征点匹配,提高跨平台适应性。
3. SIFT和SURF提供较高的准确率,结果稳定;SIFT稍优于SURF。
4. ORB速度快,但稳定性较差;AKAZE也容易出现问题。
5. 其他算法速度差异不大。
汇智妹,软件工程师,关注公众号汇智动力学院获取IT技术干货和行业动态,欢迎有意转行IT的小伙伴关注,了解就业数据和成功案例。
立体匹配算法(Stereo Matching)及其在OpenCV中的应用
立体匹配(Stereo matching)是一种用于计算两幅图像间对应像素差异的技术,它能够根据人眼的双眼视差原理,还原物体的三维信息,广泛应用于三维重建、机器人视觉、自动驾驶等领域。
立体匹配的步骤包括:预处理、匹配Cost计算、全局最优化以及后处理。预处理阶段涉及亮度归一化、去噪、图像增强和滤波等操作,以提高匹配的准确性和效率。匹配Cost计算则是寻找每个像素在另一幅图像中的最佳对应点,常用的方法有加权和法、基于像素的亮度法等。全局最优化则通过寻找全局最小Cost值来确定最佳对应点,常用的算法有Graph Cut和Belief Propagation等。
立体匹配算法主要分为基于局部和基于全局两大类。基于局部的方法,如块匹配、模板匹配、SIFT、SURF和AKAZE等,计算速度快但易受噪声影响;基于全局的方法,如Graph Cut和Belief Propagation等,计算量大但能有效处理噪声,提供更准确的匹配结果。
OpenCV提供了多种立体匹配算法的实现,包括简单的块匹配、基于全局的SGBM算法等。SGBM算法首先使用块匹配得到初步的 disparity map,然后使用Graph Cut进行全局优化,提高匹配精度。
总体而言,立体匹配技术结合了预处理、局部和全局匹配以及优化算法,能够有效处理图像间的对应关系,实现三维信息的重建。在实际应用中,选择合适的算法以及优化参数,能够达到较高的匹配精度和效率。
openmVG库怎么用?
请注意,由于我只能根据我的训练数据回答,以下回答可能存在不足之处。
1. 核心库
1.1 图像
openMVG提供一个基本的类用作图像容器:Image,T代表像素类型,这个类可以处理灰度,RGB,RGBA或者自定义类型的图像。用法很简单:
- A 8-bit gray image: Image grayscale_image_8bit;
- Multichannel image: (use pre-defined pixel type)
- A 8-bit RGB image: Image rgb_image_8bit;
- 8-bit RGBA image: Image rgba_image_8bit;
Image<Rgba > rgba_image2_8bit;
这里的 RGBColor,RGBAColor等是openMVG基于Eigen定义好的类型,具体是定义在pixel_types.hpp中。
1.2 数值
openMVG重新包装了Eigen的基本类型和算法,以便更简单的调用。比如 Vec2代表一个二维点(char型)。
1.3 特征
这个模块主要是提供特征容器的封装,包括特征,特征描述,关键点集等,基本都是模板类,比如顶一个sift特征描述子可以这样做:
- // SIFT like descriptor
typedef Descriptor 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 Mat & P){ _P = P;KRt_From_P(_P, &_K, &_R, &_t);_C = -_R.transpose() * _t;}
// 投影矩阵 P = K[R|t]
Mat _P;
// 内参参数 (Focal, principal point)
Mat3 _K;
// 外参旋转
Mat3 _R;
// 外参平移
Vec3 _t;
// 相机中心
Vec3 _C;
};
1.5 多视角几何
这部分是比较基础和重要的模块之一,包括了:
- 多视角集几何中n(>=2)视角的求解算法;
- 将这些求解算法综合起来以便进行鲁棒估计的通用框架——Kernel;
- 文档中讲解了单应矩阵,本征矩阵,本质矩阵,位置矩阵等的概念,讲得非常好,建议仔细阅读文档。
简单的解释一下:
- 单应矩阵:描述两个投影平面之间的关系;
- 本征矩阵:同一个场景在两个相机成像下的关系,也就是物体上的点A在两个视角下成像位置的关系;
- 本质矩阵:基于本征矩阵和内参矩阵建立,描述相机和本征矩阵位置之间的相对关系;
- 位置矩阵:估计相机的绝对位置(被转化为一个最小化问题求解);
- Kernel:一个将求解器、数据、度量方案等结合起来的类,这个类将用于鲁棒的估计以上的参数和矩阵;
1.6 线性规划
一个用于求解多视角几何中线性优化(参数估计)的工具集,文档。
1.7 鲁棒估计
提供一些列鲁棒估计方法,比如:Max-Consensus,Max-Consensus,AC-Ransac A Contrario Ransac等。
1.8 匹配
提供的接口包括:NNS,K-NN,FLANN,KVLD,Cascade hashing Nearest Neighbor等。这些接口可用于在二维或三维点集,以及更高维的特征描述集中。
1.9 追踪
多视几何里的追踪是指在一系列的中找到对应的特征点(同一点在不同视角下的位置)。
1. sfm
openMVG提供的sfm模块包含了处理SfM问题的一系列方法个数据存储接口,例如相机位置估计,结构测量,BA等。
SfM_Data类包含了SfM所有的输入:
- Views views; // 包含图像文件名,id_view,id_pose,id_intrinsic,image size。
- Poses poses; // 相机的三维位置
- Intrinsics intrinsics; // 相机内参
- Landmarks structure; // 二维视图特征关联的3D点
2. 样例
2.1 features_sift
这个样例做了这么几件事(直接翻译官方):分别提取两张图像的SIFT特征(使用非免费的vlsift)并形成特征描述;根据特征描述子匹配两张图像上的特征点(BRUTE_FORCE_L2方法);展示匹配结果;
2.2 features_affine_demo
这个例子是图像MSER(参考)和TBMR特征提取的样例,MSER(Maximally Stable Extremal Regions)最大极值稳定区域是一种对图像灰度具有仿射变换不变性,也许也是这个样例起名的原因。TBMR(tree-based Morse regions)这个算法不是特别了解,具体可以在google学术中搜索。
2.3 features_image_matching
这个样例给出了利用Image_describer接口提取特征描述子,并匹配和显示结果的样例。示例中可以选择SIFT,AKAZE_MLDB或者AKAZE算法,AKAZE介绍可看这里,是一种比SIFT更稳定的特征检测算法。程序中关于解析输入参数的部分可以注释掉(如果你是用过VS debug),直接修改sImage_describer_type这个值以测试。
2.4 features_kvld_filter 和 features_repeatability
这两个也是关于特征提取和匹配的,kvld这个例子中由于之前更改了regions.h中的内容,所以有些函数接口也要做相应改变,具体也是在vector中增加对齐函数选项。
2.5 multiview_robust_homography_guided 和 multiview_robust_fundamental_guided
这两个样例是估计单应矩阵和本征矩阵的,并且能够根据这些信息反过来确定匹配点。两个样例运行时间都很长(分辨率教大时),第一个在用另外的照片时还遇到报错,大概是在DoG时出错,具体也没有细究了·····
2.6 exif_Parsing
提取EXIF信息,编译后通过命令行执行,给出的参数格式:--imafile 你的照片路径,路径中使用/斜杠。
2.7 multiview_robust_essential
估计本质矩阵并计算3D结构。这个例子可以直接运行,生成的点云十分稀疏且不带颜色信息。