2016-10-21 5 views
0

У меня проблема с C++. Моя идея - заполнить внутреннюю матрицу предопределенными значениями для калибровки камеры, за исключением того, что я, похоже, не делаю это правильно.Назначение значений на матрице

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); 

Выход на обоих отпечатках мало смысла. Похоже, я смотрю на значения указателя или неинициализированные значения. Кроме того, opencv выдает исключение «внутренняя матрица не правильное», когда я пытаюсь его откалибровать, поэтому я уверен, что это не значит, что я печатаю это неправильно.

ответ

3

Вы инициализируете MAT с помощью 64F, но используете поплавки. Либо изменение 32F следующим

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); 

или

изменить все свои переменные, чтобы удвоить, сохраняя intrinsic_matrix инициализируется 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

работал, спасибо. :) – Kronephon

 Смежные вопросы

  • Нет связанных вопросов^_^