雙目立體匹配一直是雙目視覺的研究熱點,雙目相機拍攝同一場景的左、右兩幅視點圖像,運用立體匹配匹配算法獲取視差圖,進而獲取深度圖。而深度圖的應用范圍非常廣泛,由於其能夠記錄場景中物體距離攝像機的距離,可以用以測量、三維重建、以及虛擬視點的合成等。
在上一節中,我們看到了對極約束和其他相關術語等基本概念。我們還看到,如果我們有兩個場景相同的圖像,則可以通過直觀的方式從中獲取深度信息。下面是一張圖片和一些簡單的數學公式證明了這種想法。
上圖包含等效三角形。編寫它們的等式將產生以下結果:
x和x′是圖像平面中與場景點3D相對應的點與其相機中心之間的距離。B是兩個攝像機之間的距離(我們知道),f是攝像機的焦距(已經知道)。簡而言之,上述方程式表示場景中某個點的深度與相應圖像點及其相機中心的距離差成反比。因此,利用此信息,我們可以得出圖像中所有像素的深度。
因此,它在兩個圖像之間找到了對應的匹配項。我們已經看到了Epiline約束如何使此操作更快,更准確。一旦找到匹配項,就會發現差異。讓我們看看如何使用OpenCV做到這一點。
簡單的看一下代碼:
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()
結果:
圖像包含原始圖像(左)及其視差圖(右)。其結果受到高度噪聲的污染,通過調整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的立體深度圖我們就介紹到這里,由於其展示意義不大,經常需要在實戰中運用,故我們將在之后進行實戰化。
到本次教程為止,關於OpenCV的所有知識點已經基本上詳述完畢,至於機器學習相關的內容,在這里並不過多的介紹, 我們將在必要的時候進行一些概述。