SAD立體匹配詳解

2021-10-08 08:00:14 字數 3494 閱讀 6941

1.概念: sad(sum of absolute differences)是一種影象匹配演算法。基本思想:差的絕對值之和。此演算法常用於影象塊匹配,將每個畫素對應數值之差的絕對值求和,據此評估兩個影象塊的相似度。該演算法快速、但並不精確,通常用於多級處理的初步篩選。

2.步驟:(1)構造乙個小視窗,類似於卷積核;

(2)用視窗覆蓋左邊的影象,選擇出視窗覆蓋區域內的所有畫素點;

(3)同樣用視窗覆蓋右邊的影象並選擇出覆蓋區域的畫素點;

(4)左邊覆蓋區域減去右邊覆蓋區域,並求出所有畫素點灰度差的絕對值之和;

(5)移動右邊影象的視窗,重複(3)-(4)的處理(這裡有個搜尋範圍,超過這個範圍跳出);

(6)找到這個範圍內sad值最小的視窗,即找到了左圖錨點的最佳匹配的畫素塊。

3.說明:用sad演算法可以得出左右影象的視差,若再一步處理就可以得到深度圖,深度與視差存在反比的關係,我們可以簡單體會一下:將手指頭放在離眼睛不同距離的位置,並輪換睜、閉左右眼,可以發現手指在不同距離的位置,視覺差也不同,且距離越近,視差越大,其中距離的遠近就是深度了。而且可以注意到,當你用左眼看手指時,手指在你眼中的靠右位置,而用右眼看時,手指在你眼中靠左的位置。兩隻眼分別看到的影象是一樣大的,如果用(x,y)表示左眼檢視中某個位置的座標,那麼相應的該位置右眼檢視的座標應該為(x-d,y),其中d為視差。這時(x,y)和(x-d,y)就是最佳匹配點。但是實際情況我們並不知道d是多少。sad演算法就給出了如何求d.

sad演算法的思想:只需我們按視差搜尋範圍從0開始搜尋,找到左右影象最匹配的點,對應的視差值就確定了。那麼怎麼確定最佳匹配點呢?試想一下,如果視差為0,也就是左右影象一樣,那麼這個點上下左右區域對應的點都應該相同,所以畫素相減後都為0,由於視差的存在(簡單理解為從不同的角度看物體,由於光照的影響畫素值也會發生改變),該點上下左右區域的畫素值不會完全相等,但是我們依然可以利用這個思想,設定乙個小視窗,在左右兩幅圖中計算其畫素值差的絕對值之和。假如視差搜尋範圍為0-50,那麼就會得到51個結果。若在某個視差值d下該絕對值之和最小,那麼d就為該中心點對應的視差。再由視差與深度的關係就可以得到深度圖。

關於sad演算法的opencv實現**有很多,這裡給出兩個:

#include

"iostream"

#include

"opencv2/opencv.hpp"

#include

"iomanip"

using

namespace std;

using

namespace cv;

class

sadsad

(int _winsize,

int _dsr)

:winsize

(_winsize)

,dsr

(_dsr)

mat computersad

(mat &l, mat &r)

;//計算sad

private

:int winsize;

//卷積核的尺寸

int dsr;

//視差搜尋範圍};

mat sad::

computersad

(mat &l, mat &r)

} point minloc;

//point資料型別為二維點物件,有橫縱xy兩個座標

minmaxloc

(mm,

null

,null

,&minloc,

null);

//返回mm最小值的座標

int loc = minloc.x;

//取最小值座標的橫座標x值,即為對應的列序號,也就是相應的視差值

//int loc=dsr-loc;

disparity.at<

char

>

(i, j)

= loc *16;

//*16只是為了方便顯示

}double rate =

double

(i)/

(width)

;//cout << "已完成" << setprecision(2) << rate * 100 << "%" << endl; //處理進度

}return disparity;

}

接下來這個可以執行,就是**比較粗暴,不是很容易理解。

#include

#include

#include

#include

#include

using

namespace std;

using

namespace cv;

const

int n =7;

//視窗大小:2*n+1

const

int range =

150;

//視差範圍

void

sad(uchar* limg,

uchar* rimg,

uchar* oimg,

int w,

int h)}if

(cost < bestcost)

oimg[y*w + x]

= bestdisparity*4;

}}}}

intmain()

imr =

imread

("im6.png",0

);if(imr.

empty()

) imo.

create

(iml.rows, iml.cols, cv_8uc1)

;sad

(iml.data, imr.data, imo.data, iml.cols, iml.rows)

;namedwindow

("left"

, window_autosize)

;namedwindow

("right"

, window_autosize)

;namedwindow

("output"

, window_autosize)

;imwrite

("11.png"

, imo)

;imshow

("output"

, imo)

;imshow

("left"

, iml)

;imshow

("right"

, imr)

; clock_t endtime =

clock()

;printf

("%d\n"

,(endtime - starttime));

cout <<

(endtime - starttime)

<< endl;

waitkey(0

);return0;

}

立體匹配SAD演算法matlab實現

sad sum of absolute differences 是一種影象匹配演算法。用公式表示為 sad u,v sum選擇最小值。基本思想 差的絕對值之和。此演算法常用於影象塊匹配,將每個畫素對應數值之差的絕對值求和,據此評估兩個影象塊的相似度。該演算法快速 但並不精確,通常用於多級處理的初步篩...

SAD立體匹配演算法的PYTHON實現

這是第一次發csdn部落格,因為在機器視覺的學習中csdn幫助了我很多,那麼我也應該為csdn社群做一些貢獻,所以本文將介紹我用python實現的sad匹配演算法。sad演算法是立體匹配演算法中,隸屬於區域性區域匹配演算法中的乙個演算法,原理是從左圖中找出乙個小視窗,利用極線約束,在 右圖中同一行中...

立體匹配 立體匹配過程

立體匹配就4個步驟 匹配代價計算,代價聚合,計算視差,視差精化 匹配代價計算 一般是通過計算左右兩圖對應畫素3個通道的灰度值差來決定匹配代價的,常用的就是基於畫素點匹配代價計算,一般有ad,sd,tad什麼的,基於區域的匹配代價計算一般有sad,ssd,stad之類的。匹配代價計算會生成乙個disp...