使用 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()

代码解释

  1. 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]: 将检测到的角点用红色标记。
  2. 角点匹配

    • corners1 = np.argwhere(dst1 > 0.1 * dst1.max()): 获取 dst1 中大于阈值的角点坐标。
    • 循环遍历 corners1 中的每个角点,计算其与 corners2 中所有角点的距离。
    • 选择距离最小的角点作为匹配点。
    • 如果距离小于一个阈值,则将这两个角点匹配。
  3. 可视化结果

    • cv2.drawMatches(img1, corners1, img2, corners2, matches, None): 使用 cv2.drawMatches() 函数将匹配结果可视化。

总结

本文介绍了使用 OpenCV 中的 cv2.cornerHarris() 函数和 cv2.matchTemplate() 函数实现 Harris 角点匹配的步骤和示例代码。通过这些步骤,可以实现图像的特征匹配,并在图像处理和计算机视觉领域得到应用。

OpenCV Harris 角点匹配实现详解

原文地址: https://www.cveoy.top/t/topic/knpZ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录