2011-12-29 7 views
0

浮動小数点値のNx1行列があります。 22ndからNthまでの値の平均値を取得したいと考えています。 Nx1のバイナリマスクを作成しました。[0,21]1sの範囲に0sを入れます。平均を計算中にそのマスクを適用すると(最大速度のための組み込み関数を使用して)エラーが発生します。コードスニペットを以下に示します。OpenCVで浮動小数点イメージをマスクする方法は?

エラーは次のとおりです。入力引数に

サイズが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); 

答えて

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 

だから、それはこの単純な例のために働いています。うまくいけば、それはあなたにもう一度行くでしょう。

0

あなたがマスクとして使用した画像は、二重にする必要はありませんが、UINT、コードは、私が考えるinitializaについて本当にわから罰金ではありませんマスクの まだWを次のように宣言する必要があります。

IplImage * W = cvCreateImage(cvSize(N、1)、IPL_DEPTH_8U、1);

関連する問題