2011-12-29 36 views
0

我有一個浮點值的Nx1矩陣。我只想得到從22ndNth項目的平均值。我創建了一個尺寸爲Nx1的二進制掩碼,其餘的爲0s,其範圍爲[0,21]1s。在計算平均值時使用該蒙版(使用內置函數獲得最大速度)會產生錯誤。代碼片段如下。如何在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);