别人没那么重要,我也没那么重要,好好活着,把能做的小事做好,够不到的东西就放弃,承认就好。做一个心情好能睡着的人,你所有事情都会在正轨上。

PythonOpenCV-特征检测-角检测

  角是两条边的交点,也可称为角点或拐角,它是图像中各个方向上强度变化最大的区域。

  OpenCV的 cv2.cornerHarris()、cv2.cornerSubPix()和 cv2.goodFeaturesToTrack()函数用于角检测。

1.  哈里斯角检测

  cv2.cornerHarris()函数根据哈里斯角检测器算法检测图像中的角,其基本格式如下:

dst = cv2.cornerHarris(src, blockSize, ksize, k)

参数说明:

dst :返回结果,它是一个 numpy.ndarray 对象,大小和 src 相同,每一个数组元素对应一个像素点,其值越大,对应像素点是角的概率越高

src:8 位单通道或浮点值图像

blockSize:邻域大小,值越大,检测出的角占的区域越大

ksize:哈里斯角检测器使用的 Sobel 算子的中孔参数

k:哈里斯角检测器的自由参数。

ksize 和 k 影响检测的敏感度,值越小,检测出的角越多,但准确率越低

  代码示例:

import cv2 as cv
import numpy as np

img_src = cv.imread('cube.jpg')  # 打开输入图像
cv.imshow('src', img_src)
img_gray = cv.cvtColor(img_src, cv.COLOR_BGR2GRAY)  # 转换为灰度图像
img_gray = np.float32(img_gray)  # 转换为浮点类型
img_dst = cv.cornerHarris(img_gray, 10, 5, 0.001)  # 执行角检测
img_src[img_dst > 0.02 * img_dst.max()] = [0, 0, 255]  # 将角设置为红色
cv.imshow('dst', img_src)  # 显示检测结果
cv.waitKey(0)

  运行结果:

 

2. 优化哈里斯角

  使用 cv2.cornerHarris()函数检测出的角称为哈里斯角,它包含了一定数量的像素。

  有时,可能需要对哈里斯角进行进一步处理,找出角的更精确位置。

  cv2.cornerSubPix()函数用于对哈里斯角进行优化,找出更准确的角的位置,其基本格式如下:

dst = cv2.cornerSubpix(src, corners, winSize, zeroZone, criteria)

  参数说明:

dst:返回结果,存储优化后的角信息

src:8 位单通道或浮点值图像

corners:哈里斯角的质心坐标

winSize:搜索窗口边长的一半

zeroZone:零值边长的一半

criteria:优化查找的终止条件

  代码示例:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

img_src = cv.imread('cube.jpg')  # 打开图像,默认BGR格式
cv.imshow('src', img_src)
img_gray = cv.cvtColor(img_src, cv.COLOR_BGR2GRAY)  # 转换为灰度图像
img_gray = np.float32(img_gray)  # 转换为浮点类型
dst = cv.cornerHarris(img_gray, 8, 7, 0.04)  # 查找哈里斯角
r, dst = cv.threshold(dst, 0.01 * dst.max(), 255, 0)  # 二值化阈值处理
dst = np.uint8(dst)  # 转换为整型
r, l, s, cxys = cv.connectedComponentsWithStats(dst)  # 查找质点坐标
cif = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 100, 0.001)  # 定义优化查找条件
corners = cv.cornerSubPix(img_gray, np.float32(cxys), (5, 5), (-1, -1), cif)  # 执行优化查找
res = np.hstack((cxys, corners))  # 堆叠构造新数组,便于标注角
res = np.intp(res)  # 转换为整型
img_src[res[:, 1], res[:, 0]] = [0, 0, 255]  # 将哈里斯角对应像素设置为红色
img_src[res[:, 3], res[:, 2]] = [0, 255, 0]  # 将优化结果像素设置为绿色
img = cv.cvtColor(img_src, cv.COLOR_BGR2RGB)  # 转换为RGB格式
plt.imshow(img)
plt.axis('off')
plt.show()  # 显示检测结果

  运行结果:

         👉    

 

3. Shi-Tomasi角检测

  OpenCV的 cv.goodFeaturesToTrack()函数使用 Shi-Tomasi 角检测器查找图像中的 /个最强角,其基本格式如下:

dst = cv.goodFeaturesToTrack(src,maxCorners, qualityLevel, minDistance)

  参数说明:

dst:返回结果,保存了检测到的角在原图像中的坐标

src: 8 位单通道或浮点值图像

maxCorners:返回的角的最大数量

qualityLevel:可接受的角的最低质量

minDistance:返回的角之间的最小欧几里得距离

  代码示例:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

img_src = cv.imread('five.jpg')  # 打开图像,默认BGR格式
img_gray = cv.cvtColor(img_src, cv.COLOR_BGR2GRAY)  # 转换为灰度图像
img_gray = np.float32(img_gray)  # 转换为浮点类型
corners = cv.goodFeaturesToTrack(img_gray, 6, 0.1, 100)  # 检测角,最多6个
corners = np.intp(corners)  # 转换为整型
for i in corners:
    x, y = i.ravel()
    cv.circle(img_src, (x, y), 4, (0, 0, 255), -1)  # 用圆点标注找到的角,红色
img_dst = cv.cvtColor(img_src, cv.COLOR_BGR2RGB)  # 转换为RGB格式
plt.imshow(img_dst)
plt.axis('off')
plt.show()  # 显示检测结果

  运行结果:

 

/*-------------------------------------------------------------------------------------------------------

笔者说明:

  该笔记来源于本人学习Python + OpenCv时的资料,

  分享出来只是为了供大家学习,并且为了自己以后想要用的时候方便寻找。

时间:2023年9月3日

------------------------------------------------------------------------------------------------------------*/

posted @ 2023-09-03 10:42  一路狂奔的乌龟  阅读(178)  评论(0编辑  收藏  举报
返回顶部