我有一个Nx1
浮点值矩阵。我希望只获得从22nd
到Nth
项的那些值的平均值。我创建了Nx1
维度的二进制掩码,将0s
放在[0,21]
范围内,将1s
放在其余范围内。在计算平均值时应用该掩码(使用内置函数获得最大速度)会产生错误。代码段如下所示。
错误是:
输入参数的大小在cvSvg()"
中不匹配
正确的面具应该是什么?我已经尝试在掩码中使用浮点而不是整数,但仍无效。
CvMat mask;
int i;
int N = img->width;
IplImage* W = cvCreateImage( cvSize(N, 1), IPL_DEPTH_32F , 1 );
IplImage* A = cvCreateImage( cvGetSize(img), IPL_DEPTH_32F , 1 );
cvConvertScale(img, A);
int* vals = (int*)malloc(N*sizeof(int));
for(i=0; i<N; i++)
{
if(i<22)
vals[i] = 0;
else
vals[i] = 1;
}
cvInitMatHeader(&mask, N, 1, CV_8U, vals);
cvSVD(A, W, NULL, NULL, CV_SVD_MODIFY_A);
CvScalar mean = cvAvg(W, &mask);
答案 0 :(得分:1)
这是我用一个人为的例子计算掩码的方法,但看起来效果很好。
int main(int argc, char* argv[])
{
int N = 50;
CvMat* a = cvCreateMat(1, N, CV_32FC1);
CvMat* mask = cvCreateMat(1, N, CV_8UC1);
float* aData = a->data.fl;
uchar* maskData = mask->data.ptr;
for(int i = 0; i < a->cols; i++)
{
aData[i] = (float)i;
if(i < 22)
{
maskData[i] = 0;
}
else
{
maskData[i] = 1;
}
}
CvScalar avg = cvAvg(a);
cout << "Average without mask: " << avg.val[0] << endl;
avg = cvAvg(a, mask);
cout << "Average with mask: " << avg.val[0] << endl;
cvReleaseMat(&a);
cvReleaseMat(&mask);
return 0;
}
这会产生以下输出:
Average without mask: 24.5
Average with mask: 35.5
因此,它适用于这个简单的例子。希望这会让你再次前进。
答案 1 :(得分:0)
你用作掩码的图像不一定是双倍的,但Uint,我认为代码很好,不太确定掩码的初始化。 你仍然必须声明W如下
IplImage * W = cvCreateImage(cvSize(N,1),IPL_DEPTH_8U,1);