我想使用来自低分辨率 USB 相机的两张图像创建视差图像。我正在使用 OpenCV 4.0.0。我使用的帧取自视频。我目前得到的结果非常糟糕(见下文)。
两台相机都经过校准,校准数据用于消除图像失真。是不是因为左图和右图的分辨率低?
左:
右:
为了更好地猜测还有两个图像的叠加。
叠加层:
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 拥有执行校准和校正所需的所有工具。如果您需要进行校准,您还需要有一个可用的校准图案(棋盘)。
简而言之:
- 使用
calibrateCamera()
计算相机内在参数. - 使用内部参数
stereoCalibrate()
执行立体对的外部校准。 - 使用来自
stereoCalibrate()
的参数,使用stereoRectify()
计算整流参数 - 使用校正参数,计算用于校正和不失真的 map
initUndistortRectifyMap()
现在您的相机已校准,您可以使用 remap()
执行校正和去畸变对于用相机对拍摄的图像(只要相机不相对移动)。通过 remap()
计算的校正图像现在可用于计算视差图像。
此外,我建议您查阅有关该主题的一些相关教科书。 Learning OpenCV: Computer Vision with the OpenCV Library 对该过程进行了非常实用的描述。
关于python - 图像处理 : Bad Quality of Disparity Image with OpenCV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58150354/