1. 程式人生 > >【輔助駕駛】雙目深度估計

【輔助駕駛】雙目深度估計

一、效果

使用兩個單目相機實現深度測量

二、思路

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)過程

  1. 攝像機標定(包括內參和外參)
  2. 雙目影象的校正(包括畸變校正和立體校正)
  3. SGBM演算法匹配演算法獲取視差圖,以及深度圖
  4. 利用視差圖,或者深度圖進行虛擬視點的合成

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)