使用cv2.drawMatches报错:outImg不是numpy数组或标量,求技术支持
解决cv2.drawMatches的TypeError问题
嘿,我来帮你搞定这个ORB关键帧匹配代码里的错误!你遇到的TypeError: outImg is not a numpy array, neither a scalar是因为**cv2.drawMatches的参数顺序用错了**,咱们一步步来修正:
错误原因分析
你写的这行代码:
img3 = cv2.drawMatches(img1,kp1,img2,kp2,None,matches[:10], flags=2)
把None(原本是outImg的可选参数)放在了matches参数的前面,导致函数把matches[:10]当成了outImg传入——而matches是匹配结果列表,不是numpy数组,自然就触发了类型错误。
cv2.drawMatches的核心参数顺序是:cv2.drawMatches(img1, kp1, img2, kp2, matches, outImg=None, ...)
修正后的完整代码
下面是调整参数顺序后的可运行代码,我还顺便优化了图片路径的写法(用原始字符串避免转义麻烦):
import numpy as np import cv2 from matplotlib import pyplot as plt # 用原始字符串写路径,不用反复转义反斜杠 img1 = cv2.imread(r"C:\Users\user\Desktop\picture\Pikachu_Libre.png", 0) img2 = cv2.imread(r"C:\Users\user\Desktop\picture\Pikachu_Libre.png", 0) # 初始化ORB检测器 orb = cv2.ORB_create() # 检测关键点并计算描述符 kp1, des1 = orb.detectAndCompute(img1, None) kp2, des2 = orb.detectAndCompute(img2, None) # 创建暴力匹配器 bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True) # 匹配描述符并按距离排序 matches = bf.match(des1, des2) matches = sorted(matches, key=lambda x: x.distance) # 修正参数顺序:把matches放在outImg参数(None)前面 img3 = cv2.drawMatches(img1, kp1, img2, kp2, matches[:10], None, flags=2) plt.imshow(img3), plt.show()
额外小提示
- 因为你用的是同一张图片做匹配,所以所有关键点都会完美匹配,测试的时候可以换一张不同角度/缩放的皮卡丘图片,能更直观看到ORB的匹配效果。
- 路径用原始字符串(前面加
r)可以避免手动写双反斜杠的麻烦,更简洁不易错。
内容的提问来源于stack exchange,提问作者Shi Jie Tio
相关产品推荐
相关产品推荐

