Python实现cv2.linemod时遇match函数断言错误:sources.size() == modalities.size()
解决OpenCV LINE-MOD匹配时的
sources.size() == modalities.size()断言错误 我用Python实现OpenCV的LINE-MOD目标检测功能,运行以下代码时触发断言错误:
import cv2 import matplotlib.pyplot as plt template = cv2.imread('./light_t.jpg') template = cv2.resize(template, (200, 200)) print(template.shape) lineModDetector = cv2.linemod.getDefaultLINE() print(len(lineModDetector.getModalities())) mask = cv2.bitwise_not(template)[:,:,1] ret, boundingBox = lineModDetector.addTemplate([template], "circle", mask) print(ret) print(boundingBox) target = cv2.imread('../image/materias/light.jpg',) target = cv2.resize(target, (200, 200)) results = lineModDetector.match(target, threshold=80)
报错信息:
error: (-215:Assertion failed) sources.size() == modalities.size() in function 'cv::linemod::Detector::match'
错误原因
cv2.linemod.getDefaultLINE()创建的LINE-MOD检测器默认包含多个模态(比如代码中len(lineModDetector.getModalities())通常输出为2),每个模态需要对应的输入图像。调用match时直接传入单张图像,无法和模态数量匹配,触发了断言检查。
解决方法
调用match方法时,需要将目标图像包装成列表传入,列表长度要和检测器的模态数量一致。修改后的代码如下:
import cv2 import matplotlib.pyplot as plt template = cv2.imread('./light_t.jpg') template = cv2.resize(template, (200, 200)) print(template.shape) lineModDetector = cv2.linemod.getDefaultLINE() modalities_count = len(lineModDetector.getModalities()) print(f"模态数量:{modalities_count}") mask = cv2.bitwise_not(template)[:,:,1] # 添加模板时传入列表,对应模态数量 ret, boundingBox = lineModDetector.addTemplate([template], "circle", mask) print(ret) print(boundingBox) target = cv2.imread('../image/materias/light.jpg') target = cv2.resize(target, (200, 200)) # 将目标图像包装成列表传入match,和模态数量匹配 results = lineModDetector.match([target], threshold=80) # 可选:打印匹配结果详情 for result in results: print(f"匹配模板ID:{result[0]},相似度:{result[1]},边界框:{result[2]}")
补充说明:
- 默认LINE-MOD的模态可共用同一张BGR图像,因此传入单元素列表即可;若自定义了模态,需确保每个模态都有对应输入图像。
- 确保
mask是尺寸与模板一致的单通道二值图像,否则可能影响模板添加或匹配效果。
内容的提问来源于stack exchange,提问作者Breezea Brohn
相关产品推荐
相关产品推荐

