硬體準備
首先需要將兩個攝像頭固定起來就可以了。由於攝像頭自身有畸變,兩個攝像頭不是平行的,前後不一致之類的需要進行參數標定,這個太簡單就不說了。注意幾點:
BM和SGBM算法對參數敏感,一定要耐心調節參數攝像頭一定要標定這些立體算法對光照敏感BM算法實現原理
這種算法實現起來的優點就是快,缺點是深度圖的效果不是很好。BM算法只能對8為灰度圖像計算視差。大概是這種效果,我採集的是視頻,BM對視頻的每一幀進行處理。
BM算法原理是將兩個攝像頭的的幀分成很多的小方塊來機型匹配,通過移動小方塊來匹配另一個圖中的小方塊,通過發現不同小方塊在另一個圖像中的像素點位置在結合兩個攝像頭的關係數據(標定的參數中的translate 和rotation矩陣)來計算出物體的實際深度從而生成相應的深度圖。
算法概述
具體一點的解釋就是,BM算法會將當前的幀劃分為很多小塊,將每個小塊與另一個攝像頭採集的小塊進行比較,這個過程是將這個小塊進行移動比對得到的。移動的過程就是通過創建一個向量來模擬小塊從一個位置運行到另一個位置的運動。
然後在另一張圖中橫向查找顯示的像素塊
找到了之後我們就得到呢同一個塊在兩個圖中的像素距離,這個時候我們用類似三角測距的方式就可以獲取這個像素塊在真實世界中的距離。
那麼如何匹配像素塊呢?上述基本上是一個簡化版的BM算法概述,在上述的介紹中一直遺漏了一個問題, 移動的過程中如何知道兩個塊是相似的呢?這是通過計算小方塊內計算像素點矩陣的 SAD(絕對差之和來實現的)
在計算視差圖之前,我們會見兩個圖轉化成灰度圖,這樣每個像素點我們只有一個值[0-255],也就是單通道的,正常的數據是BRG數據也就是[0-255,0-255,0-255]這樣的。
為了計算SAD,我們需要對每個像素塊提取然後找到計算,通過相減當我們得到一個越小的SAD值就代表兩個像素塊約相似,相信看了下面這個圖就懂了:
BM算法參數的實際意義
BM算法使用OPENCV的實現的方法在網上有很多,這裡不再贅述。
本文作者熊冰,個人網站Bing的天涯路),轉載請註明出處。