1. Haars角点检测
    1. Harris 角点检测的结果是一个由角点分数构成的灰度图像。选取适当 的阈值对结果图像进行二值化我们就检测到了图像中的角点
    2. cv2.cornerHarris(gray,blockSize,ksize,k)
      1. img - 数据类型为 float32 的输入图像
      2. blockSize - 角点检测中要考虑的领域大小
      3. ksize - Sobel 求导中使用的窗口大小
      4. k - Harris 角点检测方程中的自由参数,取值参数为 [0,04, 0.06]
    3. cv30_haarCorner.py
  2. Shi-Tomasi 角点检测(适于追踪的图像特征)
    1. 修改了Haars角点检测的打分公式
    2. cv2.goodFeaturesToTrack(gray,bestPointNum,qualityThreshold,distance)
      1. gray:输入的灰度图像
      2. bestPointNum:最佳角点数目
      3. qualityThreshold: 角点的质量水平,0-1之间
      4. distance:两个角点之间的最短欧氏距离
    3. cv31_goodfeaturetotrack.py
  3. SIFT特征
    1. 算法步骤
      1. 1. 尺度空间极值检测
        1. 小的角点要用小的窗口,对大的角点只能使用大的窗口
          1. 尺度空间滤波器。(尺度空间滤波器可以使用一些列具有不同方差 σ 的高斯卷积核构成)
      2. 2. 关键点(极值点)定位
        1. 使用尺度空间的泰勒级数展开来获得极值的准确位置,如果极值点的灰度值小于阈值(0.03)就会被忽略掉
      3. 3. contrastThreshold
        1. DoG 算法对边界非常敏感,所以我们必须要把边界去除
        2. 低对比度的关键点和边界关键点都会被去除掉
      4. 4. 为关键点(极值点)指定方向参数
        1. 为每一个关键点赋予一个反向参数,这样它才会具有旋转不变性。 获取关键点(所在尺度空间)的邻域,然后计算这个区域的梯度级和方向
      5. 5. 关键点描述
        1. 选取与关键点周围一个 16x16 的邻域,把它分成 16 个 4x4 的小方块,为每个小方块创建一个具有 8 个 bin 的方向直方图。总共加起来有 128 个 bin。由此组成长为 128 的向量就构成了关键点描述符。除此之外还要进行几个测量以达到对光照变化,旋转等的稳定性
      6. 6. 关键点匹配
        1. 采用关键点特征向量的欧式距离来作为两幅图像中关键点的相似性判定度量。取第一个图的某个关键点,通过遍历找到第二幅图像中的距离最近的那个关键点
    2. sift.detect(gray,None)
      1. sift = cv2.SIFT()
  4. SURF特征
    1. 使用盒子滤波器(box_filter)对 LoG 进行近似
      1. 在进行卷积计算时可以利用积分图像(积分图像的一大特点是:计算图像中某个窗口内所有像素和时,计算量的大小与窗口大小无关)
  5. 角点检测FAST算法
    1. 算法步骤
      1. 1.在图像中选取一个像素点p,来判断它是不是关键点,I_p为点p的灰度值
      2. 2. 选取适度的阈值t
      3. 3. 在点p周围选取16个临近点测试
      4. 4. 如果16个像素点中存在连续n个连续像素灰度值低于I_p-t或大于 I_p+t,那么该像素被认为是一个特征点
    2. 机器学习的角检测器
      1. 1.选择一组训练图片(最好是跟最后应用相关的)
      2. 2. 使用FAST算法检测每张图片的特征点
      3. 3. 对每个特征点,将其周围的16个像素点存储为一个向量,对所有图像都这样构建一个特征向量P
      4. 4. 每个特征点的16像素点都属于三类
        1. 1. 比特征点更暗
        2. 2. 与特征点类似
        3. 3. 比特征点更亮
      5. 5. 根据这些像素值分类,特征向量也被分为三类
      6. 6. 定义一个新的布尔变量Kp,如果p是角点,Kp为true,否则为false
      7. 7. 使用ID3决策树分类
      8. 8,在所有决策树子集上使用ID3,直到交叉熵为0
      9. 9,将构建好的决策树用于其他图像检测
  6. BRIEF(Binary Robust Independent Element Feature)
    1. 不去计算描述符而是直接找到一个二进制字符串。这种算法使用的是已经平滑后的图像,它会按照一种特定的方式选取一组像素点对 nd (x, y),然后在这些像素点对之间进行灰度值对比
  7. ORB(Oriented FAST and Rotated BRIEF)
    1. 算法步骤
      1. 首先它使用 FAST 找到关键点
      2. 然后再使用 Harris角点检测对这些关键点进行排序找到其中的前 N 个点。它也使用金字塔从而产生尺度不变性特征。
  8. 特征匹配
    1. Brute-Force蛮力匹配
      1. cv2.BFMatcher(normType,crossCheck)
        1. normType:指定距离的测试类型
          1. 默认为cv2.NORM_L2,该类型适用于SIFT和SURF
          2. 使用二进制描述符的 ORB, BRIEF, BRISK算法等,要使用 cv2.NORM_HAMMING
        2. crossCheck:默认为False,为True时匹配更严格
      2. BFMatcher对象有两个方法
        1. BFMatcher.match():返回最佳匹配
        2. BFMatcher.knnMatch():为每个关键点返回 k 个最佳匹配
    2. FLANN (Fast_Library_for_Approximate_Nearest_Neighbors)匹配器
      1. 一个对大数据集和高维特征进行最近邻搜索的算法的集合
      2. cv2.FlannBasedMatcher(index_params,search_params)
        1. index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
          1. 各种不同算法的信息可以在 FLANN 文档中找到
        2. search_params = dict(checks=50) # or pass empty dictionary
          1. 用它来指定递归遍历的次数。值越高结果越准确,但是消耗的时间也越多
  9. 特征匹配和单应性查找对象
    1. 使用一个查询图像,在其中找到一些特征点(关键点),我们又在另一幅图像中也找到了一些特征点,最后对这两幅图像之间的特征点进行匹配
    2. 方法
      1. 1. 使用 calib3d 模块中的 cv2.findHomography()函数。如果将这两幅图像中的特征点集传给这个函数,他就会找到这个对象的透视图变换。
      2. 2. 然后我们就可以使用函数 cv2.perspectiveTransform() 找到这 个对象了
    3. cv38_findHomography.py
      1. 1. 先使用SIFT计算两张图关键点
      2. 2. 使用FlannBasedMatcher计算knnmatch
      3. 3. 保留部分相似度大于一定阈值的点
      4. 4. 将相似点传入 findHomography
      5. 5. 进行perspectiveTransform变换