2016-05-13 57 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*