Python/OpenCV:从立体图像计算深度图

17

我有两张立体图像,想要用它们来计算深度图。虽然我不会C/C++,但我会Python——所以当我找到这个教程时,我充满了希望。

不幸的是,这个教程似乎有点过时。它不仅需要进行一些调整才能运行(将“createStereoBM”重命名为“StereoBM”),而且即使在教程中使用的示例立体图像上运行时也不能得到好的结果。

下面是一个例子:

image-left image-right

import numpy as np
import cv2
from matplotlib import pyplot as plt

imgL = cv2.imread('Yeuna9x.png',0)
imgR = cv2.imread('SuXT483.png',0)

stereo = cv2.StereoBM(1, 16, 15)
disparity = stereo.compute(imgL, imgR)

plt.imshow(disparity,'gray')
plt.show()

结果:

the result

这与教程作者所实现的效果非常不同:

good result
(来源:opencv.org)

调整参数并不能改善情况。我所找到的所有文档都是针对原始C版的openCV代码,而不是Python库的等效代码。不幸的是,我无法使用这些文档来改善事情。

如能提供帮助,将不胜感激!


仅供记录,本教程是来自未来的(OpenCV3.0),但是确实已经过时了。对于当前的3.0版本,您需要使用cv2.StereoBM_create()或cv2.StereoSGBM_create()。 - berak
cv2.StereoBM似乎存在,但使用cv2.StereoBM_create()或cv2.StereoSGBM_create()会出现错误(属性错误)。 - jwdink
你显然在使用OpenCV2.4而不是3.0。 - berak
也许可以尝试使用StereoSGBM样例来进行匹配? - berak
不错的发现!我会去看看那个例子。对于版本混淆感到抱歉。使用homebrew安装OpenCV已经是一场噩梦了,所以我暂时不敢尝试升级。 - jwdink
你确定图片的方向是正确的吗?仅凭外观来看,似乎与你所说的相反。 - will
3个回答

27

你的图片方向颠倒了。

看看这些图片,灯后面的锡纸可以帮助你确定这两张图片的摄像机位置,

只需要修改这个:

#  v
imgR = cv2.imread('Yeuna9x.png',0)
imgL = cv2.imread('SuXT483.png',0)
#  ^
如果您查看教程中所说的“left”框架的图像,它与您的“right”框架相同。
在更改后,这是我的结果。 输入图像描述

1

-3

相机被垂直翻转而不是水平翻转。将图像旋转90度,然后再试一下。(通过旋转屏幕来证明它。我刚刚拿起我的笔记本电脑并将其倾斜。)

您提到了不同的软件;也许原始软件和pyOpenCV之间存在行主/列主之类的差异。


如果我正确理解了您的建议,我应该尝试将源图像旋转90度,然后运行相同的代码?我刚刚尝试了一下,但并没有产生更好的结果。您是否成功实现了这个方法?如果是,能否发布一下结果? - jwdink
我认为这只是问题的格式... 这些图片来自水平分离的两个视角。 - will
此外,如果是这种情况,那么就无所谓了,您只需要将底部图像放在左侧(旋转参考框架),旋转每个图像会导致它停止工作。 - will

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接