2012-10-05 51 views
0

我想访问来自转换视频帧为灰度的openCV矩阵元素。我的代码是这样的:为什么我无法访问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”或“ - 11242433“为”int“。这也是困惑我,我期待看到0至255之间,并

回答

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还是直接进入)

+0

我正在使用这种方式,因为“grayPrevious.at”方法正在进行范围检查,并且对我来说耗时很长。 –

+0

@ederman看到编辑了! – Sassa

+0

谢谢你的回答。 –

1

值我严重怀疑此行也许问题

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

检查你的C值时,你的循环运行和崩溃,也许意思是,试图访问数组边界之外的元素。最有可能的是它超过3个。为什么你不使用预增量操作符。在这个例子中可能没有关系,但是使用预增量操作符而不是后增量操作符是一种好的做法。

+0

我编辑我的代码,其实我的 “C” 是3. –

+0

@ederman是否greyPtr和grayPrevious **已初始化?你的荒谬价值可能是因为它没有被正确初始化。 – DumbCoder

+0

@DumbCoder,为什么preincrement比post increment更好? – CallMeNorm