目標
在本節中,
- 我們將學習根據立體圖像創建深度圖。
基礎
在上一節中,我們看到了對極約束和其他相關術語等基本概念。我們還看到,如果我們有兩個場景相同的圖像,則可以通過直觀的方式從中獲取深度信息。下面是一張圖片和一些簡單的數學公式證明了這種想法。
上圖包含等效三角形。編寫它們的等式將產生以下結果:
$$ disparity = x - x' = \\frac{Bf}{Z} $$
$x$和$x'$是圖像平面中與場景點3D相對應的點與其相機中心之間的距離。$B$是兩個攝像機之間的距離(我們知道),$f$是攝像機的焦距(已經知道)。簡而言之,上述方程式表示場景中某個點的深度與相應圖像點及其相機中心的距離差成反比。因此,利用此信息,我們可以得出圖像中所有像素的深度。
因此,它在兩個圖像之間找到了對應的匹配項。我們已經看到了Epiline約束如何使此操作更快,更準確。一旦找到匹配項,就會發現差異。讓我們看看如何使用OpenCV做到這一點。
代碼
下面的代碼片段顯示了創建視差圖的簡單過程。
<code>import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
imgL = cv.imread('tsukuba_l.png',0)
imgR = cv.imread('tsukuba_r.png',0)
stereo = cv.StereoBM_create(numDisparities=16, blockSize=15)
disparity = stereo.compute(imgL,imgR)
plt.imshow(disparity,'gray')
plt.show()/<code>
下面的圖像包含原始圖像(左)及其視差圖(右)。如你所見,結果受到高度噪聲的汙染。通過調整numDisparities和blockSize的值,可以獲得更好的結果。
當你熟悉StereoBM時,會有一些參數,可能需要微調參數以獲得更好,更平滑的結果。參數:
- texture_threshold:過濾出紋理不足以進行可靠匹配
- 區域斑點範圍和大小:基於塊的匹配器通常會在對象邊界附近產生“斑點”,其中匹配窗口捕獲一側的前景和背景 在另一場景中,匹配器似乎還在桌子上投影的紋理中找到小的虛假匹配項。為了消除這些偽像,我們使用由speckle_size和speckle_range參數控制的散斑濾鏡對視差圖像進行後處理。speckle_size是將視差斑點排除為“斑點”的像素數。speckle_range控制必須將值差異視為同一對象的一部分的程度。
- 視差數量:滑動窗口的像素數。它越大,可見深度的範圍就越大,但是需要更多的計算。
- min_disparity:從開始搜索的左像素的x位置開始的偏移量。
- uniqueness_ratio:另一個後過濾步驟。如果最佳匹配視差不足夠好於搜索範圍中的所有其他視差,則將像素濾出。如果texture_threshold和斑點過濾仍在通過虛假匹配,則可以嘗試進行調整。
- prefilter_size和prefilter_cap:預過濾階段,可標準化圖像亮度並增強紋理,以準備塊匹配。通常,你不需要調整這些。
練習
- OpenCV樣本包含生成視差圖及其3D重建的示例。查看OpenCV-Python示例代碼stereo_match.py
閱讀更多 人工智能遇見磐創 的文章