1. 程式人生 > 其它 >OpenCV-Python系列之立體影象的深度圖

OpenCV-Python系列之立體影象的深度圖

雙目立體匹配一直是雙目視覺的研究熱點,雙目相機拍攝同一場景的左、右兩幅視點影象,運用立體匹配匹配演算法獲取視差圖,進而獲取深度圖。而深度圖的應用範圍非常廣泛,由於其能夠記錄場景中物體距離攝像機的距離,可以用以測量、三維重建、以及虛擬視點的合成等。

在上一節中,我們看到了對極約束和其他相關術語等基本概念。我們還看到,如果我們有兩個場景相同的影象,則可以通過直觀的方式從中獲取深度資訊。下面是一張圖片和一些簡單的數學公式證明了這種想法。

上圖包含等效三角形。編寫它們的等式將產生以下結果:

xx′是影象平面中與場景點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的所有知識點已經基本上詳述完畢,至於機器學習相關的內容,在這裡並不過多的介紹, 我們將在必要的時候進行一些概述。

天道酬勤 循序漸進 技壓群雄