立體感知對應點匹配基本分為兩種:一是低層的基於像素級的匹配,二是高層的基於特征級的匹配。
這里介紹的是底層的像素級匹配。
用攝像頭平行移動獲取兩張圖片,其實就是雙目感知到的兩張圖片。
原理是在一定的窗口中,兩張圖片具有相同的水平視差,而對比這兩個局部窗口中的像素相似度就能計算出當前像素的深度。
先看下效果吧:
left.img right.img
depth.img
具體判斷像素相似度的判據有以下幾種:
所有公式(非官方公式哈,自己憑理解寫的)中ds是原圖中的像素塊(左圖),dd是待檢測圖的像素塊(右圖),i是要搜尋深度的距離。
當然,左右都是相互的,顛倒過來比較是一樣的。
1.Sum of Absolute Differencse(sad)公式如下:
2.Root Mean Squared Error(rms)公式如下:
3.Sum of Squared Differences(ssd)公式如下:
4.Normalized Cross Correlation(ncc)公式如下:
5.Sum of Hamming Distances(shd)公式如下:
公式5中的bit()的含義是像素轉為二進制后含有多少個1,整個公式意思就是兩張局部圖先異或一下,然后統計所有像素二進制化后1的個數,取最少的那個就行了。
我只用matlab實現了第一個公式,其他的都是類似的。
代碼如下:
clear all; close all; clc; left=double(imread('left.jpg')); right=double(imread('right.jpg')); [m n]=size(left); w=3; %模板半徑 depth=5; %最大偏移距離,同樣也是最大深度距離 imgn=zeros(m,n); for i=1+w:m-w for j=1+w+depth:n-w tmp=[]; lwin=left(i-w:i+w,j-w:j+w); for k=0:-1:-depth rwin=right(i-w:i+w,j-w+k:j+w+k); diff=lwin-rwin; tmp=[tmp sum(abs(diff(:)))]; end [junk imgn(i,j)]=min(tmp); %獲得最小位置的索引 end end imshow(imgn,[])
之所以沒有全部實現是因為所有版本的實現在這個老外的博客(需翻牆)里都能找到,我就不多此一舉了。