【輔助駕駛】雙目深度估計
阿新 • • 發佈:2018-12-20
一、效果
使用兩個單目相機實現深度測量
二、思路
1、使用opencv自帶函式:stereo.compute(imgL,imgR)
1)效果
2)程式碼
import numpy as np import cv2 from matplotlib import pyplot as plt imgL = cv2.imread('tsukuba_l.png',0) imgR = cv2.imread('tsukuba_r.png',0) stereo = cv2.createStereoBM(numDisparities=16, blockSize=15) disparity = stereo.compute(imgL,imgR) plt.imshow(disparity,'gray') plt.show()
3)官方文件
https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_calib3d/py_depthmap/py_depthmap.html
2、自己匹配演算法
1)效果
2)過程
- 攝像機標定(包括內參和外參)
- 雙目影象的校正(包括畸變校正和立體校正)
- SGBM演算法匹配演算法獲取視差圖,以及深度圖
- 利用視差圖,或者深度圖進行虛擬視點的合成
3)參考
真實場景的雙目立體匹配(Stereo Matching)獲取深度圖詳解
4)兩份很好的參考
a)【opencv學習】使用opencv與兩個攝像頭實現雙目標定與測距: https://blog.csdn.net/hysteric314/article/details/51357318
b)opencv實現雙目視覺測距:https://blog.csdn.net/xiao__run/article/details/78900652
這個文件特別詳細:對於小白,特別不容易上手,在這裡我提供一個傻瓜式教程吧,利用matlab來進行標註,圖形介面,無須任何程式碼,然後利用C++實現測距與深度圖,原理太多我就不提了,小白直接照做就OK
三、實現的程式碼
#原始jpg已經畸變矯正 import numpy as np import cv2 IMAGE_WIDTH = 800 IMAGE_HEIGHT = 600 capL = cv2.VideoCapture(2) capR = cv2.VideoCapture(0) imgL = np.zeros((IMAGE_WIDTH, IMAGE_HEIGHT, 3), np.uint8) imgR = np.zeros((IMAGE_WIDTH, IMAGE_HEIGHT, 3), np.uint8) stereo = None opencv_measure_version = int(cv2.__version__.split('.')[0]) windowSize = 5 minDisp = 10 numDisp = 250 - minDisp # for OpenCV3 stereo = cv2.StereoSGBM_create( minDisparity=minDisp, numDisparities=numDisp, blockSize=16, P1=8*3*windowSize**2, P2=32*3*windowSize**2, disp12MaxDiff=1, uniquenessRatio=10, speckleWindowSize=100, speckleRange=32 ) capL.set(cv2.CAP_PROP_FRAME_WIDTH, IMAGE_WIDTH) capL.set(cv2.CAP_PROP_FRAME_HEIGHT, IMAGE_HEIGHT) capR.set(cv2.CAP_PROP_FRAME_WIDTH, IMAGE_WIDTH) capR.set(cv2.CAP_PROP_FRAME_HEIGHT, IMAGE_HEIGHT) imgL = cv2.imread('./assets/left.jpg') imgR = cv2.imread('./assets/right.jpg') # create gray images imgGrayL = cv2.cvtColor(imgL, cv2.COLOR_BGR2GRAY) imgGrayR = cv2.cvtColor(imgR, cv2.COLOR_BGR2GRAY) # calculate histogram imtGrayL = cv2.equalizeHist(imgGrayL) imtGrayR = cv2.equalizeHist(imgGrayR) # through gausiann filter imgGrayL = cv2.GaussianBlur(imgGrayL, (5, 5), 0) imgGrayR = cv2.GaussianBlur(imgGrayR, (5, 5), 0) cv2.imshow("image left", imgGrayL) cv2.imshow("image right", imgGrayR) # calculate disparity disparity = stereo.compute(imgGrayL, imgGrayR).astype(np.float32)/16 disparity = (disparity - minDisp) / numDisp cv2.imshow("disparity", disparity) cv2.waitKey(0)