You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:45:54