基于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)仍然给我属性错误。任何帮助将不胜感激。
答案 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)
似乎尚未移植用于不同模式的枚举标签,但它可以与数字一起使用。 PANORAMA
是0
,SCANS
是1
,定义为here。
注意,如果您使用的是Google Colab,则可以按以下方式更改Open CV的版本:
!pip3 install opencv-python==4.1.0.25
答案 2 :(得分:0)
查看GitHub samples/python/stitching.py
上Python的官方测试代码,可以使用Stitcher_PANORAMA
或Stitcher_SCANS
。您可以随时检查任何模块的测试代码,例如本例中的 modules/stitching/misc/python/test
。
stitcher = cv.Stitcher.create(cv.Stitcher_PANORAMA)