我想创建一个视差图像使用两个图像从低分辨率usb摄像头。我正在使用OpenCV 4.0.0。我使用的帧是从一个视频。我目前得到的结果非常糟糕(见下文)。在
两个摄像机都被校准了,校准数据用来消除图像失真。是因为左图和右图的分辨率低吗?在
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()
大多数立体声算法要求对输入图像进行校正。校正变换图像,使对应的极线是两幅图像中相应的水平线。为了校正,你需要知道相机的内在和外在参数。在
OpenCV拥有执行校准和校正所需的所有工具。如果您需要执行校准,您还需要一个校准模式(棋盘)可用。在
简而言之:
stereoCalibrate()
中的参数,用^{现在您的相机已校准,您可以使用^{} 对相机对拍摄的图像执行校正和不失真(只要相机不相对移动)。由
remap()
计算的校正图像现在可以用于计算视差图像。在另外,我建议你去看看关于这个主题的相关教科书。使用OpenCV库学习OpenCV:computervision对这个过程有非常实际的描述。在
我同意@Catree的评论和@sebasth的回答,主要是因为你的图片根本没有被纠正。在
不过,我想提醒你,可能会发生另一个问题。我试图对@sebasth的回答发表评论,但我现在还不能评论。。。在
正如你所说,你使用的是低分辨率的usb相机,这让我相信这些相机的曝光量是由卷帘镜头产生的。对于动态和不断变化的场景,理想的是全局快门式相机。如果要在运动中的场景中使用此选项,这一点尤其重要。在
(卷帘效果示例:enter link description here)。在
所以使用卷帘镜头时,你也要注意相机的同步。在
它可以与滚动快门相机一起工作,但你需要注意镜头同步,最好是在受控环境下(即使光线变化很小)。在
还记得关闭自动相机参数,如:“白平衡”,尤其是“曝光”。在
谨致问候!在
相关问题 更多 >
编程相关推荐