C++ 访问Mat的每个像素

C++ 访问Mat的每个像素,c++,opencv,C++,Opencv,今天我偶然发现了一件(对我来说)奇怪的事情,即当我运行这段代码时 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&

今天我偶然发现了一件(对我来说)奇怪的事情,即当我运行这段代码时

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;
    }
}
有人能给我解释一下为什么会这样吗


它不应该是一样的吗?

下面是它看起来的样子
p
指向的内存是:

// |251 |123 |63  |254 |...   uint8_t
// +----+----+----+----+----+
// | FB | 7B | 3F | FE |... | hex
// +----+----+----+----+----+
// |0.00683212          ...   double
当你做y.at(i,j)时,本质上发生的是:

p[i*y.cols + j]

您正在以
uint8\u t
的形式访问数组,因此得到一个
uint8\u t
,它转换为
double
后保持相同的值。当您通过
.at()
访问它时,它将以
双精度*
的形式访问它。下面是
p
指向的内存的外观:

// |251 |123 |63  |254 |...   uint8_t
// +----+----+----+----+----+
// | FB | 7B | 3F | FE |... | hex
// +----+----+----+----+----+
// |0.00683212          ...   double
当你做y.at(i,j)时,本质上发生的是:

p[i*y.cols + j]
您正在以
uint8\u t
的形式访问数组,因此得到一个
uint8\u t
,它转换为
double
后保持相同的值。当您通过
.at()
访问它时,它将以
双精度*

cout
cout的方式访问它