【问题标题】:opencv-python : drawMatchesKnn() always return NULLopencv-python:drawMatchesKnn() 总是返回 NULL
【发布时间】:2019-06-02 22:06:58
【问题描述】:

我想做一个关于徽标检测的简单项目。因此,我尝试遵循有关特征检测的 OpenCV-Python 教程。 OpenCV: Feature Matching

我的代码如下所示。

ratio = 0.8
logo = cv.imread("T01/CocaCola_logo2.png", cv.IMREAD_GRAYSCALE)
img = cv.imread("T01/CocaCola.png", cv.IMREAD_GRAYSCALE)

orb = cv.ORB_create()
kp_logo, des_logo = orb.detectAndCompute(logo, None)
kp_img, des_img = orb.detectAndCompute(img, None)

FLANN_INDEX_LSH = 6
index_params = dict(algorithm=FLANN_INDEX_LSH,
                    table_number=6,
                    key_size=12,
                    multi_probe_level=1)
search_params = dict(checks=50)
flann = cv.FlannBasedMatcher(index_params, search_params)
match_flann = flann.knnMatch(des_logo, des_img, k=2)

good = []
for p, q in match_flann:
    if p.distance > q.distance*ratio:
        good.append(p)

try:
    img_match = np.empty((max(logo.shape[0], img.shape[0]), logo.shape[1] + img.shape[1], 3), dtype=np.uint8)
    cv.drawMatchesKnn(logo, kp_logo, img, kp_img, good,
                      outImg=img_match, matchColor=None, singlePointColor=(255, 255, 255), flags=2)
    cv.imshow("flann matching", img_match)
    cv.waitKey(0)
except:
    print("...")

此代码无法正常工作。进程总是被 drawMatchesKnn() 错误处理。在我向该函数添加 try-except 之前,进程发生了系统错误:SystemError: returned NULL without setting an error

问题的原因是什么?找了好久,好不容易。


堆栈跟踪: 回溯(最近一次通话最后): 文件“C:/Users/choib/Desktop/openCVtest3/T01_ORBtest.py”,第 73 行,在 cv.drawMatchesKnn(标志,kp_logo,img,kp_img,好,outImg=img_match,matchColor=None,singlePointColor=(255, 255, 255),flags=2) SystemError: 返回 NULL 而没有设置错误

【问题讨论】:

  • 你能提供堆栈跟踪吗?您是否尝试过使用所需的最小参数,例如:img_match = cv.drawMatchesKnn(logo, kp_logo, img, kp_img, good, flags=2) 它是否也会给您带来错误?
  • @api55 我添加了有问题的堆栈跟踪。我还更改了函数,例如:img_match = cv.drawMatchesKnn(logo, kp_logo, img, kp_img, good, outImg=None, flags=2)(如果未提及 outImg,则会导致类型错误。)但它与我在问题中写的错误相同。

标签: python opencv computer-vision feature-detection


【解决方案1】:

我误解了 drawMatches() 和 drawMatchesKnn()。 reference

drawMatchesKnn()需要得到由DMatch的向量组成的向量作为matches1to2。所以就我而言,我修复了如下代码。

案例一:正确使用

img_match = np.empty((max(logo.shape[0], img.shape[0]), logo.shape[1] + img.shape[1], 3), dtype=np.uint8)
cv.drawMatches(logo, kp_logo, img, kp_img, good_flann,
               outImg=img_match, matchColor=None, singlePointColor=(255, 255, 255), flags=2)
cv.imshow("flann matching", img_match)
cv.waitKey(0)

案例2:使用drawMatchesKnn()

img_match = np.empty((max(logo.shape[0], img.shape[0]), logo.shape[1] + img.shape[1], 3), dtype=np.uint8)
cv.drawMatchesKnn(logo, kp_logo, img, kp_img, match_flann,
                  outImg=img_match, matchColor=None, singlePointColor=(255, 255, 255), flags=2)
cv.imshow("flann matching", img_match)
cv.waitKey(0)

在这些代码中,good_flann 只是 DMatch 的向量。 match_flann 是向量的向量。所以流程对这些部分没有任何问题。

【讨论】:

    【解决方案2】:

    我收到此错误是因为我试图通过将DMatch 对象列表传递给drawMatchesKnn 来绘制匹配项。但是,drawMatchesKnn 需要一个列表列表,每个列表都包含 DMatch 对象。

    【讨论】:

      猜你喜欢
      • 2014-03-04
      • 2016-11-02
      • 2014-05-06
      • 2012-06-05
      • 2014-05-30
      • 2014-02-23
      • 2017-10-12
      • 2013-08-16
      • 2016-03-28
      相关资源
      最近更新 更多