OpenCV 错误解决:cv2.error: OpenCV(4.7.0) :-1: error: (-5:Bad argument) in function 'DMatch'
在使用 OpenCV 进行特征点匹配时,可能会遇到以下错误:
cv2.error: OpenCV(4.7.0) :-1: error: (-5:Bad argument) in function 'DMatch'
> Overload resolution failed:
> - Argument '_trainIdx' is required to be an integer
> - DMatch() missing required argument '_distance' (pos 4)
这个错误通常发生在使用 cv2.DMatch 对象创建匹配结果时。错误原因是:
- 第二个参数传入了一个列表
matches,但应该传入一个整数,表示匹配到的特征点在第二张图片中的索引。 - 创建
DMatch对象时,缺少了_distance参数。
以下为修改后的代码:
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())
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())
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, corners1, img2, corners2, matches, None)
plt.imshow(img_matches)
plt.show()
在修改后的代码中,cv2.DMatch 的第二个参数现在传入的是 best_match,即匹配到的特征点在第二张图片中的索引。同时,我们还添加了 min_dist 参数,表示两个特征点之间的距离。
通过这些修改,可以成功解决 cv2.DMatch 函数的错误,并实现特征点匹配的功能。
原文地址: https://www.cveoy.top/t/topic/knqg 著作权归作者所有。请勿转载和采集!