我正在尝试访问来自将视频帧转换为灰度的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到25​​5之间的值。

最佳答案

由于要处理灰度图像,因此应使用uchar而不是intdouble。 (您可以将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/

10-11 18:53