OpenCV开发教程之特征提取

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

一、什么是特征提取?

在计算机视觉中,特征就是图像中独特、稳定、容易被识别的点 / 区域(比如角点、边缘、纹理)。

特征提取 = 从图片里找到这些 “关键标记”,用于:

  • 图像匹配
  • 目标检测
  • 图像拼接
  • 人脸识别
  • SLAM、AR/VR

二、OpenCV 最常用的 3 种特征提取算法

我给你整理最实用、考试 / 比赛 / 项目都能用的三种:
 
  1. Harris 角点检测(最基础,找角点)
  2. SIFT 特征(最经典,尺度不变)
  3. ORB 特征(最快,免费开源,工业常用)

三、三种算法对比

算法 速度 效果 是否免费 适用场景
Harris 极快 一般 免费 简单角点检测
SIFT 极好 专利收费 高精度匹配
ORB 最快 优秀 免费 实时项目、工业级
结论:做项目优先用 ORB!
 
四、实战效果
我们接下来就分别看下这三种算法的不同表现!
4.1、Harris算法:

import cv2
# 1. 读取图片 + 转灰度
img = cv2.imread("./cv.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = np.float32(gray)

# 2. Harris角点检测
dst = cv2.cornerHarris(gray, 2, 3, 0.04)

# 3. 膨胀让角点更明显
dst = cv2.dilate(dst, None)

# 4. 标记角点(红色)
img[dst > 0.01 * dst.max()] = [0, 0, 255]

# 5. 显示结果
cv2.imshow("Harris角点", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果如图:

4.2、SIFT算法:

import cv2
img = cv2.imread("./cv.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 1. 创建SIFT检测器
sift = cv2.SIFT_create()

# 2. 检测关键点 + 计算描述子
kp, des = sift.detectAndCompute(gray, None)

# 3. 绘制特征点
img = cv2.drawKeypoints(img, kp, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

# 4. 显示
cv2.imshow("SIFT特征", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果如图:

4.3、ORB算法:

import cv2
img = cv2.imread("./cv.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 1. 创建ORB检测器
orb = cv2.ORB_create(nfeatures=500)

# 2. 检测 + 计算
kp, des = orb.detectAndCompute(gray, None)

# 3. 绘制特征点
img2 = cv2.drawKeypoints(img, kp, None, (0,255,0), 2)

# 4. 显示
cv2.imshow("ORB特征", img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果如图:

 

goodFeaturesToTrack = OpenCV 专门用来找图像中 “质量最好的特征点” 的函数。

它是Harris 角点检测的升级版,自动过滤掉差的点,只保留清晰、稳定、好用的角点 / 特征点。

代码如下:

import cv2
#特征提取
image = cv2.imread('./cv.png')
print(image.shape)

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# cv2.imshow("Gray", gray)

corners = cv2.goodFeaturesToTrack(gray, 500, 0.1, 10) #10表示10个像素距离

for corner in corners:
   x, y = corner.ravel()
   # print(x, y)
   cv2.circle(image, (int(x), int(y)), 3, (255, 0, 255), -1)

cv2.imshow("corners", image)
# 等待按键输入
cv2.waitKey()

 

备注:

corners = cv2.goodFeaturesToTrack( image, # 输入:灰度图 

maxCorners, # 最多找多少个点 

qualityLevel, # 质量阈值(0.01~0.1) 

minDistance, # 点之间最小距离,防止扎堆 

corners=None, mask=None, blockSize=None, useHarrisDetector=None, k=None )

关键参数解释(超级简单)

  • maxCorners:最多返回多少个特征点(例如 100)
  • qualityLevel:质量阈值,越小点越多,一般写 0.01 或 0.05
  • minDistance:点之间最小距离,避免点挤在一起
  • useHarrisDetector:是否用 Harris 算法(默认 False,使用 Shi-Tomasi 算法,效果更好)

效果截图如下:

全部评论