Как рассчитать позу камеры по матрице гомографии?

13

Скажем, я использую только одну калиброванную камеру. С этой камеры я получаю изображения A и B. Я знаю гомографию между A и B, вычисленную с помощью findComography () OpenCV .

Я знаю позу (матрицу вращения R и вектор перевода t) изображения A, и мне нужна поза изображения B. Как только я его получу, я предполагаю, что смогу вычислить все последующие позы следующих изображений.

Вы знаете реализацию компьютерной позы B? Я нашел несколько статей в Интернете, но я не мог найти легко реализуемое решение ...

Стефан Пешар
источник
Я не уверен, что понимаю, как использовать ваш код. Я использую OpenCV для извлечения гомографии, но когда я посылаю эту гомографию через алгоритм, она всегда возвращает это. CameraPose [1, 0, 0, 0; 0, 1, 0, 0; 0, 0, 1, 0]
LeRoss

Ответы:

7

Даже если мой ответ придет слишком поздно для вас, возможно, другие люди сочтут это полезным. У меня есть коды для позы openCV от гомографии. Я нашел метод на этом действительно полезном веб-сайте euclideanspace .

void cameraPoseFromHomography(const Mat& H, Mat& pose)
{
    pose = Mat::eye(3, 4, CV_64FC1); //3x4 matrix
    float norm1 = (float)norm(H.col(0)); 
    float norm2 = (float)norm(H.col(1));
    float tnorm = (norm1 + norm2) / 2.0f;

    Mat v1 = H.col(0);
    Mat v2 = pose.col(0);

    cv::normalize(v1, v2); // Normalize the rotation

    v1 = H.col(1);
    v2 = pose.col(1);

    cv::normalize(v1, v2);

    v1 = pose.col(0);
    v2 = pose.col(1);

    Mat v3 = v1.cross(v2);  //Computes the cross-product of v1 and v2
    Mat c2 = pose.col(2);
    v3.copyTo(c2);      

    pose.col(3) = H.col(2) / tnorm; //vector t [R|t]
}

////

Jav_Rock
источник
Я использовал вашу функцию в своем коде. Матрица представления, вычисленная таким образом, всегда равна [1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 0]. Есть ли у вас какие-либо объяснения?
Мухаммед Али Асан,
Вы используете позу А? Кажется , что вы используете только входной H
Guig
Этот метод не очень точен, даже с матрицей гомографии, вычисленной прямо из известной позы. Однако результат можно улучшить, используя итеративный процесс, в котором вы получаете матрицу из предполагаемой позы, инвертируете ее и применяете к исходному вводу. Получите параметры позы из этой гомографии остатков, обновите оценку позы и так далее, пока она не сойдется.
Divybyzero
0

Вы можете использовать метод декомпозиции гомографии, реализованный в Opencv 3.0+

decomposeHomographyMat

  • Функция Opencv возвращает множество возможных поворотов, нормалей камеры и матриц перевода.
  • Вы должны выбрать правильный набор среди них, сравнивая нормали камеры с нормалью камеры камеры, когда было снято первое изображение
nbsrujan
источник