Fácil de entender: algoritmo de detección de esquinas OpenCV (implementación del algoritmo Harris y Shi-Tomas)

Tabla de contenido

1 Características de la imagen

2. Detección de esquinas de Harris

2.1 Implementación del código

2.2 Visualización de resultados

3. Algoritmo de detección de esquinas Shi-Tomasi

3.1, implementación del código

3.2 Visualización de resultados


1 Características de la imagen

2. Detección de esquinas de Harris

2.1 Implementación del código

import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
from pylab import mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']

img = cv.imread("corner.png")
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)

#角点检测
#输入图像必须是float32
gray = np.float32(gray)

#最后一个参数在0.04-0.05之间
dst = cv.cornerHarris(gray , 2,3,0.04)  #dst变量是一个和输入灰度图像大小相同的浮点类型的矩阵,其中每个像素的值表示该像素是否是角点的概率。
'''gray:输入的灰度图像。
2:表示Sobel算子内核的大小,用于计算角点响应函数的导数。通常使用的是3x3或5x5的内核大小。
3:表示邻域窗口的大小,用于计算角点响应函数的响应值。对于每个像素点,计算其与周围像素之间的差异。
0.04:表示角点响应函数的自由参数k。k的值较小将使检测到的角点更加敏感,而k的值较大则会减少角点数量。'''

#设置阈值,将角点绘制出来,阈值根据图像进行选择
img[dst >0.001*dst.max()] = [0,0,255]
'''它会将图像 img 中响应值大于 0.001 * dst.max() 的像素点设为 [0, 0, 255],即红色。

请注意,dst.max() 表示检测到的角点响应函数的最大值。
通过乘以 0.001 ,可以设置一个相对较小的阈值,以便只有极具代表性的角点被标记为红色。你可以根据需要调整阈值大小'''
#图像显示
plt.figure(figsize=(5,4),dpi=100)
plt.imshow(img[:,:,::-1]),plt.title("Harris角点检测")
plt.xticks([]),plt.yticks([])
plt.show()

2.2 Visualización de resultados

3. Algoritmo de detección de esquinas Shi-Tomasi

3.1, implementación del código

import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
from pylab import mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']

img = cv.imread("corner.png")
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)

#角点检测
corners = cv.goodFeaturesToTrack(gray , 1000,0.1,10)
'''
gray:输入的灰度图像。
1000:表示要检测的角点数量。这里设置为1000,表示最多检测1000个角点,但实际检测到的角点数量可能会少于这个值。
0.01:表示角点质量水平阈值,用于筛选保留哪些角点。较大的阈值会筛选出更强的角点。
10:表示角点之间的最小欧氏距离。如果两个角点之间的距离小于这个值,其中一个角点将被抑制。
'''
#绘制角点
for i in corners:
    x,y = i.ravel()
    cv.circle(img,(x,y),2,(0,0,255),-1)
#图像显示
plt.figure(figsize=(5,4),dpi=100)
plt.imshow(img[:,:,::-1]),plt.title("shi-Tomas角点检测")
plt.xticks([]),plt.yticks([])
plt.show()

3.2 Visualización de resultados

Supongo que te gusta

Origin blog.csdn.net/qq_53545309/article/details/133298628
Recomendado
Clasificación