图像处理:使用OpenCV生成的视差图质量较差

3

我想使用两个低分辨率USB相机的图像创建一个视差图像。我正在使用OpenCV 4.0.0。我使用的帧来自视频。目前我得到的结果非常糟糕(如下所示)。

disparity

两个相机都已经校准,使用校准数据来消除图像的畸变。左图和右图分辨率低是原因吗? 左图:

left

正确:

right

为了更好地猜测,这两幅图像还有一个叠加层。
叠加层:

overlay

cv2.StereoSGBM_create()函数的值基于OpenCV附带的示例代码(位于OpenCV/samples/python/stereo_match.py)。

我会非常感激任何帮助或建议。

这是我的代码:

# convert both image to grayscale
left = cv2.cvtColor(left, cv2.COLOR_BGR2GRAY)
right = cv2.cvtColor(right, cv2.COLOR_BGR2GRAY)

# set the disparity matcher        
window_size = 3
min_disp = 16
num_disp = 112-min_disp
stereo = cv2.StereoSGBM_create(minDisparity = min_disp,
    numDisparities = num_disp,
    blockSize = 16,
    P1 = 8*3*window_size**2,
    P2 = 32*3*window_size**2,
    disp12MaxDiff = 1,
    uniquenessRatio = 10,
    speckleWindowSize = 100,
    speckleRange = 32
)

# compute disparity
dis = stereo.compute(left, right).astype(np.float32) / 16.0

# display the computed disparity image
matploitlib.pyplot.imshow(dis, 'gray')
matploitlib.pyplot.show()

2
对于立体匹配,左右图像必须同时拍摄,并且在矫正后应该垂直对齐,这是非常关键的。在您的叠加图像中,没有垂直对齐。请查看此页面以了解为什么需要垂直对齐:https://github.com/IntelRealSense/librealsense/blob/v2.29.0/doc/depth-from-stereo.md。 - Catree
@Catree 谢谢!垂直对齐是图像的问题所在。如果您将此作为答案发布,我可以接受它。 - Johannes Vitt
2个回答

2
大多数立体视觉算法要求输入图像进行矫正。矫正会将图像转换为对应的极线在两幅图像中都是水平线。为了进行矫正,您需要知道相机的内部和外部参数。
OpenCV具有执行校准和矫正所需的所有工具。如果需要执行校准,则还需要准备一个校准模式(棋盘格)。
简而言之:
  1. 使用 calibrateCamera() 计算相机的内部参数。
  2. 使用内部参数和 stereoCalibrate() 进行立体摄像机的外部标定。
  3. 使用 stereoCalibrate() 得到的参数,使用 stereoRectify() 计算矫正参数。
  4. 使用矫正参数,使用 initUndistortRectifyMap() 计算用于矫正和去畸变的映射。
现在你的相机已经校准好了,可以使用remap()对相机配对拍摄的图像进行矫正和去畸变处理(只要相机相对位置不发生改变)。remap()计算出的矫正后的图像现在可以用于计算视差图像。
此外,我建议查阅一些相关的教材。《学习OpenCV:使用OpenCV库进行计算机视觉》对这个过程有非常实际的描述。

2
我同意@Catree的评论和@sebasth的回答,主要是因为你的图像根本没有进行矫正。
然而,另一个问题可能会出现,我想提醒你。我试图在@sebasth的答案上留言,但我还不能发表评论......
正如你所说,你正在使用低分辨率的USB相机,这让我相信这些相机的光曝光是由滚动快门镜头完成的。对于运动场景和不断变化的场景,理想的是全局快门相机。如果您打算用于运动场景,则尤其如此。
(滚动快门效果的示例:输入链接说明)。
因此,使用滚动快门镜头时,您还需要注意相机同步。
它可以使用滚动快门相机,但您需要小心镜头同步,最好在控制环境中进行(即使光线变化很小)。
还要记得关闭自动相机参数,例如:“白平衡”和特别是“曝光”。
最好的问候!

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