ORB图像匹配代码突发OpenCV (-215)错误求助(opencv-python 3.4.0.12)
我帮你分析下这个问题,你遇到的cv2.error: (-215) type == src2.type() && src1.cols == src2.cols && (type ==5 || type ==0)错误,本质是ORB生成的两个描述符(des1和des2)不满足匹配的前提条件——要么类型不一样,要么列数不相等,要么类型不是OpenCV匹配函数预期的格式。结合你说之前能正常运行现在突然报错的情况,咱们一步步来排查解决:
第一步:先确认图像有没有成功读取
之前能跑现在报错,最常见的原因就是图片路径变了,或者图片文件损坏,导致img1或img2读取失败(变成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可能检测不到任何关键点,导致des1或des2是空的。你可以在计算描述符后加上检查:
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




