⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟
🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿
个人网站:https://jerry-jy.co/❗❗❗知识付费,🈲止白嫖,有需要请后台私信或【文末】个人微信公众号联系我
基于OpenCv的图像特征点检测
- 基于OpenCv的图像特征点检测
- 任务需求
- 任务目标
- 1、掌握基于OpenCv进行SURF特征点检测
- 2、掌握基于OpenCv进行FAST角点检测
- 3、掌握基于OpenCv进行ORB特征点检测
- 任务环境
- 1、jupyter开发环境
- 2、OpenCv
- 3、python3.6
- 任务实施过程
- 一、SURF特征点检测
- 1.导入所需要的工具包和图像
- 2.SURF特征点检测
- 二、FAST角点检测
- 三、ORB特征点检测
- (1)BRIEF特征点描述算法
- (2)ORB特征点检测
- 四、任务小结
- 说明
基于OpenCv的图像特征点检测
任务需求
特征点检测结合了边缘检测与角点检测从而识别出图形的特征点。特征点在保留图像图形重要特征的同时,可以代替整幅图像的处理,有效地减少信息的数据量,有效地提高了计算的速度,有利于图像的可靠匹配,使得实时处理成为可能。
例如下图为两张图像的特征点匹配。
任务目标
1、掌握基于OpenCv进行SURF特征点检测
2、掌握基于OpenCv进行FAST角点检测
3、掌握基于OpenCv进行ORB特征点检测
任务环境
1、jupyter开发环境
2、OpenCv
3、python3.6
任务实施过程
一、SURF特征点检测
1.导入所需要的工具包和图像
import cv2 # 导入opencv
import matplotlib.pyplot as plt # 导入绘图模块
import numpy as np # 导入numpy库
from utils import im_show # 导入显示图像函数
# 绘制图像直接展示,不用调用plt.show()
%matplotlib inline
# 用来正常显示中文标签
plt.rc('font',family="SimHei")
# 读取图像
img = cv2.imread(r'./experiment/data/butterfly.jpg')
# 设置画布大小
plt.figure(figsize=(12,12))
# 显示图像
im_show('原图像',img)
2.SURF特征点检测
SURF算法在SIFT算法基础上改进了特征的提取和描述方式,用一种更为高效的方式完成特征点的提取和描述。SURF算法的速度是SIFT速度的3倍,善于处理模糊和旋转的图像,但是不善于处理视角变化和光照变化。
OpenCV获取surf特征点
surf = cv2.xfeatures2d.SURF_create() 实例化
- surf:实例化的surf函数,可以在初始化的时候直接给设置Hessian矩阵的阈值
kp, dst = sift.detectAndCompute(gray, None) 找出图像中的关键点和对应的描述子
- gray:输入的灰度图
- kp:生成的关键点
- dst:输出的特征向量,默认是64维的
ret = cv2.drawKeypoints(gray, kp, img,color,flags) 在图中画出关键点
- gray:输入图片
- kp:SIFT关键点
- img:返回的图像
- color:绘制的特征点的颜色信息
- flags:特征点的绘制模式,DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS表示绘制特征点的时候绘制的是一个个带有方向的圆,这种方法同时显示图像的坐标,size和方向,是最能显示特征的一种绘制方式。
# 将图像转换成灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 创建一个SURF对象,实例化
# 这里设置Hessian矩阵的阈值为40000
surf = cv2.xfeatures2d.SURF_create(40000)
# 寻找关键点和描述子
kp, des = surf.detectAndCompute(gray,None)
# 打印SURF检测到的关键点数和此时的Hessian阈值
print('关键点数',len(kp))
# 检测现在的Hessian阈值
print( 'SURF对象Hessian阈值',surf.getHessianThreshold() )
# 绘制关键点,放入图像,关键点,绘制颜色,cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS表示它将绘制一个具有关键点大小的圆,并显示其方向。
img1 = cv2.drawKeypoints(gray,kp,None,(255,0,0),cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
plt.figure(figsize=(12,12))
im_show('SURF特征点检测',img1)
SURF更像是斑点检测器。它检测到蝴蝶翅膀上的白色斑点。
# U-SURF:不会检测关键点的方向,运算速度会快很多
# 检查upright标志
print('upright标志:',surf.getUpright())
# 设置upright标志为True
surf.setUpright(True)
# 重新计算特征点并绘制
kp, des = surf.detectAndCompute(gray,None)
# 绘制关键点,放入图像,关键点,绘制颜色,cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS表示它将绘制一个具有关键点大小的圆,并显示其方向。
img2 = cv2.drawKeypoints(gray,kp,None,(255,0,0),cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
plt.figure(figsize=(12,12))
im_show('U-SURF特征点检测',img2)
上图可以看到每一个关键点的方向都是一样的,U-SURF:不会检测关键点的方向,运算速度会快很多。如果想要应用的场景,关键点方向不是一个问题(如全景拼接)等,运用U-SURF更好。
# 查看SURF描述子的大小
print('SURF描述子维数',surf.descriptorSize())
# SURF描述子默认是64维向量
# 将其设为True即可获取128维的描述符
surf.setExtended(True)
# 重新计算特征点和描述子
kp, des = surf.detectAndCompute(gray,None)
print('SURF描述子维数',des.shape[1])
二、FAST角点检测
FAST特征检测的特点是简单、快速、有效。相比SIFT、DoG、Harris等比较耗时的特征检测方法,FAST只利用周围的像素进行比较,速度大大加快。
OpenCV进行FAST角点检测
fast = cv2.FastFeatureDetector_create(threshold, nonmaxSuppression, type) FAST特征检测器
- threshold:阈值,默认10
- nonmaxSuppression:非极大值抑制,默认True
- type:检测器类型:cv2.FAST_FEATURE_DETECTOR_TYPE_5_8,cv2.FAST_FEATURE_DETECTOR_TYPE_7_12,cv2.FAST_FEATURE_DETECTOR_TYPE_9_16(默认)
kp = fast.detect(gray, None) 找出图像中的关键点,FAST只是一种特征点检测算法,并不涉及特征点的特征描述。
- gray:输入的灰度图
- kp:生成的关键点
# 创建一个FAST对象,实例化
# 设置阈值为50
fast = cv2.FastFeatureDetector_create(50)
# 寻找关键点
kp = fast.detect(gray,None)
# 绘制关键点,放入图像,关键点,绘制颜色
img3 = cv2.drawKeypoints(gray,kp,None,(255,0,0))
plt.figure(figsize=(12,12))
im_show('FAST角点检测',img3)
# 关闭非极大值抑制
fast.setNonmaxSuppression(False)
# 寻找关键点
kp = fast.detect(gray,None)
# 绘制关键点,放入图像,关键点,绘制颜色
img4 = cv2.drawKeypoints(gray,kp,None,(255,0,0))
plt.figure(figsize=(15,12))
im_show('FAST角点检测(关闭非极大值抑制前后)',np.hstack((img3,img4)))
FAST检测算法没有多尺度的问题,所以计算速度相对较快,但是当图片中的噪点较多的时候,会产生较多的错误特征点。并且, FAST算法的效果还依赖于一个阈值t。而且FAST特征点没有方向信息,这样就会失去旋转不变性.但是在要求实时性的场合,比如视频监控的物体识别,是可以使用的。
三、ORB特征点检测
(1)BRIEF特征点描述算法
BRIEF特征点描述子一种可以快速计算且表达方式为二进制编码的描述子。
BRIEF是特征描述符,它不提供任何查找特征的方法。因此,可以利用FAST特征点检测算法或Harris角点检测算法或SIFT、SURF等算法检测特征点的位置,接下来在特征点邻域利用BRIEF算法建立特征描述符。
# 初始化Fast检测器
fast1 = cv2.FastFeatureDetector_create(50)
# 初始化BRIEF提取器
brief = cv2.xfeatures2d.BriefDescriptorExtractor_create()
# 使用Fast寻找关键点
kp = fast1.detect(gray,None)
# 使用BRIEF计算描述子
kp, des = brief.compute(gray, kp)
print('BRIEF描述子维数',brief.descriptorSize() )
# 绘制关键点,放入图像,关键点,绘制颜色
img5 = cv2.drawKeypoints(gray, kp, None, color=(0,0,255))
plt.figure(figsize=(12,12))
im_show('BRIEF特征点描述',img5)
(2)ORB特征点检测
OpenCV进行ORB特征点检测
cv2.ORB_create(int nfeatures=500, …)
- nfeatures: 最多提取的特征点的数量
# 初始化ORB检测器
orb = cv2.ORB_create()
# 使用ORB寻找关键点
kp = orb.detect(gray,None)
# 使用ORB计算描述子
kp, des = orb.compute(gray, kp)
# 仅绘制关键点位置,不绘制尺寸和方向
img6 = cv2.drawKeypoints(gray, kp, None, color=(0,255,0), flags=0)
plt.figure(figsize=(12,12))
im_show('ORB特征点检测',img6)
ORB算法有尺度和旋转不变性,并且运算速度是远高于sift和surf算法,ORB算子在SLAM及无人机视觉等领域得到广泛应用。
四、任务小结
本次实验主要完成基于OpenCv的SURF特征点检测、FAST角点检测、ORB特征点检测。
- SURF特征提取:SIFT算法的增强版,有计算量小、运算速度快的优点
- FAST特征提取:其计算速度比SIFT 和SURF快,但是精度有限,并且没有尺度和旋转不变性。
- BRIEF特征点描述:特征描述子计算的简化与提速
- ORB特征提取:结合了FAST算法与BRIEF算法优点,是目前最快的目标检测算法。
通过本次实验需要掌握以下内容:
- 1.掌握基于OpenCv进行SURF特征点检测
- 2.掌握基于OpenCv进行FAST角点检测
- 3.掌握基于OpenCv进行ORB特征点检测
- 4.掌握几种特征检测算法的特点
–end–
说明
本实验(项目)/论文若有需要,请后台私信或【文末】个人微信公众号联系我