【OpenCV】(八)图像角点检测

目录

 Harris算法图像角点检测

 Shi—tomas算法图像角点检测

 SIFT算法图像角点检测

 FAST算法图像角点检测

 ORB算法图像角点检测


 Harris算法图像角点检测

# Harris角点检测

import cv2 as cv
import matplotlib.pyplot as plt

# 读取图像,并转换成灰度图像
img = cv.imread('picture/checkerboard.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 角点检测
# 输入图像必须是float32
# dst = cv.cornerHarris(src, blockSize, ksize, k)
# img: 数据类型为float32的输入图像
# blockSize: 角点检测中要考虑的邻域大小
# ksize: sobel求导使用的核大小
# k: 角点检测方程中的自由参数,取值参数为[0.04, 0.06]
dst = cv.cornerHarris(gray, 2, 3, 0.04)

# 设置阈值,将角点绘制出来,阈值根据图像进行选择
img[dst > 0.01 * dst.max()] = [0, 0, 255]

# 图像显示
plt.imshow(img[:, :, :: -1])
plt.show()

运行结果

原图:角点检测(放大后):

 Shi—tomas算法图像角点检测

# Shi—Tomas角点检测

import cv2 as cv
import matplotlib.pyplot as plt
# 读取图像
img = cv.imread('picture/tower.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 角点检测
# corners = cv2.goodFeaturesToTrack(image, maxcorners, qualityLevel, minDistance)
# Image: 输入灰度图像
# maxCorner: 获取角点数的数目
# qualityLevel: 该参数之处最低可接受的角点质量水平,在0-1之间
# minDistance: 角点之间最小的欧式距离,避免得到相邻特征点
# 返回:Corners: 搜索到的角点,在这里所有低于质量水平的角点被排除掉,然后把合格的角点按质量排序,然后将质量较好的角点附近(小于最小欧式距离)的角点删掉,最后找到maxCorners个角点返回
corners = cv.goodFeaturesToTrack(gray, 1000, 0.01, 10)

# 绘制角点
for i in corners:
    x, y = i.ravel()
    cv.circle(img, (int(x), int(y)), 2, (0, 0, 255), -1)

# 图像显示
plt.imshow(img[:, :, :: -1])
plt.show()

运行结果

原图:

 SIFT算法图像角点检测

注意为使用cv2.xfeatures2d.SIFT_create(),需安装opencv-contrib-python库

# SIFT算法关键点检测

import cv2 as cv
import matplotlib.pyplot as plt

# 读取图像
img = cv.imread('picture/tower.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# SIFT关键点检测
# 1. 实例化sift
sift = cv.xfeatures2d.SIFT_create()

# 2. 利用sift.detectAndCompute()检测关键点并计算
kp, des = sift.detectAndCompute(gray, None)
# gray: 进行关键带你检测的图像,注意是灰度图像
# kp: 关键点信息,包括位置,尺度,方向信息
# des: 关键点描述符,每个关键点对应128个梯度信息的特征向量

# 3. 将关键点检测结果绘制在图像上
# cv2.drawKeypoints(image, keypoints, outputimage, color, flags)
# image: 原始图像
# keypoints: 关键点信息,将其绘制在图像上
# outputimage: 输出图片,可以是原始图像
# color: 颜色设置,通过修改(b, g, r)的值,更改画笔的颜色,b = 蓝色, g = 绿色, r = 红色
# flags: 绘图功能的标识设置
# 1. cv2.DRAW_MATCHES_FLAGS_DEFAULT: 创建输出图像矩阵,使用现存的输出图像绘制匹配对象和特征点,对每一个关键点只绘制中间点
# 2. cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG: 不创建输出图像矩阵,而是在输出图像上绘制匹配对
# 3. cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS: 对每一个特征点绘制带大小和方向的关键点图形
# 4. cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS: 单点的特征点不被绘制
cv.drawKeypoints(img, kp, img, flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

# 图像显示
plt.imshow(img[:, :, :: -1])
plt.show()

运行结果

 FAST算法图像角点检测

# FAST算法关键点检测

import cv2 as cv
import matplotlib.pyplot as plt

# 读取图像
img = cv.imread('picture/tower.jpg')

# Fast角点检测
# 1. 实例化fast(可以处理彩色空间图像)
# fast = cv.FastFeatureDetector_create(threshold, nonmaxSuppression)
# threshold: 阈值t,有默认值10
# nonmaxSuppression: 是否进行非极大值抑制,默认值True
# fast: 创建的FastFeatureDetector对象
fast = cv.FastFeatureDetector_create(threshold=30)

# 2. 利用fast.detect检测关键点,没有对应的关键点描述
# kp = fast.detect(grayImg, None)
# gray: 进行关键点检测的图像,注意是灰度图像
# kp: 关键点信息,包括位置,尺度,方向信息
kp = fast.detect(img, None)

# 3. 将关键点检测结果绘制在图像上
# cv.drawKeypoints(image, keypoints, outputimage, color, flags)
# image: 原始图像
# keypoints: 关键点信息,将其绘制在图像上
# outputimage: 输出图片,可以是原始图像
# color: 颜色设置,通过修改(b, g, r)的值,更改画笔的颜色,b = 蓝色, g = 绿色, r = 红色
# flags: 绘图功能的标识设置
# 1. cv2.DRAW_MATCHES_FLAGS_DEFAULT: 创建输出图像矩阵,使用现存的输出图像绘制匹配对象和特征点,对每一个关键点只绘制中间点
# 2. cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG: 不创建输出图像矩阵,而是在输出图像上绘制匹配对
# 3. cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS: 对每一个特征点绘制带大小和方向的关键点图形
# 4. cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS: 单点的特征点不被绘制
img2 = cv.drawKeypoints(img, kp, None, color=(0, 0, 255))

# 4. 关闭非极大值抑制
fast.setNonmaxSuppression(0)
kp = fast.detect(img, None)
img3 = cv.drawKeypoints(img, kp, None, color=(0, 0, 255))

# 显示图像
# 图像显示
plt.imshow(img2[:, :, :: -1])
plt.show()
plt.imshow(img3[:, :, :: -1])
plt.show()

 运行结果

加入极大值抑制:

 未加入极大值抑制:

 ORB算法图像角点检测

# ORB算法角点检测

import cv2 as cv
import matplotlib.pyplot as plt

# 读取图像
img = cv.imread('picture/tower.jpg')

# ORB角点检测
# 1.1 实例化ORB
# orb = cv.ORB_create(nfeatures)

orb = cv.ORB_create(nfeatures=500)

# 2. 利用orb.detectAndCompute()检测关键点并计算
# kp, des = orb.detectAndCompute(gray, None)
# gray: 进行关键点检测的图像,注意是灰度图像
# kp: 关键点信息,包括位置,尺度,方向信息
# des: 关键点描述符,每个关键点BRIEF特征向量,二进制字符串
kp, des = orb.detectAndCompute(img, None)

# 3. 将关键点检测结果绘制在图像上
# cv.drawKeypoints(image, keypoints, outputimage, color, flags)
# image: 原始图像
# keypoints: 关键点信息,将其绘制在图像上
# outputimage: 输出图片,可以是原始图像
# color: 颜色设置,通过修改(b, g, r)的值,更改画笔的颜色,b = 蓝色, g = 绿色, r = 红色
# flags: 绘图功能的标识设置
# 1. cv2.DRAW_MATCHES_FLAGS_DEFAULT: 创建输出图像矩阵,使用现存的输出图像绘制匹配对象和特征点,对每一个关键点只绘制中间点
# 2. cv2.DRAW_MATCHES_FLAGS_DRAW_OVER_OUTIMG: 不创建输出图像矩阵,而是在输出图像上绘制匹配对
# 3. cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS: 对每一个特征点绘制带大小和方向的关键点图形
# 4. cv2.DRAW_MATCHES_FLAGS_NOT_DRAW_SINGLE_POINTS: 单点的特征点不被绘制
img2 = cv.drawKeypoints(img, kp, None, color=(0, 0, 255), flags=0)

# 显示图像
plt.imshow(img2[:, :, :: -1])
plt.show()

运行结果

  • 2
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值