图像处理:OpenCV视差图像质量差

2024-04-26 23:07:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我想创建一个视差图像使用两个图像从低分辨率usb摄像头。我正在使用OpenCV 4.0.0。我使用的帧是从一个视频。我目前得到的结果非常糟糕(见下文)。在

disparity

两个摄像机都被校准了,校准数据用来消除图像失真。是因为左图和右图的分辨率低吗?在

Left:

left

Right:

right

为了更好的猜测,这两个图像也有重叠。在

Overlay:

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()

Tags: 代码图像rightsizecreateminwindowcv2
2条回答

大多数立体声算法要求对输入图像进行校正。校正变换图像,使对应的极线是两幅图像中相应的水平线。为了校正,你需要知道相机的内在和外在参数。在

OpenCV拥有执行校准和校正所需的所有工具。如果您需要执行校准,您还需要一个校准模式(棋盘)可用。在

简而言之:

  1. 使用^{}计算相机的内部参数。在
  2. 使用带^{}的内部参数来执行立体声对的外部校准。在
  3. 使用stereoCalibrate()中的参数,用^{}计算校正参数
  4. 使用校正参数,用^{}计算用于校正和不失真的映射

现在您的相机已校准,您可以使用^{}对相机对拍摄的图像执行校正和不失真(只要相机不相对移动)。由remap()计算的校正图像现在可以用于计算视差图像。在

另外,我建议你去看看关于这个主题的相关教科书。使用OpenCV库学习OpenCV:computervision对这个过程有非常实际的描述。在

我同意@Catree的评论和@sebasth的回答,主要是因为你的图片根本没有被纠正。在

不过,我想提醒你,可能会发生另一个问题。我试图对@sebasth的回答发表评论,但我现在还不能评论。。。在

正如你所说,你使用的是低分辨率的usb相机,这让我相信这些相机的曝光量是由卷帘镜头产生的。对于动态和不断变化的场景,理想的是全局快门式相机。如果要在运动中的场景中使用此选项,这一点尤其重要。在

(卷帘效果示例:enter link description here)。在

所以使用卷帘镜头时,你也要注意相机的同步。在

它可以与滚动快门相机一起工作,但你需要注意镜头同步,最好是在受控环境下(即使光线变化很小)。在

还记得关闭自动相机参数,如:“白平衡”,尤其是“曝光”。在

谨致问候!在

相关问题 更多 >