點(diǎn)擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)

雙目視覺廣泛應(yīng)用在機(jī)器人導(dǎo)航,精密工業(yè)測量、物體識別、虛擬現(xiàn)實(shí)、場景重建,勘測領(lǐng)域。
什么是雙目視覺?
雙目視覺是模擬人類視覺原理,使用計(jì)算機(jī)被動(dòng)感知距離的方法。從兩個(gè)或者多個(gè)點(diǎn)觀察一個(gè)物體,獲取在不同視角下的圖像,根據(jù)圖像之間像素的匹配關(guān)系,通過三角測量原理計(jì)算出像素之間的偏移來獲取物體的三維信息。
得到了物體的景深信息,就可以計(jì)算出物體與相機(jī)之間的實(shí)際距離,物體3維大小,兩點(diǎn)之間實(shí)際距離。目前也有很多研究機(jī)構(gòu)進(jìn)行3維物體識別,來解決2D算法無法處理遮擋,姿態(tài)變化的問題,提高物體的識別率。

圖1 雙目視覺算法流程
標(biāo)定的目的是獲取相機(jī)的內(nèi)參(焦距,圖像中心,畸變系數(shù)等)和外參(R(旋轉(zhuǎn))矩陣T(平移)矩陣,用于對其兩個(gè)相機(jī))。目前比較常用的方法為張正友的棋盤格標(biāo)定方法,Opencv和Matlab上均有實(shí)現(xiàn)。但是一般為了獲取更高的標(biāo)定精度,采用工業(yè)級的(60*60格子)玻璃面板效果會(huì)更好。并且有人也建議使用Matlab,因?yàn)榫劝梢暬Ч麜?huì)更好一些,并且Matlab的結(jié)果保存為xml,Opencv也可以直接讀入,但是步驟相對于Opencv的麻煩了一些。這是Matlab標(biāo)定工具箱的連接:http://www.vision.caltech.edu/bouguetj/calib_doc/
步驟為:
(1)左攝像頭標(biāo)定,獲取內(nèi)外參數(shù)。
(2)右參數(shù)攝像頭標(biāo)定獲取外參。
(3) 雙目標(biāo)定,獲取相機(jī)之間的平移旋轉(zhuǎn)關(guān)系。

圖2 Matlab雙目視覺標(biāo)定
矯正的目的是得到的參考圖與目標(biāo)圖之間,只存在X方向上的差異。提高視差計(jì)算的準(zhǔn)確性。
矯正分為兩個(gè)步驟
l 畸變矯正
圖3 畸變矯正
l 將相機(jī)轉(zhuǎn)化為標(biāo)準(zhǔn)形式

圖4 轉(zhuǎn)換為標(biāo)準(zhǔn)形式
因?yàn)槌C正部分,會(huì)對圖像所有點(diǎn)的位置進(jìn)行重新計(jì)算,因而算法處理的分辨率越大耗時(shí)越大,而且一般需要實(shí)時(shí)處理兩張圖像。而且這種算法并行化強(qiáng)標(biāo)準(zhǔn)化程度較高,建議使用IVE進(jìn)行硬化,類似Opencv中的加速模式,先得到映射Map,再并行化使用映射Map重新得到像素位置。Opencv中的矯正函數(shù)為cvStereoRectify。
雙目匹配是雙目深度估計(jì)的核心部分,發(fā)展了很多年,也有非常多的算法,主要目的是計(jì)算參考圖與目標(biāo)圖之間像素的相對匹配關(guān)系,主要分為局部和非局部的算法。一般有下面幾個(gè)步驟。
l 匹配誤差計(jì)算
l 誤差集成
l 視差圖計(jì)算/優(yōu)化
l 視差圖矯正
一般局部算法,使用固定大小或者非固定大小窗口,計(jì)算與之所在一行的最優(yōu)匹配位置。如下圖為最簡單的局部方式,求一行最佳對應(yīng)點(diǎn)位置,左右視圖X坐標(biāo)位置差異為視差圖。為了增加噪聲,光照的魯棒性可以使用固定窗口進(jìn)行匹配,也可以對圖像使用LBP變換之后再進(jìn)行匹配。一般的匹配損失計(jì)算函數(shù)有:SAD,SSD,NCC等。一般采用最大視差也可以限制最大搜索范圍,也可以使用積分圖和Box Filter進(jìn)行加速計(jì)算。目前效果較好的局部匹配算法為基于Guided Filter的使用Box Filter和積分圖的雙目匹配算法,局部算法易于并行化,計(jì)算速度快,但是對于紋理較少的區(qū)域效果不佳,一般對圖像分割,將圖像分為紋理豐富和紋理稀疏的區(qū)域,調(diào)整匹配窗大小,紋理稀疏使用小窗口,來提高匹配效果。
圖5 基于線性搜索的視差計(jì)算
非局部的匹配算法,將搜索視差的任務(wù)看做最小化一個(gè)確定的基于全部雙目匹配對的損失函數(shù),求該損失函數(shù)的最小值即可得到最佳的視差關(guān)系,著重解決圖像中不確定區(qū)域的匹配問題,主要有動(dòng)態(tài)規(guī)劃(Dynamic Programming),信任傳播(Blief Propagation),圖割算法(Graph Cut)。目前效果最好的也是圖割算法,Opencv中提供的圖割算法匹配耗時(shí)很大。
圖割算法主要是為了解決動(dòng)態(tài)規(guī)劃算法不能融合水平和豎直方向連續(xù)性約束的問題,將匹配問題看成是利用這些約束在圖像中尋求最小割問題。

圖6 基于圖割(左),動(dòng)態(tài)規(guī)劃(中),相關(guān)性計(jì)算(右)的效果。
因?yàn)榭紤]到全局能量最小化,非局部算法一般耗時(shí)較大,不太好使用硬件加速。但是對于遮擋,紋理稀疏的情況解決的較好。
得到了匹配點(diǎn)之后,一般通過左右視線一致性的方式,檢測和確定具有高置信度的匹配點(diǎn)。很類似前后向光流匹配的思想,只有通過左右視線一致性檢驗(yàn)的點(diǎn)才認(rèn)為是穩(wěn)定匹配點(diǎn)。這樣也可以找出因?yàn)檎趽酰肼暎`匹配得到的點(diǎn)。
那么我們?nèi)绾蔚玫揭暡詈蜕疃刃畔⒛兀?/p>

圖7 視差深度獲取示意
關(guān)于視差圖的后處理,一般采用中值濾波的方法,對當(dāng)前點(diǎn)的灰度值使用鄰域像素的中值來代替,這種方法可以很好去除椒鹽噪聲。可以去除因?yàn)樵肼暬蛘呷跫y理匹配失敗的孤立點(diǎn)。
下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
在「小白學(xué)視覺」公眾號后臺回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。下載2:Python視覺實(shí)戰(zhàn)項(xiàng)目52講在「小白學(xué)視覺」公眾號后臺回復(fù):Python視覺實(shí)戰(zhàn)項(xiàng)目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計(jì)數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個(gè)視覺實(shí)戰(zhàn)項(xiàng)目,助力快速學(xué)校計(jì)算機(jī)視覺。下載3:OpenCV實(shí)戰(zhàn)項(xiàng)目20講在「小白學(xué)視覺」公眾號后臺回復(fù):OpenCV實(shí)戰(zhàn)項(xiàng)目20講,即可下載含有20個(gè)基于OpenCV實(shí)現(xiàn)20個(gè)實(shí)戰(zhàn)項(xiàng)目,實(shí)現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會(huì)逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會(huì)根據(jù)研究方向邀請進(jìn)入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會(huì)請出群,謝謝理解~