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()
左摄像头图像:
生成的视差图:
注:由于摄像头安装有误差,加之未进行校准,因此获取的图像偏差较大;不过根据最终的结果,仍可定性查看视差图的基本信息。