You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ORB图像匹配代码突发OpenCV (-215)错误求助(opencv-python 3.4.0.12)

解决OpenCV ORB图像匹配中batchDistance的(-215)错误

我帮你分析下这个问题,你遇到的cv2.error: (-215) type == src2.type() && src1.cols == src2.cols && (type ==5 || type ==0)错误,本质是ORB生成的两个描述符(des1和des2)不满足匹配的前提条件——要么类型不一样,要么列数不相等,要么类型不是OpenCV匹配函数预期的格式。结合你说之前能正常运行现在突然报错的情况,咱们一步步来排查解决:

第一步:先确认图像有没有成功读取

之前能跑现在报错,最常见的原因就是图片路径变了,或者图片文件损坏,导致img1img2读取失败(变成None)。你可以在读取图像后立刻加上检查代码:

img1 = cv2.imread('C:\\IRRNEW\\models\\research\\object_detection\\Scanner\\IMG_Hello.jpg',0) # queryImage
img2 = cv2.imread('C:\\IRRNEW\\models\\research\\object_detection\\Image.jpg',0) # trainImage

# 新增检查步骤,确认图像读取成功
if img1 is None:
    print("糟了!img1读不出来,检查下路径是不是写错了,或者文件有没有损坏!")
    exit()
if img2 is None:
    print("糟了!img2读不出来,检查下路径是不是写错了,或者文件有没有损坏!")
    exit()

如果你的路径里包含中文,OpenCV 3.4.0.12版本用imread直接读取会失败,这时候可以换成下面的方法读取(支持中文路径):

import numpy as np
import cv2

def cv_imread(file_path):
    # 用numpy和cv2.imdecode组合读取中文路径图片
    cv_img = cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), cv2.IMREAD_GRAYSCALE)
    return cv_img

# 替换原来的imread调用
img1 = cv_imread('C:\\IRRNEW\\models\\research\\object_detection\\Scanner\\IMG_Hello.jpg')
img2 = cv_imread('C:\\IRRNEW\\models\\research\\object_detection\\Image.jpg')

第二步:检查ORB生成的描述符是否有效

有时候图像太模糊、纹理太少,ORB可能检测不到任何关键点,导致des1des2是空的。你可以在计算描述符后加上检查:

orb = cv2.ORB_create(nfeatures=10000, scoreType=cv2.ORB_FAST_SCORE)
kp1, des1 = orb.detectAndCompute(img1,None)
kp2, des2 = orb.detectAndCompute(img2,None)

# 检查描述符是否存在且有效
if des1 is None or len(des1) == 0:
    print("img1里没检测到ORB关键点,没法生成描述符!换张纹理多的图试试?")
    exit()
if des2 is None or len(des2) == 0:
    print("img2里没检测到ORB关键点,没法生成描述符!换张纹理多的图试试?")
    exit()

# 还可以打印下描述符的类型和形状,确认是否匹配
print(f"des1的类型:{des1.dtype},形状:{des1.shape}")
print(f"des2的类型:{des2.dtype},形状:{des2.shape}")

ORB生成的描述符默认是uint8类型,如果其中一个变成了其他类型,就会触发错误。要是发现类型不对,可以强制转换:

des1 = des1.astype(np.uint8)
des2 = des2.astype(np.uint8)

第三步:修正代码里的笔误

看你的代码最后有一行b=len(des),这里的des根本没定义啊!应该是des1或者des2吧?虽然这行不会导致前面的匹配错误,但匹配成功后会触发新的报错,建议修正:

# 改成你需要的des1或des2
b = len(des1)
print(b)

第四步:试试调整ORB参数或匹配器参数

你的OpenCV版本是3.4.0.12,这个版本的ORB在nfeatures设置过大(比如10000)时可能有小bug。你可以试试把nfeatures改小一点,比如1000,或者换用cv2.NORM_HAMMING2作为匹配准则:

# 调整nfeatures参数
orb = cv2.ORB_create(nfeatures=1000, scoreType=cv2.ORB_FAST_SCORE)
# 换用NORM_HAMMING2
bf = cv2.BFMatcher(cv2.NORM_HAMMING2, crossCheck=True)

按照上面的步骤一步步排查,应该能解决你的问题。

内容的提问来源于stack exchange,提问作者user9744314

火山引擎 最新活动