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()
访问它时,它将以双精度*
coutcout的方式访问它