#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 неудивительна.