基礎
在上一節,我們看到了極線約束和其他相關術語。我們也看到了如果我們有同一場景的兩張圖像,我們可以從直覺的方法從里面獲得更多信息。下面是一個圖像,和一些數學公式證明這個直覺
上面的圖包含等面積三角形,寫出他們的等式會得到下面的結果:
x和x'是圖像平面里的點對應的場景里的點和攝像機中心的距離。B是兩個攝像機之間的距離(我們已知),f是攝像機焦距(已知)。所以,上面的等式說一個點在場景里的深度和對應圖像點和他們攝像機中心點的距離差成反比。有了這個信息,我們可以得出圖像里所有像素的深度。
所以它在兩個圖像里找對應的匹配點。我們已經看到了極線約束會讓這個運算快捷和準確,當它找到了匹配,它也就找到了視差,讓我們看看用OpenCV怎么做
編碼
下面的代碼片段展示了一個簡單的創建視差圖的過程。
import numpy as np
import cv2
from matplotlib import pyplot as pltimgL = 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()
下面的圖像包含原始圖像(左邊)和它的視差圖(右邊)。你可以看到結果被高度噪音污染了。調整numDisparities和blockSize的值,你可以得到更好結果。
END