为什么我无法在openCV中访问矩阵元素?

时间:2012-10-05 15:09:27

标签: c++ arrays opencv for-loop matrix

我正在尝试访问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矩阵的元素,但它显示“-5.235125e + 30”的值为“double”或“-11242433” “for”int“。这也让我感到困惑,我期待看到0到25​​5之间的值。

2 个答案:

答案 0 :(得分:2)

您应该使用uchar代替intdouble,因为您正在处理灰度图像。 (您可以将uchar转换为打印: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直接访问)

答案 1 :(得分:1)

我严重怀疑这一行可能是问题

 for ( int m = 0; m < C; m ++ )

在循环运行时检查C的值并崩溃,可能是为了尝试访问数组边界之外的元素。最有可能的是它超过3.为什么你不使用预增量运算符。在这个例子中可能不相关,但是使用preincrement运算符而不是使用增量运算符是一种好习惯。