imageCorrespondence = cv2.drawMatches(imageLeft, kpLeft, imageRight, kpRight, [goodMatches[0]], None, flags=2)
cv2.imwrite('imageCorrespondence.png', imageCorrespondence)
在jupyter笔记本中提供了预期的输出,但是当我使用python脚本保存文件时,它正在绘制匹配项,而flags=4
则正在绘制关键点,除非所有情况都在黑色图像上发生(大小正确:左+右组合)。
像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)
可以正常工作并且图像可以很好地保存。
答案 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层 ...!