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