关键点(Keypoints)和描述子(Descriptors)是图像匹配、拼接、跟踪等计算机视觉任务的基础。你可以把关键点想象成图像中独一无二的“路标”,而描述子就是这个路标的“身份证号”,用来在其它图像中找到同一个地方。
关键点 (Keypoints):图像中稳定、独特、可重复定位的点。通常是角点、边缘交汇点或斑点(blob),对光照、旋转、尺度变化具有一定的稳定性。
描述子 (Descriptors):用数学向量(一串数字)来描述关键点周围的局部图像信息。相似的区域产生的描述子向量距离很近,不相似的区域向量距离很远。
将两者组合,就能在不同图像间完成特征匹配——即“认出同一个物体”。
OpenCV 提供了多种检测器与描述子组合,下面是最常用的几种:
| 算法 | 关键点类型 | 尺度不变性 | 旋转不变性 | 专利/速度 | 适用场景 |
|---|---|---|---|---|---|
| SIFT | 斑点 | ✅ | ✅ | 有专利(需 opencv-contrib),较慢 |
经典方法,精度高 |
| SURF | 斑点 | ✅ | ✅ | 有专利(需 contrib),比 SIFT 快 |
追求速度的场合 |
| ORB | 角点 | ✅ | ✅ | 无专利,极快 | 实时应用、移动端首选 |
| AKAZE | 斑点 | ✅ | ✅ | 无专利,速度快,非线性尺度空间 | 平衡质量与性能 |
| BRISK | 角点 | ✅ | ✅ | 无专利,快速 | 描述子二值化,匹配极快 |
# 关键点和描述子
# 关键点:位置,大小和方向.
# 关键点描述子:记录了关键点周围对其有共享的像素点的一组向量值,其不受仿射变换,光照变换等影响,
# 描述子的作用就是进行特征匹配,在后面进行特征匹配的时候会用上.
代码实例如下:
import cv2
from opencv_jupyter_ui import cv2_imshow
img = cv2.imread('./images/hand.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#创建sift对象
#注意:xfeatures2d是opencv的扩展包中的内容,需要安装opencv-contrib-python
# sift = cv2.xfeatures2d.SIFT_create()
sift = cv2.SIFT_create()
#进行检测
kp = sift.detect(gray)
# print(kp)
# 检测关键点,并计算描述子
# kp, des = sift.compute(gray, kp)
#或者一步到位,把关键点和描述子一起检测出来
kp, des = sift.detectAndCompute(gray, None)
print(type(des))
print(des.shape)
#绘制关键点
cv2.drawKeypoints(gray, kp, img)
# cv2.imshow('img', img)
cv2_imshow('img', img)
效果图展示如下:

全部评论