2016-10-21 6 views
0

Je rencontre un problème avec C++. Mon idée est de remplir une matrice intrinsèque avec des valeurs prédéfinies pour l'étalonnage de la caméra, sauf que je ne semble pas le faire correctement.Affectation de valeurs sur une matrice

Mat intrinsic_Matrix(3,3, CV_64F); 
float fx = (4032 * 4)/6.69; //2410.76 
float fy = (3024 * 4)/5.55; //2179.45 

    float cx = 2016.0; 
    float cy = 1512.0; 

    cout << intrinsic_Matrix << endl; 

    cout << endl; 

    intrinsic_Matrix.at<float>(0,0) = fx; 
    intrinsic_Matrix.at<float>(0,1) = 0.0; 
    intrinsic_Matrix.at<float>(0,2) = cx; 

    intrinsic_Matrix.at<float>(1,0) = 0.0; 
    intrinsic_Matrix.at<float>(1,1) = fy; 
    intrinsic_Matrix.at<float>(1,2) = cy; 

    intrinsic_Matrix.at<float>(2,0) = 0.0; 
    intrinsic_Matrix.at<float>(2,1) = 0.0; 
    intrinsic_Matrix.at<float>(2,2) = 1.0; 

    cout << intrinsic_Matrix << endl; 
    calibrateCamera(frameWorldPoints, bothImagePoints, cvSize(referimages[0].image.cols, referimages[0].image.rows), intrinsic_Matrix, distortion_coeffs, rvecs, tvecs, CV_CALIB_USE_INTRINSIC_GUESS); 

La sortie sur les deux impressions n'a pas de sens. On dirait que je regarde des valeurs de pointeur ou des valeurs non initialisées. De plus, opencv lance une exception "matrice intrinsèque non correcte" lorsque j'essaie de l'étalonner, donc je suis sûr que ce n'est pas que je l'imprime mal.

Répondre

3

Vous initialisez MAT avec 64F mais utilisez des flottants. Soit le changement de 32F comme suit

Mat intrinsic_Matrix(3,3, CV_32F); 
float fx = (4032 * 4)/6.69; //2410.76 
float fy = (3024 * 4)/5.55; //2179.45 

    float cx = 2016.0; 
    float cy = 1512.0; 

    cout << intrinsic_Matrix << endl; 

    cout << endl; 

    intrinsic_Matrix.at<float>(0,0) = fx; 
    intrinsic_Matrix.at<float>(0,1) = 0.0; 
    intrinsic_Matrix.at<float>(0,2) = cx; 

    intrinsic_Matrix.at<float>(1,0) = 0.0; 
    intrinsic_Matrix.at<float>(1,1) = fy; 
    intrinsic_Matrix.at<float>(1,2) = cy; 

    intrinsic_Matrix.at<float>(2,0) = 0.0; 
    intrinsic_Matrix.at<float>(2,1) = 0.0; 
    intrinsic_Matrix.at<float>(2,2) = 1.0; 

    cout << intrinsic_Matrix << endl; 
    calibrateCamera(frameWorldPoints, bothImagePoints, cvSize(referimages[0].image.cols, referimages[0].image.rows), intrinsic_Matrix, distortion_coeffs, rvecs, tvecs, CV_CALIB_USE_INTRINSIC_GUESS); 

ou

changer toutes vos variables à double, en gardant intrinsic_matrix initialisé 64F

Mat intrinsic_Matrix(3,3, CV_64F); 
double fx = (4032 * 4)/6.69; //2410.76 
double fy = (3024 * 4)/5.55; //2179.45 

double cx = 2016.0; 
double cy = 1512.0; 

cout << intrinsic_Matrix << endl; 

cout << endl; 

intrinsic_Matrix.at<double>(0,0) = fx; 
intrinsic_Matrix.at<double>(0,1) = 0.0; 
intrinsic_Matrix.at<double>(0,2) = cx; 

intrinsic_Matrix.at<double>(1,0) = 0.0; 
intrinsic_Matrix.at<double>(1,1) = fy; 
intrinsic_Matrix.at<double>(1,2) = cy; 

intrinsic_Matrix.at<double>(2,0) = 0.0; 
intrinsic_Matrix.at<double>(2,1) = 0.0; 
intrinsic_Matrix.at<double>(2,2) = 1.0; 

cout << intrinsic_Matrix << endl; 
+0

A travaillé, merci. :) – Kronephon