OpenCV 图像匹配:Harris 角点检测与简单匹配的优化方法
使用 OpenCV 进行图像匹配时,可能出现匹配不准确的情况。这可能是由于以下几个原因:
- 'Harris 角点检测'的参数可能不够优秀,导致检测到的角点不够准确。
- 匹配算法可能过于简单,只是通过欧氏距离来判断匹配,没有考虑到特征点的方向和描述子等信息。
- 图像的变化可能太大,导致匹配非常困难。
为了解决这些问题,可以尝试以下几个方法:
- 调整'Harris 角点检测'的参数,比如改变窗口大小、k值等,找到更准确的角点。
- 使用更加复杂的匹配算法,比如 SIFT、SURF、ORB 等,可以更好地描述特征点的信息。
- 对图像进行预处理,比如去除噪声、进行图像配准等,使得图像变化更小,匹配更加准确。
以下是一个简单的示例代码,演示了使用 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]
corners1 = np.argwhere(dst1 > 0.1 * dst1.max())
kp1 = [cv2.KeyPoint(x=c[1], y=c[0], _size=2) for c in corners1]
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]
corners2 = np.argwhere(dst2 > 0.1 * dst2.max())
kp2 = [cv2.KeyPoint(x=c[1], y=c[0], _size=2) for c in corners2]
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 = j
if min_dist < 10:
matches.append(cv2.DMatch(i, best_match, min_dist))
img_matches = cv2.drawMatches(img1, kp1, img2, kp2, matches, None)
plt.imshow(img_matches)
plt.show()
通过调整参数和使用更复杂的匹配算法,可以提高图像匹配的准确性。
原文地址: https://www.cveoy.top/t/topic/knrz 著作权归作者所有。请勿转载和采集!