我找到了有关getting a depth map from stereo images的教程,其中包含以下代码:
import numpy as np
import cv2
from matplotlib import pyplot as plt
imgL = cv2.imread('tsukuba_l.png',0)
imgR = cv2.imread('tsukuba_r.png',0)
stereo = cv2.createStereoBM(numDisparities=16, blockSize=15)
disparity = stereo.compute(imgL,imgR)
plt.imshow(disparity,'gray')
plt.show()
简短问题:
对极线是否必须平行才能使该算法起作用?我有两个充当立体声系统的摄像机,但是由于我只是将它们放在桌子上,所以它们之间只有很小的旋转和平移。因此,我的主观表情到目前为止并不是平行的。
答案 0 :(得分:2)
是的,对极线需要平行才能使createStereoBM
工作。
为此,您需要估计两个摄像机之间的外部校准(旋转和平移)。它的工作原理与单摄像机校准相同。有一些立体声校准教程,但我暂时还没有找到一个好的python。看看ROS camera calibration tool。
接下来,您需要校正摄像机图像。这意味着您可以使用从立体校准中获得的映射并扭曲图像,从而使极线平行。看看OpenCV的stereoRectify
文档:here。
当您按照我链接的文档中的建议使用校准参数调用initUndistortRectifyMap
时,图像会发生扭曲,以使对极线平行,现在您应该可以使用createStereoBM
来创建视差图。