OpenCV3-Python深度估计—基于视频
admin 于 2018年06月15日 发表在 计算机视觉

上一篇《OpenCV3-Python深度估计—基于图像》介绍了视差图获取的基本方法,接下来本节介绍如何使用双摄像头获取实时的视差图像。

通过两路usb2.0接口,分别连接两路相同型号的摄像头,实时获取左右摄像头的图像内容,并调用cv2.StereoSGBM_create()和stereo.compute()函数来获取视差图。

实现源码:

import numpy as np
import cv2

# 定义平移translate函数
def translate(image, x, y):
    # 定义平移矩阵
    M = np.float32([[1, 0, x], [0, 1, y]])
    shifted = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))

    # 返回转换后的图像
    return shifted

def update(val = 0):
    
    blockSize = cv2.getTrackbarPos('blockSize', 'disparity')

    stereo.setP1(8*3*blockSize**2);
    stereo.setP2(32*3*blockSize**2);

    #print ('computing disparity...')

l_camera = cv2.VideoCapture(0)
r_camera = cv2.VideoCapture(1)

#create windows
cv2.namedWindow('left_Webcam', cv2.WINDOW_NORMAL)
cv2.namedWindow('right_Webcam', cv2.WINDOW_NORMAL)
cv2.namedWindow('disparity', cv2.WINDOW_NORMAL)

#设置视频格式大小
l_camera.set(cv2.CAP_PROP_FRAME_WIDTH, 640);   #设置视频宽度
l_camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 480);  #设置视频长度

r_camera.set(cv2.CAP_PROP_FRAME_WIDTH, 640);   #设置视频宽度
r_camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 480);  #设置视频长度
        

blockSize = 48

cv2.createTrackbar('blockSize', 'disparity', blockSize, 60, update)   

while(cv2.waitKey(1) & 0xFF != ord('q')):
    ret1, left_frame = l_camera.read()
    ret2, right_frame = r_camera.read()
         
#    #对图像进行X,Y轴平移(Img,x,y)
    right_frame = translate(right_frame,0,0)
    
    # our operations on the frame come here
    gray_left = cv2.cvtColor(left_frame, cv2.COLOR_BGR2GRAY)
    gray_right = cv2.cvtColor(right_frame, cv2.COLOR_BGR2GRAY)
    cv2.imshow('left_Webcam', gray_left)
    cv2.imshow('right_Webcam', gray_right)
    
#   stereo = cv2.StereoBM_create(numDisparities=64, blockSize=11)
    
    stereo = cv2.StereoSGBM_create(minDisparity=1,
             numDisparities=16,
             blockSize=11,
             uniquenessRatio = 5,
             speckleWindowSize = 100,
             speckleRange = 1,
             disp12MaxDiff = 200,
             P1 = 8*3*blockSize**2,
             P2 = 32*3*blockSize**2)
    
    update()   #更新参数
    disparity = stereo.compute(gray_left, gray_right)
    disparity = cv2.normalize(disparity, disparity, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)
    cv2.imshow('disparity', disparity)
    
# When everything done, release the capture
l_camera.release()
r_camera.release()
cv2.destroyAllWindows()

左摄像头图像:

生成的视差图

注:由于摄像头安装有误差,加之未进行校准,因此获取的图像偏差较大;不过根据最终的结果,仍可定性查看视差图的基本信息。

下一篇:《OpenCV3-Python物体分割方法介绍》

注意:本站所有文章除特别说明外,均为原创,转载请务必以超链接方式并注明作者出处。 标签:opencv3,图像处理,深度估计