我正在尝试实现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
这是我的密码。第一个箭头显示创建遮罩的位置。第二个箭头显示了要使脚本工作,我必须删除的行。但是它忽略了我对点的过滤。在
这是我的两张照片:莉娜和莉娜旋转了1度。请注意,这些不是我的真实图像。这些图像没有diffy值>;10,但我的实际图像有。在
我正在尝试对齐和扭曲旋转后的图像以匹配原始的lena图像。在
创建遮罩的方式不正确。它只需要是一个包含单个数字的列表,每个数字都告诉您是否要使用特定的功能匹配。在
因此,更换这一行:
有了这个:
^{pr2}$。。。所以:
这将创建一个0的列表,该列表的长度等于匹配项的数目。最后,您需要用一个值更改对掩码的写入:
我终于明白了:
请注意,掩码的格式因使用的匹配器而异。在本例中,您使用暴力匹配,因此掩码需要采用我刚才描述的格式。在
例如,如果使用FLANN的
knnMatch
,那么它将是一个嵌套的列表列表,每个元素都是一个k
长的列表。例如,如果您有k=3
和五个关键点,它将是一个包含五个元素的列表,每个元素都是一个三元素列表。子列表中的每个元素都描述了要用于绘制的匹配项。在相关问题 更多 >
编程相关推荐