2014-12-04 42 views
0

效果目前,我試圖瞭解的OpenCV的人臉檢測API DetectionBasedTracker。裏面的代碼,我發現了定義偏移值及其對整數值

#define CALC_SUM_(p0, p1, p2, p3, offset) \ 
    ((p0)[offset] - (p1)[offset] - (p2)[offset] + (p3)[offset]) 

我不能弄清楚以下

(1)P0,P1,P2,P3是整數值。 (p0)[offset]的回報值是多少?它有什麼作用?

(2)實際上偏移在圖像矩陣的一個行的整數的數目。假設圖像矩陣是480 x 640.在一行圖像數據中有640個整數值。對於第二行,偏移= 640。它被計算爲offset = pt.y * ((int)image.step/sizeof(int)) + pt.x;通過更改offset value(p0)[offset]如何起作用?

回答

2

我的猜測是p0的整數,而是一維數組。

如果這是正確的,宏將被計算在offset個項目「和」在陣列p0p1p2p3,除了是因爲所有這些-標誌一個奇怪的總和。

編輯:現在已經看了看代碼問題

我發現代碼難走,但我們想試試:

我的結論是p0[offset]是一個指向像素的圖像(一個整數值)。該像素是圖像中矩形的一個角。 p1[offset]p2[offset],和p3[offset]是指針在同一矩形的其它角的像素。

更詳細...

CALC_SUM_CALC_SUM稱爲被稱爲在很多地方,比如在HaarEvaluator::Feature :: calc

calc功能CALC_SUM調用p[0]作爲參數。 pstruct Featureconst int* p[RECT_NUM][4]定義的,所以p[0]是四個指針的數組,以int秒。

什麼可能這四個int S爲?那麼,在Feature構造函數被調用後,它們是不確定的,因爲指針被設置爲NULL。

但是,假設HaarEvaluator::Feature :: updatePtrs已被調用某個點,指針更新由CV_TILTED_PTRSCV_SUM_PTRS宏。

這些宏的兩個採取一個指針值的矩陣,我假設是像素的圖像(給定的手頭的任務,這是找到一個圖像中的特徵)在矩陣中。該指針被稱爲titledsum。讓我們使用sump[0]中的四個指針由CV_SUM_PTRS設置爲指向sum內矩形的四個角。

當調用calc函數時,四個指針(p[0]包含四個指向角p[0][0] - p[0][3]的指針)與一個偏移一起被傳入。使用數組表示法將這個偏移量有效地添加到四個指針中的每一箇中,這會使圖像周圍的矩形移動。

實際的總和看起來像它可以做快速計算here

+0

不,我已經檢查過。 po是一個整數。 – batuman 2014-12-04 09:41:37

+0

尋找'cascadedetect.hpp',它看起來非常像'p0'是一個指向一個整數的_pointer_。在'struct Feature'中看到'const int * p [RECT_NUM] [4];'行。你認爲這是一個整數的基礎是什麼? – Tony 2014-12-04 21:05:31

+0

是的,你是對的。我在行號190處使用LBPEvaluator。實際上,p是const int * p [16];內部特徵結構。每個p [i]是指向整數的指針。但只指向一個整數。那麼(p0)[offset]是做什麼的?因爲它只指向一個整數。 – batuman 2014-12-05 04:26:47