Я использую CImg и библиотеку Eigen для проекта по распознаванию лиц. У меня все (казалось бы) работает до момента, когда я генерирую вектор собственных значений. затем все значения совпадают (-6.27744e + 066), что явно неверно. Код MSVS 2013 Pro выглядит следующим образом:
int _tmain(int argc, _TCHAR* argv[])
{
CImgList<unsigned char> init_faces;
CImg<float> avg_face;
CImgList<float> face_diffs;
//Code for reading in face images, creating the average image
//and creating the difference images
CImg<double> covariance_matrix(face_diffs.size(), face_diffs.size());
Eigen::MatrixXcd cov_matrix(face_diffs.size(), face_diffs.size());
//Compute covariance matrix using the pictures that show the
//difference from each input from the average
compute_covariance(face_diffs, covariance_matrix);
//convert the matrix from a CImg to an Eigen readable matrix
convert_eigenlib(covariance_matrix, cov_matrix);
//create EigenSolver object, passing the covariance matrix
Eigen::ComplexEigenSolver<Eigen::MatrixXcd> eig_solve(cov_matrix);
//compute the eigenvalues of the covariance matrix
Eigen::VectorXcd eig_vals = eig_solve.eigenvalues();
//This line produces a 25 element long vector of eigenvalues,
//all of which are: -6.27744e+066
cout << "Eigenvalues:" << endl << eig_vals << endl;
return 0;
}
void compute_covariance(CImgList<float> face_diffs, CImg<double> &covariance_matrix)
{
CImgList<float> transpose;
float temp = 0;
for (unsigned int i = 0; i < face_diffs.size(); i++)
{
transpose.insert(face_diffs(i).get_transpose());
}
transpose.display();
for (unsigned int x = 0; x < face_diffs.size(); x++)
{
for (unsigned int y = 0; y < face_diffs.size(); y++)
{
covariance_matrix(x, y, 0, 0) = transpose(x).dot(face_diffs(y));
}
}
}
void convert_eigenlib(CImg<double> covariance_matrix, Eigen::MatrixXcd &cov_matrix)
{
for (int x = 0; x < covariance_matrix.width(); x++)
{
for (int y = 0; y < covariance_matrix.height(); y++)
{
cov_matrix(y, x) = covariance_matrix(x, y, 1, 1);
}
}
}
Я полагаю, что моя проблема содержится в одной из 2 показанных пользователем функций, так как каждый второй шаг дает мне ожидаемые результаты.
Задача ещё не решена.