如何在OpenCV Python Stitcher类中设置全景模式?

时间:2018-05-30 02:32:00

标签: python opencv image-stitching

基于this question/answer,我一直在尝试在python中使用OpenCV的Stitcher类。我的代码与答案中的代码基本相同。

import cv2

stitcher = cv2.createStitcher(False)
foo = cv2.imread("D:/foo.png")
bar = cv2.imread("D:/bar.png")
result = stitcher.stitch((foo,bar))

cv2.imwrite("D:/result.jpg", result[1])

问题是我想将模式从全景改为扫描。 In the c++ documentation, create方法有一个模式输入。但是,Python中的createStitcher类只接受一个输入 - 无论是否尝试gpu。有没有办法在Python中指定模式?

当我尝试使用createStitcherScans时,我收到错误

stitcher = cv2.createStitcherScans(False)
"AttributeError: 'module' object has no attribute 'createStitcherScans'"

我确实找到了this GitHub issue似乎相关的,因为Python绑定缺少某些东西。但这是我的头脑,我不知道如何编辑opencv代码来正确执行此操作。我尝试将它添加到stitching.hpp:

typedef Stitcher::Mode Mode;

但什么都没发生。 createStitcher(1,False)仍然给我属性错误。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。看了documentation之后,看起来python wrapper函数没有映射到create(),而是没有模式输入,只有try_use_gpu输入的createDefault()。我没有包装程序的经验,但是可以尝试通过阅读OpenCV's info on how the python bindings work来解决它。

根据我到目前为止在python中使用itching的工作,似乎createDefault()在PANORAMA模式下创建了拼接器,因为它扭曲了我的图像。我不能将工作时间专用于浏览包装程序,但是如果我最终花费个人时间来解决它,我将在这里更新我的答案。

答案 1 :(得分:2)

此问题已在Open CV 4中解决(至少在我正在运行的4.1.0中)。现在,您可以将mode指定为cv2.Stitcher.create的关键字参数:

stitcher = cv2.Stitcher.create(mode = 1)

似乎尚未移植用于不同模式的枚举标签,但它可以与数字一起使用。 PANORAMA0SCANS1,定义为here

注意,如果您使用的是Google Colab,则可以按以下方式更改Open CV的版本:

!pip3 install opencv-python==4.1.0.25

答案 2 :(得分:0)

查看GitHub samples/python/stitching.py上Python的官方测试代码,可以使用Stitcher_PANORAMAStitcher_SCANS。您可以随时检查任何模块的测试代码,例如本例中的 modules/stitching/misc/python/test

stitcher = cv.Stitcher.create(cv.Stitcher_PANORAMA)