OpenCV开发教程之关键点和描述子

17人浏览 / 0人评论 / 添加收藏

关键点(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)

效果图展示如下:

全部评论