visual-c++ - 如何在 IplImage 上使用 calcCovarMatrix?

标签 visual-c++ opencv covariance

有一个单 channel 灰度 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 **) &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);
}

最佳答案

阅读有关此功能的手册。如果将值存储在单个矩阵“输入”中,则第二个函数参数不得为“行”。第二个参数用来说明你在第一个参数中传递了多少个矩阵。您只传递了一个矩阵“输入”。段错误并不奇怪。

关于visual-c++ - 如何在 IplImage 上使用 calcCovarMatrix?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6300872/

相关文章:

c++ - -1073741811(0xc000000d)错误opencv

php - PHP 中的协方差 (OOP) - 它是如何工作的

python - 计算两个 channel 中复杂数据的协方差矩阵(无复杂数据类型)

c# - 从协方差返回 Action<T> 的方法

c++ cli try block 不允许文件流打开大文件

mysql - C++ mySQL 连接器 LINKER 错误 (Windows)

c++ - 在Visual C++项目中添加文件夹

.net - 如何检查是否安装了 .NET Framework

c++ - 从缓冲区中获取最清晰的 iplimage

opencv - 使用 openCV 检测由红外光突出显示的图案