计算机视觉CV中特征点方法相关函数的学习笔记~
程序员文章站
2022-03-16 17:44:35
...
1 致谢
感谢网友大奥特曼打小怪兽的帮助
原文链接如下:
https://www.cnblogs.com/zyly/p/9646201.html
1 前言
特征点方法是计算机视觉传统目标检测方法中很常用的一种算法思想,例如:SIFT,就是一种十分典型的特征点方法。
2 常用函数介绍
cv2.detectAndCompute(image, mask[, descriptors[, useProvidedKeypoints]]) —— 计算特征点
用来计算特征点的函数。
从image数据中计算特征点信息。
函数最常见的调用形式是:
sift.detectAndCompute(img, None)
其中img表示需要进行处理的图片,None表示不使用模板(即:不使用参数mask)。
那么“None”(mask)具体是什么意思呢?
我们可以看看其完整的函数声明:
detectAndCompute(image, mask[, descriptors[, useProvidedKeypoints]]) -> keypoints, descriptors
参数说明:
- mask:Mask specifying where to look for keypoints (optional). It must be a 8-bit integer matrix with non-zero values in the region of interest. (来自OpenCV的官方说明文档)
∴“None”的意思就是不使用模板。
cv2.BFMatcher_create([, normType[, crossCheck]]) —— 暴力匹配函数
暴力匹配函数,用来创建一个暴力匹配器。
暴力匹配即两两匹配。该算法不涉及优化,假设从图片A中提取了m个特征描述符,从B图片提取了n个特征描述符。对于A中m个特征描述符的任意一个都需要和B中的n个特征描述符进行比较。每次比较都会给出一个距离值,然后将得到的距离进行排序,取距离最近的一个作为匹配点。这种方法简单粗暴,其结果也是显而易见的,可能会存在大量的错误匹配,这就需要使用一些机制来过滤掉错误的匹配。比如我们对匹配点按照距离来排序,并指定一个距离阈值,过滤掉一些匹配距离较远的点。
OpenCV专门提供了一个BFMatcher对象来实现匹配,并且针对匹配误差做了一些优化,即:
BFMatcher_create([, normType[, crossCheck]]) -> retval
参数说明:
- normType:它是用来指定要使用的距离测试类型。默认值为cv2.Norm_L2。这很适合SIFT和SURF等(c2.NORM_L1也可)。对于使用二进制描述符的ORB、BRIEF和BRISK算法等,要使用cv2.NORM_HAMMING,这样就会返回两个测试对象之间的汉明距离。如果ORB算法的参数设置为WTA_K==3或4,normType就应该设置成cv2.NORM_HAMMING2。
- crossCheck:针对暴力匹配,可以使用交叉匹配的方法来过滤错误的匹配。默认值为False。如果设置为True,匹配条件就会更加严格,只有到A中的第ii个特征点与B中的第j个特征点距离最近,并且B中的第jj个特征点到A中的第i个特征点也是最近时才会返回最佳匹配(i,j)(i,j),即这两个特征点要互相匹配才行。
下一篇: JSX语法使用详解——终极版