Як обчислити позу камери з матриці гомографії?


13

Скажімо, я використовую лише одну калібровану камеру. З цієї камери я отримую зображення A і B. Я знаю гомографію між A і B, обчислену за допомогою OpenCV 's findHomography () .

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

Чи знаєте ви реалізацію обчислювальної пози B? Я знайшов кілька статей в Інтернеті, але не зміг знайти легко реалізоване рішення ...


Я не впевнений, що я розумію, як використовувати ваш код. Я використовую OpenCV для отримання гомографії, але коли я надсилаю цю гомографію через алгоритм, вона завжди повертає це. cameraPose [1, 0, 0, 0; 0, 1, 0, 0; 0, 0, 1, 0]
LeRoss

Відповіді:


8

Навіть якщо моя відповідь надходить занадто пізно для вас, можливо, інші люди вважають це корисним. У мене є коди для 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]
}

////


Я використовував вашу функцію у своєму коді. Матриця, що обчислюється таким чином, завжди використовується [1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 0]. Чи є у вас якесь пояснення?
Мухаммет Алі Асан

Ви використовуєте позу А? Здається, ви використовуєте лише вхід H
Guig

Цей метод насправді не є точним, навіть якщо гомографічна матриця обчислюється прямо з відомої пози. Результат можна покращити, проте, використовуючи ітераційний процес, коли ви отримуєте матрицю з оціночної пози, інвертуєте її та застосовуєте до вихідного вводу. Отримайте параметри пози з цієї гомографії залишків, оновіть оцінку пози тощо, поки вона не сходиться.
ділбізеро


0

Можна використовувати метод розкладання гомографії, реалізований у Opencv 3.0+

розкластиГомографіяМат

  • Функція Opencv повертає набір можливих обертань, нормалів камери та матриць перекладу.
  • Ви повинні вибрати правильний набір серед них, порівнявши нормальні показники камери з нормальною для камери, коли було зроблено перше зображення
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.