在计算机视觉中,特征就是图像中独特、稳定、容易被识别的点 / 区域(比如角点、边缘、纹理)。
特征提取 = 从图片里找到这些 “关键标记”,用于:
| 算法 | 速度 | 效果 | 是否免费 | 适用场景 |
|---|---|---|---|---|
| Harris | 极快 | 一般 | 免费 | 简单角点检测 |
| SIFT | 慢 | 极好 | 专利收费 | 高精度匹配 |
| ORB | 最快 | 优秀 | 免费 | 实时项目、工业级 |
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()
效果如图:

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()
效果如图:

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 )
效果截图如下:

全部评论