我正在尝试访问来自将视频帧转换为灰度的openCV矩阵元素。我的代码是这样的:
int C = 3;
cv::Mat grayPrevious;
cv::cvtColor ( previousFrame, grayPrevious, CV_RGB2GRAY );
double* grayPtr = grayPrevious.ptr <double> ();
double mean [600][800][3];
///... // set some values to mean here
for ( int i = 0; i < 600; i ++ )
{
for ( int j = 0; j < 800; j ++ )
{
for ( int m = 0; m < C; m ++ )
{
diff [i][j][m]= abs(grayPtr[ 800* (i-1)+j] - mean[i][j][m]);
}
}
}
但是它在for循环中崩溃。这和数据类型有关吗?我该如何更改?
此外,我的第二个问题是,我尝试使用“grayPrevious.at”在屏幕上查看grayPrevious矩阵的元素,但是对于“double”,它显示的值是“-5.235125e + 30”,对于“double”,它显示的值是“-11242433” int”。这也使我感到困惑,我期望看到0到255之间的值。
最佳答案
由于要处理灰度图像,因此应使用uchar
而不是int
或double
。 (您可以将uchar
强制转换为print:cout<<(int)grayPrevious.at<uchar>(i,j);
)
您是否有任何理由试图通过“困难的方式”直接访问像素?
您可以执行grayprevious.at<uchar>(i,j)
(假设您的图片为800x600),这样更易于调试,然后使用直接像素访问。
编辑:我认为应该是:uchar* grayPtr = grayPrevious.ptr <uchar> ();
,然后grayPtr[grayPrevious.cols*i+j];
您还可以执行grayPrevious.data[grayPrevious.cols*i+j];
(无需ptr
仍可直接访问)
关于c++ - 为什么我不能在openCV中访问矩阵元素?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12749083/