西电计算机视觉作业三利用双目图像计算深度

利用双目图像计算深度

1. 求解视差图

1.1 调用函数

stereo = cv2.StereoBM_create(参数1,参数2)
参数1为 NumDisparities:即最大视差值与最小视差值之差, 窗口大小必须是16的整数倍,int 型
参数2为 BlockSize:匹配的块大小。它必须是> = 1的奇数。通常情况下,它应该在3–11的范围内。这里设置为大于11也可以,但必须为奇数。

1.2 确定函数参数

下面尝试不同的参数,来寻找最优参数
西电计算机视觉作业三利用双目图像计算深度_第1张图片

由上图可以看出64 15效果最好,因此选64 15生成的视差图作为生成深度图的底图

2. 生成深度图

西电计算机视觉作业三利用双目图像计算深度_第2张图片
disparity=x−x′=Bf/Z
Z = Bf/disparity
通过相机内参数可知 本题中 f = 7 mm B = 500 mm
带入公式计算可得最终的深度图

西电计算机视觉作业三利用双目图像计算深度_第3张图片

3. 代码

import cv2
import numpy as np
from matplotlib import pyplot as plt

f = 7
B = 500
imgL = cv2.imread('LIma-000023.png', 0)
imgR = cv2.imread('RIma-000023.png', 0)

stereo = cv2.StereoBM_create(numDisparities=64, blockSize=15)
disparity = stereo.compute(imgL, imgR)
# cv2.GaussianBlur(disparity, (5,5), 5)

depth = np.zeros((disparity.shape[0], disparity.shape[1]), dtype=np.uint8)
for i in range(disparity.shape[0]):
   for j in range(disparity.shape[1]):
       if disparity[i][j]==0:
           depth[i][j] = 0
       else:
            depth[i][j] = min(f * B // disparity[i][j], 255)

depth = cv2.normalize(depth, None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)
depth = cv2.applyColorMap(depth, 2)
cv2.medianBlur(depth, 3)
plt.figure()
plt.imshow(depth)
plt.imshow(disparity, 'gray')
plt.title('disparity')
plt.xticks([])
plt.yticks([])
plt.figure()
plt.imshow(depth)
plt.xticks([])
plt.yticks([])
plt.show()

plt.show()



你可能感兴趣的:(opencv,人工智能,计算机视觉)