OpenCV调用BFMatcher.knnMatch触发断言失败报错如何解决
问题原因
你遇到的报错是OpenCV特征匹配前的参数校验未通过触发的断言失败,触发原因有三个常见场景:
- 没有校验视频读取结果:
cap.read()返回的ret为False时代表没有读取到有效帧,此时frame为空,调用orb.detectAndCompute得到的desp2是空值,传入匹配器后类型校验失败。 - 没有校验描述子生成结果:即使成功读取帧,也可能出现帧内无有效特征点的情况,此时
desp2同样为空,无法参与匹配计算。 - 匹配器参数与特征类型不兼容:ORB生成的是8位二进制描述子,未明确指定匹配器的距离计算规则时,部分OpenCV版本会默认使用适配浮点数描述子的距离计算方式,触发类型校验失败。
修复代码
你只需要补充有效性校验逻辑、明确匹配器参数即可,修改后的完整代码如下:
import cv2 import numpy as np cap = cv2.VideoCapture('2.mp4') imgt = cv2.imread('a.png') imgp = cv2.imread('down.jpg') hT,wT,cT = imgt.shape imgvideo = cv2.resize(imgp,(wT,hT)) orb = cv2.ORB_create(nfeatures=1000) kp1, desp1 = orb.detectAndCompute(imgt,None) # 先校验模板图的描述子是否生成成功 if desp1 is None: print("模板图未检测到特征点,请检查模板图") exit() imgt = cv2.drawKeypoints(imgt,kp1,None) # 初始化匹配器,明确指定适配ORB的汉明距离,移到循环外避免重复创建 bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=False) while (cap.isOpened()): # 逐帧捕获 ret, frame = cap.read() # 新增帧读取有效性校验,读取失败直接退出 if not ret: break kp2, desp2 = orb.detectAndCompute(frame, None) # 新增当前帧描述子有效性校验,无特征的帧直接跳过匹配 if desp2 is None: cv2.imshow('Frame', frame) if cv2.waitKey(25) & 0xFF == ord('q'): break continue matches = bf.knnMatch(desp1,desp2,k=2) good =[] for m,n in matches: if m.distance < 0.75 *n.distance: good.append(m) print(len(good)) # 显示结果帧 cv2.imshow('Frame', frame) cv2.imshow('imagetarget', imgt) cv2.imshow('imagetarget2', imgvideo) # 按q键退出 if cv2.waitKey(25) & 0xFF == ord('q'): break # 释放视频捕获对象 cap.release() # 关闭所有打开的窗口 cv2.destroyAllWindows()
内容的提问来源于stack exchange,提问作者CureofQuarantine
相关产品推荐
相关产品推荐

