【问题标题】:(-215:Assertion failed) while drawing matches in opencv(-215:断言失败)在opencv中绘制匹配时
【发布时间】:2021-10-09 11:23:58
【问题描述】:

我目前正在关注这篇文章:https://docs.opencv.org/4.5.2/dc/dc3/tutorial_py_matcher.html

绘制匹配时出现以下错误:

error: (-215:Assertion failed) i1 >= 0 && i1 < static_cast<int>(keypoints1.size()) in function 'cv::drawMatches'

通过经验和一些阅读,我发现当输入图像/矩阵出现问题时,通常会出现 -215 错误代码。我检查了我提供的两张图片中的一张是否因某种原因损坏,但我看不到问题。

这里是有问题的代码:

def j_feature_match(src, needle):
    orb = cv2.ORB_create()
    kp1, des1 = orb.detectAndCompute(src, None)
    kp2, des2 = orb.detectAndCompute(needle, None)
    bf = cv2.BFMatcher(cv2.NORM_HAMMING2, crossCheck=False)
    
    matches = bf.match(des2,des1)
    matches = sorted(matches, key = lambda x:x.distance)
    
    src_img = cv2.drawMatches(src,kp1,needle,kp2,matches[:10],None,flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
    
    return(src_img, len(matches))
  • 编辑:如评论中所述,图像的分辨率如下: 源代码 = 640x480 针 = 300x400
  • EDIT2:我已更改图片以便分享。
  1. needle
  2. src

谢谢! :)

【问题讨论】:

  • 该错误不可重现,可能与输入图像有关。请编辑您的帖子,并添加输入图像srcneedle(如果可以)。
  • src 图像直接取自网络摄像头。该图像的分辨率为 640x480,needle 图像是 300x400 图像。我想补充一点,我已尝试调整图像大小以匹配彼此,但没有成功。
  • 是否直接来自网络摄像头,无关紧要...如果必须,将两个图像保存到文件中。重要的问题是发布可重现的样本。
  • 图片已添加到帖子中。 :)

标签: python opencv computer-vision opencv-python feature-detection


【解决方案1】:

根据drawMatchesdocumentationmatches参数为matches1to2
这意味着匹配应该从srcneedle,而不是从needlesrc(顺序很重要)。

您可以将matches = bf.match(des2,des1) 替换为

matches = bf.match(des1, des2)

或者改变cv2.drawMatches的参数顺序:

import cv2


def j_feature_match(src, needle):
    orb = cv2.ORB_create()
    kp1, des1 = orb.detectAndCompute(src, None)
    kp2, des2 = orb.detectAndCompute(needle, None)
    bf = cv2.BFMatcher(cv2.NORM_HAMMING2, crossCheck=False)

    matches = bf.match(des2, des1)
    matches = sorted(matches, key=lambda x: x.distance)

    src_img = cv2.drawMatches(needle, kp2, src, kp1, matches[:10], None,
                              flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)

    return src_img, len(matches)


im1 = cv2.imread('src.jpg')
im2 = cv2.imread('needle.jpg')

res_im, n_matches = j_feature_match(im1, im2)
cv2.imshow('res_im', res_im)
cv2.waitKey()
cv2.destroyAllWindows()

结果:

【讨论】:

  • 谢谢!再次阅读文档,现在我清楚地看到了这个问题。干得好!
猜你喜欢
  • 1970-01-01
  • 2019-12-04
  • 2021-09-10
  • 1970-01-01
  • 2019-07-11
  • 2022-11-23
  • 2018-03-11
  • 2022-01-14
  • 2019-09-25
相关资源
最近更新 更多