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

Смежные вопросы