【机器视觉】OpenCV-Python 图像的关键点检测

本文介绍了三种图像关键点检测算法:SIFT、FAST和ORB。SIFT用于灰度图像,检测到关键点的尺度、方向和位置信息;FAST算法快速检测图像关键点,通过调整非极大值抑制参数改变检测数量;ORB是Oriented FAST和Rotated BRIEF的结合,能快速检测大量特征点。通过实例展示了三种算法的检测结果并进行了比较。
摘要由CSDN通过智能技术生成
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
# 设置兼容中文
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
D:\Anaconda\AZWZ\lib\site-packages\numpy\_distributor_init.py:30: UserWarning: loaded more than 1 DLL from .libs:
D:\Anaconda\AZWZ\lib\site-packages\numpy\.libs\libopenblas.NOIJJG62EMASZI6NYURL6JBKM4EVBGM7.gfortran-win_amd64.dll
D:\Anaconda\AZWZ\lib\site-packages\numpy\.libs\libopenblas.WCDJNK7YVMPZQ2ME2ZZHJJRJ3JIKNDB7.gfortran-win_amd64.dll
  warnings.warn("loaded more than 1 DLL from .libs:\n%s" %

1.Sift关键点检测

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O8eM3Frh-1637753728937)(attachment:image.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RGVkNRNk-1637753728939)(attachment:image.png)]

tv = cv.imread('img/tv.jpg')
# 转化为灰度图
gray = cv.cvtColor(tv,cv.COLOR_BGR2GRAY)
# 实例化shit对象
sift = cv.SIFT_create()
# 关键点检测 kp关键点信息包括方向,尺度,位置信息,des是关键点的描述符
kp,des = sift.detectAndCompute(gray,None)
# 在图像上绘制关键点的检测结果
cv.drawKeypoints(tv,kp,tv,flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
array([[[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]],

       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]],

       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]],

       ...,

       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]],

       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]],

       [[255, 255, 255],
        [255, 255, 255],
        [255, 255, 255],
        ...,
        [255, 255, 255],
        [255, 255, 255],
        [255, 255, 255]]], dtype=uint8)
# 图像显示
plt.figure(dpi=500)
plt.imshow(tv[:,:,::-1])
<matplotlib.image.AxesImage at 0x21d6721dc40>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3dY4ZoCV-1637753728941)(output_9_1.png)]

2.Fast算法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ngDagZL4-1637753728943)(attachment:image.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VzUbDx33-1637753728945)(attachment:image.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UEQeEJrX-1637753728946)(attachment:image.png)]

注:也可以传入彩色图像!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-keHiaidI-1637753728947)(attachment:image.png)]

tv = cv.imread('img/tv.jpg')
# 创建一个fast对象 传入阈值 注意:可以传入彩色图像
fast = cv.FastFeatureDetector_create(threshold=30)
# 检测图像上的关键点
kp = fast.detect(tv,None)
# 在图像上绘制关键点
img2 = cv.drawKeypoints(tv,kp,None,color=(0,0,255))
# 输出默认参数
print("Threshold:{}".format(fast.getThreshold()))
print("NonmaxSuppression:{}".format(fast.getNonmaxSuppression()))
print("neighborhood:{}".format(fast.getType()))
print("Total Keypoints with nonmaxSupperssion:{}".format(len(kp)))
Threshold:30
NonmaxSuppression:True
neighborhood:2
Total Keypoints with nonmaxSupperssion:3539
# 关闭非极大值抑制
fast.setNonmaxSuppression(0)
kp = fast.detect(tv,None)
print("Total Keypoints with nonmaxSupperssion:{}".format(len(kp)))
Total Keypoints with nonmaxSupperssion:8959
# 绘制为进行非极大值抑制的结果
img3 = cv.drawKeypoints(tv,kp,None,color=(0,0,255))
# 绘制图形
plt.figure(figsize=(20,20))
plt.subplot(1,2,1)
m1 = plt.imshow(img2[:,:,::-1])
plt.title("加入非极大值抑制")
plt.subplot(1,2,2)
m2 = plt.imshow(img3[:,:,::-1])
plt.title("未加入非极大值抑制")
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bEjBh0zN-1637753728947)(output_23_0.png)]

3.ORB算法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-832zo03C-1637753728949)(attachment:image.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o26OPPVB-1637753728950)(attachment:image.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sqUDK1wR-1637753728952)(attachment:image.png)]

tv = cv.imread('img/tv.jpg')
# 实例化ORB对象 nfeatures:检测多少个角点
orb = cv.ORB_create(nfeatures=5000)
# 检测关键点,并计算特征描述符
kp,des = orb.detectAndCompute(tv,None)
print("des.shape:",des.shape)
des.shape: (4395, 32)
# 将关键点绘制在图像上
res = cv.drawKeypoints(tv,kp,None,color=(0,0,255),flags = 0)
# 绘制图形
plt.figure(dpi=400)
plt.imshow(res[:,:,::-1])
<matplotlib.image.AxesImage at 0x15efb643280>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tcDqElDr-1637753728952)(output_32_1.png)]

总结

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iVQFiZoy-1637753728954)(attachment:image.png)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WSKH0929

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值