python - 图像处理 : Bad Quality of Disparity Image with OpenCV

标签 python opencv image-processing stereoscopy

我想使用来自低分辨率 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()

最佳答案

大多数立体算法都需要对输入图像进行校正。校正变换图像,使相应的对极线在两个图像中都是相应的水平线。对于整改,您需要了解相机的内在和外在参数。

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

简而言之:

  1. 使用 calibrateCamera() 计算相机内在参数.
  2. 使用内部参数 stereoCalibrate()执行立体对的外部校准。
  3. 使用来自stereoCalibrate() 的参数,使用stereoRectify() 计算整流参数
  4. 使用校正参数,计算用于校正和不失真的 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/

相关文章:

python - 卷积:2d 与 1d 2-pass 给出不同的结果

python - 作业: Python 3. 3:如何通过用户输入从类中调用实例

python - set_index() 后的 Pandas KeyError

python - 如何在python中循环多个文件并逐一处理

python - Python 中的 OpenCV 2.4 - 视频处理

c++ - OpenCV的Mat结构中存储的元素类型

opencv - 给定一张人脸的几帧不一定都是正面的,如何构建人脸识别模型?

c++ - 方向梯度直方图

java - 如何将MATLAB图像处理程序转换为Java?

python - 如何检查数字是否为 np.float64 或 np.float32 或 np.float16?