Присвоение значений матрице

#c #opencv #matrix #camera-calibration

#c #opencv #матрица #камера-калибровка

Вопрос:

Я столкнулся с проблемой с 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 выдает исключение «неверная внутренняя матрица», когда я пытаюсь ее откалибровать, поэтому я уверен, что дело не в том, что я печатаю это неправильно.

Ответ №1:

Вы инициализируете 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);
  

или

измените все ваши переменные на double, сохранив 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;