Как использовать calcCovarMatrix в IplImage?

#visual-c #opencv #covariance

#visual-c #opencv #ковариация

Вопрос:

Существует одноканальный IplImage в оттенках серого, ковариационная матрица которого должна быть вычислена. В SO действительно был похожий вопрос, но никто на него не ответил, и код существенно отличается.

Вот код, который выдает «необработанное исключение»:

  int calcCovar( IplImage *src, float* dst, int w )
 {
  // Input matrix size
    int rows = w;
    int cols = w;  
    int i,j;
    CvScalar se;
    float *a;
    a = (float*)malloc( w * w * sizeof(float) );
    long int k=0;

//image pixels into 1D array
for(i = 0; i < w;   i)
{
    for(j = 0; j < w;   j)
    {
        se = cvGet2D(src, i, j);
        a[k  ] = (float)se.val[0];
    }
}

CvMat input = cvMat(w,w,CV_32FC1, a); //Is this the right way to format input pixels??

  // Covariance matrix is N x N,
  // where N is input matrix column size
  const int n = w;

  // Output variables passed by reference
  CvMat* output = cvCreateMat(n, n, CV_32FC1);
  CvMat* meanvec = cvCreateMat(1, rows, CV_32FC1);

  // Calculate covariance matrix - error is here!!
  cvCalcCovarMatrix((const void **) amp;input, rows, output, meanvec, CV_COVAR_NORMAL);

    k = 0;
    //Show result
  cout << "Covariance matrix:" << endl;
  for(i=0; i<n; i  ) {
    for(j=0; j<n; j  ) {
      cout << "(" << i << "," << j << "): ";
      printf ("%f ", cvGetReal2D(output,i,j) / (rows - 1));
      dst[k  ] = cvGetReal2D(output,i,j) / (rows - 1);
      //cout << "t";
    }
    cout << endl;
  }

  return(0);
}
  

Ответ №1:

прочитайте в руководстве об этой функции. если вы храните свои значения в единственной матрице ‘input’, второй параметр функции не должен быть ‘rows’. Второй параметр используется, чтобы указать, сколько матриц вы передаете в первом параметре. Вы передали только одну матрицу, ‘input’. Ошибка Segfault неудивительна.