OpenCV Harris 角点匹配实现详解
使用 OpenCV 实现 Harris 角点匹配
本文将介绍如何使用 OpenCV 中的 cv2.cornerHarris() 函数和 cv2.matchTemplate() 函数来实现 Harris 角点匹配。
1. Harris 角点检测
首先,我们需要使用 cv2.cornerHarris() 函数检测图像中的 Harris 角点。
import cv2
import numpy as np
from matplotlib import pyplot as plt
img1 = cv2.imread('1.png')
img2 = cv2.imread('4.png')
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray1 = np.float32(gray1)
dst1 = cv2.cornerHarris(gray1, 2, 3, 0.04)
img1[dst1 > 0.1 * dst1.max()] = [0, 0, 255]
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
gray2 = np.float32(gray2)
dst2 = cv2.cornerHarris(gray2, 2, 23, 0.04)
img2[dst2 > 0.1 * dst2.max()] = [0, 0, 255]
2. 角点匹配
接下来,我们需要将两个图像中的 Harris 角点进行匹配。可以使用 cv2.matchTemplate() 函数来实现。
import cv2
import numpy as np
from matplotlib import pyplot as plt
img1 = cv2.imread('1.png')
img2 = cv2.imread('4.png')
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray1 = np.float32(gray1)
dst1 = cv2.cornerHarris(gray1, 2, 3, 0.04)
corners1 = np.argwhere(dst1 > 0.1 * dst1.max())
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
gray2 = np.float32(gray2)
dst2 = cv2.cornerHarris(gray2, 2, 23, 0.04)
corners2 = np.argwhere(dst2 > 0.1 * dst2.max())
matches = []
for i in range(len(corners1)):
min_dist = np.inf
best_match = None
for j in range(len(corners2)):
dist = np.linalg.norm(corners1[i] - corners2[j])
if dist < min_dist:
min_dist = dist
best_match = corners2[j]
if min_dist < 10:
matches.append(cv2.DMatch(i, matches, min_dist))
img_matches = cv2.drawMatches(img1, corners1, img2, corners2, matches, None)
plt.imshow(img_matches)
plt.show()
3. 可视化结果
最后,可以使用 cv2.drawMatches() 函数将匹配结果可视化。
import cv2
import numpy as np
from matplotlib import pyplot as plt
# ... 上面的代码 ...
img_matches = cv2.drawMatches(img1, corners1, img2, corners2, matches, None)
plt.imshow(img_matches)
plt.show()
代码解释
-
Harris 角点检测
cv2.cornerHarris(gray1, 2, 3, 0.04): 使用cv2.cornerHarris()函数检测图像gray1中的 Harris 角点。参数分别为:gray1: 输入图像,需要为灰度图像2: 块大小,用于计算梯度3: 用于计算角点响应函数的窗口大小0.04: Harris 角点检测算法中的阈值
img1[dst1 > 0.1 * dst1.max()] = [0, 0, 255]: 将检测到的角点用红色标记。
-
角点匹配
corners1 = np.argwhere(dst1 > 0.1 * dst1.max()): 获取dst1中大于阈值的角点坐标。- 循环遍历
corners1中的每个角点,计算其与corners2中所有角点的距离。 - 选择距离最小的角点作为匹配点。
- 如果距离小于一个阈值,则将这两个角点匹配。
-
可视化结果
cv2.drawMatches(img1, corners1, img2, corners2, matches, None): 使用cv2.drawMatches()函数将匹配结果可视化。
总结
本文介绍了使用 OpenCV 中的 cv2.cornerHarris() 函数和 cv2.matchTemplate() 函数实现 Harris 角点匹配的步骤和示例代码。通过这些步骤,可以实现图像的特征匹配,并在图像处理和计算机视觉领域得到应用。
原文地址: https://www.cveoy.top/t/topic/knpZ 著作权归作者所有。请勿转载和采集!