OpenCV--特征检测

发布于:2024-12-18 ⋅ 阅读:(118) ⋅ 点赞:(0)

OpenCV--特征检测

代码和笔记

import cv2
import numpy as np

"""
特征检测和匹配
1. 定义:提取图像信息,决定每个图像的点是否属于一个图像特征。
特征检测的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点、连续的曲线或者连续的区域
2. 包含边缘检测、角检测、区检测和脊检测
3. 应用场景:图像搜索、拼图游戏、图像拼接

特征是唯一的、可追踪的、能比较的--角点
角点是图像中的重要特征点,它们包含了丰富的图像信息。通过角点检测,可以从图像中提取出这些特征点,用于后续的图像分析、处理和识别任务。
属于角点的是:图像中灰度梯度变化显著的点,或者是一阶导数(即灰度梯度)的局部最大对应的像素点。两条及两条以上的边缘的交点。
"""

"""
特征检测
"""
img = cv2.imread('./img/cat.jpeg')

# 变成灰度图
gary = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

"""
Harris 角点检测
"""
# blockSize:检测窗口,要小一点,ksize:sobel算法的卷积核,奇数,k:权重系数
# 返回的是角点响应,每一个像素都能算出一个
dst = cv2.cornerHarris(gary, blockSize=2, ksize=3, k=0.04)
# 设定阈值,显示角点 乘以0.01是为了覆盖多的角点,大了不好
img[dst > (0.01 * dst.max())] = [0, 0, 255]

cv2.imshow('img1', img)

"""
Harris具有旋转不变性,即旋转后角点还是原来的角点,但是缩放后就可能不是了。
SIFT关键点检测:尺寸不变性,
"""
# 创建sift对象 SIFT_create在扩展包里面
# 旧版本在cv2.xfeatures2d.SIFT_create()
sift = cv2.SIFT_create()

# 进行检测 kp是一个列表,存放的是封装的KeyPoint对象
kp = sift.detect(gary)

# 计算描述子,用于特征匹配。检测和计算可以一起,方法为:detectAndCompute(gary, None),None是掩码操作,None表示整个图片都计算。
# 描述子:是一个刻画特征的数据结构,其维数可以是多维的。
# 它能够描述图像中特定区域的特征,这些特征对图像的旋转、尺度变化、光照变化等具有一定的鲁棒性。
kp, des = sift.compute(gary, kp)
# print(des.shape)
# 绘制关键点, 绘制对象:gary,输出:输出在img上
cv2.drawKeypoints(gary, kp, img)
cv2.imshow('img2', img)

"""
Shi-Tomasi角点检测:Harris的改进版,因为Harris的稳定性与k有关,不太好设定
稳定性实质上与矩阵M的较小特征值有关,直接用这个特征值作为分数就不需要调整k了
"""
# shi-tomasi角点检测
# maxCorners:角点最大数,0表示无限制。
# qualityLevel:角点质量,一般在0.01-0.1之间。minDistance:角之间最小的欧氏距离,忽略小于此距离的点。
corners = cv2.goodFeaturesToTrack(gary, maxCorners=0, qualityLevel=0.01, minDistance=10)

# 绘制角点,先转化为int,注意corners是三维数组, ravel二维变一维
corners = np.int0(corners)
for i in corners:
    x, y = i.ravel()
    # 3为半径,-1表示实心
    cv2.circle(img, (x, y), 3, (0, 0, 255), -1)

cv2.imshow('img3', img)

"""
SURF特征检测:稳健,SIFT的改进,提升了效率。注意:只有OpenCV 3.4.1.15以下才能用
用法和SIFT类型,换成SURF_create()就OK
"""

"""
ORB特征检测:速度快,替代SURF,最大优势:实时检测
"""
# orb对象
orb = cv2.ORB_create()
# 进行检测和计算描述子
kp = orb.detect(gary)
kp, des = orb.compute(img, kp)
print(des)

cv2.waitKey(0)
cv2.destroyAllWindows()


网站公告

今日签到

点亮在社区的每一天
去签到