0

我正在尝试访问来自将视频帧转换为灰度的 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”代表“诠释”。这也让我感到困惑,我期待看到 0 到 255 之间的值。

4

2 回答 2

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

于 2012-10-05T15:21:29.337 回答
1

我严重怀疑这条线可能是问题

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

当您的循环正在运行并崩溃时,检查您的 C 值,也许意味着尝试访问数组边界之外的元素。很可能它超过 3。为什么不使用预增量运算符。在此示例中可能不相关,但使用前增量运算符而不是后增量运算符是一种很好的做法。

于 2012-10-05T15:17:06.590 回答