我正在尝试访问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到255之间的值。
答案 0 :(得分:2)
您应该使用uchar
代替int
或double
,因为您正在处理灰度图像。 (您可以将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运算符而不是使用增量运算符是一种好习惯。