Python OpenCV ORB Image Alignmen的掩码问题

2024-06-25 23:56:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试实现Python(3.7)OpenCV(3.4.3)ORB图像对齐。我通常用ImageMagick处理大部分数据。但我需要做一些图像对齐,并尝试使用Python OpenCV ORB。我的脚本基于satyamallick在https://www.learnopencv.com/image-alignment-feature-based-using-opencv-c-python/上的learnopencv教程。在

但是,我试图修改它,使用刚性对齐而不是透视同调,并使用遮罩过滤点,以限制y值的差异,因为图像已经几乎对齐。

mask方法取自最后一个示例中的FLANN对齐代码https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_feature2d/py_matcher/py_matcher.html。在

如果删除matchesMask,我的脚本工作得很好,它应该提供点过滤。(我还有两个工作脚本。一种是类似的,但只是过滤点而忽略遮罩。另一种基于ECC算法。)

但是,我想了解我下面的代码为什么不起作用。

在Python Opencv的当前版本中,可能我的掩码结构不正确?在

我得到的错误是:

Traceback (most recent call last):
  File "warp_orb_rigid2_filter.py", line 92, in <module>
    imReg, m = alignImages(im, imReference)
  File "warp_orb_rigid2_filter.py", line 62, in alignImages
    imMatches = cv2.drawMatches(im1, keypoints1, im2, keypoints2, matches, None, **draw_params)
SystemError: <built-in function drawMatches> returned NULL without setting an error


这是我的密码。第一个箭头显示创建遮罩的位置。第二个箭头显示了要使脚本工作,我必须删除的行。但是它忽略了我对点的过滤。在

^{pr2}$


这是我的两张照片:莉娜和莉娜旋转了1度。请注意,这些不是我的真实图像。这些图像没有diffy值>;10,但我的实际图像有。在

enter image description here

enter image description here

我正在尝试对齐和扭曲旋转后的图像以匹配原始的lena图像。在


Tags: 代码inpyhttps图像脚本matcheropencv
1条回答
网友
1楼 · 发布于 2024-06-25 23:56:13

创建遮罩的方式不正确。它只需要是一个包含单个数字的列表,每个数字都告诉您是否要使用特定的功能匹配。在

因此,更换这一行:

matches_Mask = [[0,0] for i in range(len(matches))]

有了这个:

^{pr2}$

。。。所以:

# matches_Mask = [[0,0] for i in range(len(matches))]
matches_Mask = [0] * len(matches)

这将创建一个0的列表,该列表的长度等于匹配项的数目。最后,您需要用一个值更改对掩码的写入:

  if abs(diffy) < 10.0:
    #matches_Mask[i]=[1,0]  #< - mask created
    matches_Mask[i] = 1

我终于明白了:

Estimated Affine Transform :
 [[ 1.00001187  0.01598318 -5.05963793]
  [-0.01598318  1.00001187 -0.86121051]]

请注意,掩码的格式因使用的匹配器而异。在本例中,您使用暴力匹配,因此掩码需要采用我刚才描述的格式。在

例如,如果使用FLANN的knnMatch,那么它将是一个嵌套的列表列表,每个元素都是一个k长的列表。例如,如果您有k=3和五个关键点,它将是一个包含五个元素的列表,每个元素都是一个三元素列表。子列表中的每个元素都描述了要用于绘制的匹配项。在

相关问题 更多 >