cv2 drawMatches在空白屏幕上绘制?

时间:2018-11-19 22:28:30

标签: python opencv

imageCorrespondence = cv2.drawMatches(imageLeft, kpLeft, imageRight, kpRight, [goodMatches[0]], None, flags=2)
cv2.imwrite('imageCorrespondence.png', imageCorrespondence)

在jupyter笔记本中提供了预期的输出,但是当我使用python脚本保存文件时,它正在绘制匹配项,而flags=4则正在绘制关键点,除非所有情况都在黑色图像上发生(大小正确:左+右组合)。

enter image description here

matplotlib一样可能出现的后端选择问题吗?


示例代码可以正常工作:

import numpy as np
import cv2

def getCorrespondence(imageLeft, imageRight):
    orb = cv2.ORB_create()
    kpLeft, desLeft = orb.detectAndCompute(imageLeft, None)
    kpRight, desRight = orb.detectAndCompute(imageRight, None)

    bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
    matches = bf.match(desLeft, desRight)

    goodMatches = []
    for m in matches:
        if m.distance < 100:
            goodMatches.append(m)

    print('Matches', len(goodMatches))

    imageCorrespondence = cv2.drawMatches(imageLeft, kpLeft, imageRight, kpRight, [goodMatches[0]], None, flags=2)
    return imageCorrespondence

if __name__ == '__main__':
    imageLeft = cv2.imread('image_001.png')
    imageRight = cv2.imread('image_002.png')

    imageCorrespondence = getCorrespondence(imageLeft, imageRight)
    cv2.imwrite('imageCorrespondence.png', imageCorrespondence)
    print('Image Saved')

但是,一旦我开始将功能与从其他位置加载的其他图像一起使用时,它就会崩溃。我确定这些图像是否有内容并且cv2.imwrite('imageLeft', imageLeft)可以正常工作并且图像可以很好地保存。

1 个答案:

答案 0 :(得分:2)

起初我以为第六个参数None是造成这种情况的原因,但这并没有造成任何麻烦。

cv2.drawMatches()接受imageLeft和imageRight作为numpy数组,如docs中所述:

outImg    =   cv.drawMatches( img1, keypoints1, img2, keypoints2, matches1to2, outImg[, matchColor[, singlePointColor[, matchesMask[,flags]]]]    )
     

参数

     
      
  • img1第一张原始图片。
  •   
  • keypoints1来自第一个源图像的关键点。
  •   
  • img2第二个源图像。
  •   
  • keypoints2来自第二个源图像的关键点。 ...
  •   

但是,打破这一点的是alpha层,如果您恰巧将numpy数组中的alpha层加载,它将在黑色图像上绘制。当我手动删除numpy数组中的alpha层并且只有三个通道时,它开始正常工作。这可能是因为matplotlib处理alpha层的方式与cv2.imwrite处理相同层的方式不同,它似乎可以在Jupyter笔记本中使用,但未使用Python脚本。

我最初以为我需要从BGRA切换到ABGR,但这不是BGRA很好的情况,如果输入图像具有第四个alpha层,我将得到黑屏。 Opencv通常在读取图像时会剥离Alpha层 ...!