关键点/角点检测
2011论文-ORB关键点检测,比SIFT与SURF速度更快。
ORB算法可以看出两个部分组成:快速关键点定位+BRIEF描述子生成
Fast关键点检测:
选择当前像素点P,阈值T,周围16个像素点,超过连续N=12个像素点大于或者小于P
优先现检测1、5、9、13循环所有的像素点。
特征提取
从关键点到特征描述子
基于关键点周围区域
浮点数表示与二值编码
描述子长度
描述子是指在计算机视觉和图像处理领域中用于表示图像或图像中的特征的数学特征向量或向量集合。描述子的目标是以紧凑的方式捕获图像的关键信息。使得在进行图像识别、检索、匹配等任务时能高效的比较和处理图像。描述子通常基于图像的局部特征点,比如角点、边缘点等,通过提取这些局部特征点的特征向量来描述图像。如以下图表:
ORB特征描述子生成步骤:
提取特征关键点
描述子方向指派
特征描述子编码(二值编码32位)
orb.detectAndCompute提取图像关键点跟特征描述子,得到453个关键点,对应453x32的描述子矩阵
特征匹配算法
用于比较和匹配图像中特征点或描述子的算法。特征匹配算法的目标是在不同图像或视频帧中找到对应的特征点或描述子,从而实现目标跟踪、图像配准、物体识别。
常见的特征匹配算法包括:
1、基于光流的匹配算法,需要通过追踪图像中像素的移动来匹配特征点。
2、基于相似度度量,通过计算特征点或描述子之间的相似度来进行匹配。
3、基于几何形状的匹配算法:通过比较特征点之间的几何关系来进行匹配
4、基于优化方法的匹配算法:通过最小化匹配误差的优化方法来进行匹配
5、基于机器学习的匹配算法:通过训练机器学习模型来实现特征匹配。
DMatch是OpenCV中用于表示特征匹配结果的数据结构。在OpenCV中,DMatch对象包含了两个特征点之间的距离和它们在特征点列表中的索引。通过DMatch对象,可以方便地获取匹配特征点之间的距离信息,以及它们在特征点列表中的索引位置,从而在特征匹配算法中进行匹配结果的分析和处理。
DMatch数据结构:
queryIdx
trainldx
distance,表示匹配最后得到的距离,值越小表示匹配程度越高。
暴力匹配算法实现
使用SIFT算法检测关键点和描述子。接着,我们初始化了一个暴力匹配器,并使用KNN方法进行匹配。最后,我们应用了比率测试,筛选出最佳匹配,并将匹配结果绘制在一张新的图像中展示出来。
import cv2
import numpy as np
# 读取图像
img1 = cv2.imread('image1.jpg', 0) # queryImage
img2 = cv2.imread('image2.jpg', 0) # trainImage
# 初始化SIFT检测器
sift = cv2.SIFT_create()
# 寻找关键点和描述子
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)
# 初始化暴力匹配器
bf = cv2.BFMatcher()
# 使用KNN匹配
matches = bf.knnMatch(des1, des2, k=2)
# 应用比率测试,以确保最佳匹配
good_matches = []
for m, n in matches:
if m.distance < 0.75 * n.distance:
good_matches.append([m])
# 绘制匹配结果
img_matches = cv2.drawMatchesKnn(img1, kp1, img2, kp2, good_matches, None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
# 显示匹配结果
cv2.imshow('Matches', img_matches)
cv2.waitKey(0)
cv2.destroyAllWindows()
KNN是K-Nearest Neighbors(K近邻)的缩写,是一种常用的机器学习算法。在KNN算法中,当需要对一个新样本进行分类或回归时,会找出与该样本最相似的K个训练样本(即最近的K个邻居),然后利用这K个样本的标签或属性值来进行分类或回归预测。
在分类问题中,KNN根据K个最近邻居的类别进行投票,将投票数最多的类别作为新样本的类别;在回归问题中,KNN根据K个最近邻居的属性值进行平均或加权平均来预测新样本的属性值。