2016-05-13 54 views
0

今天我碰到這個偶然(對我)奇怪的事情,就是當我運行這段代碼訪問墊子的每個像素

int i,j; 
uint8_t* p = y.data; 
for(i = 0; i < y.rows; ++i) 
{ 
    for (j = 0; j < y.cols; ++j) 
    { 
     std::cout << y.at<double>(i,j) << std::endl; 
     std::cout << saturate_cast<double>(p[i*y.cols + j]) << std::endl; 
    } 
} 

輸出我得到這個樣子的:

0.00683212 
251 
0.00683212 
123 
0.00683212 
63 
0.00683212 
254 
0.00683212 
251 
0.00683212 
123 
... 

能有人向我解釋爲什麼是這樣?

它不應該一樣嗎?

+0

'cout << int(y.at (i,j))' – Miki

回答

2

這裏是什麼樣子的內存指向由p是:

// |251 |123 |63 |254 |... uint8_t 
// +----+----+----+----+----+ 
// | FB | 7B | 3F | FE |... | hex 
// +----+----+----+----+----+ 
// |0.00683212   ... double 

當你做y.at<double>(i,j)什麼本質事情是:

p[i*y.cols + j] 

您正在訪問的數組作爲uint8_t和因此得到一個uint8_t,其中轉換爲double保持相同的值。當您通過.at<double>()訪問它時,它將其作爲double*