欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > OpenCV--特征检测

OpenCV--特征检测

2025/2/23 4:52:17 来源:https://blog.csdn.net/GamBleout/article/details/144384003  浏览:    关键词:OpenCV--特征检测

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()

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词