Jak obliczyć pozę kamery z matrycy homografii?

13

Powiedzmy, że używam tylko jednej skalibrowanej kamery. Od tego aparatu, mam zdjęcia A i B. Znam homography między A i B, obliczany przez OpenCV „s findHomography () .

Znam pozę (macierz obrotu R i wektor translacji t) obrazu A i potrzebuję pozy obrazu B. Po jej uzyskaniu przypuszczam, że będę w stanie obliczyć każdą kolejną pozę kolejnych obrazów.

Czy znasz implementację obliczania pozycji B? Znalazłem kilka artykułów w Internecie, ale nie mogłem znaleźć łatwego do wdrożenia rozwiązania ...

Stéphane Péchard
źródło
Nie jestem pewien, czy rozumiem, jak korzystać z twojego kodu. Używam OpenCV do pobierania homografii, ale kiedy wysyłam tę homografię za pomocą algorytmu, zawsze zwraca to. cameraPose [1, 0, 0, 0; 0, 1, 0, 0; 0, 0, 1, 0]
LeRoss

Odpowiedzi:

8

Nawet jeśli moja odpowiedź przychodzi za późno, być może inni uważają to za przydatne. Mam kody do pozycji otwartej CV z homografii. Znalazłem tę metodę na tej naprawdę użytecznej stronie internetowej, 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
źródło
Użyłem twojej funkcji w moim kodzie. Matryca pozycji obliczona w ten sposób jest zawsze [1 0 0 0; 0 1 0 0; 0 0 1 0; 0 0 0 0]. Czy masz jakieś wyjaśnienie?
Muhammet Ali Asan,
Czy używasz pozy A? Wygląda na to, że używasz wejścia H
Guig
Ta metoda nie jest naprawdę dokładna, nawet przy matrycy homografii obliczonej prosto ze znanej pozycji. Wynik można jednak poprawić za pomocą iteracyjnego procesu, w którym uzyskuje się macierz z oszacowanej pozycji, odwraca ją i stosuje do pierwotnego wejścia. Pobierz parametry pozy z tej homografii pozostałości, aktualizuj swoje oszacowanie pozy i tak dalej, aż się zbiegnie.
dividebyzero
0

Możesz użyć metody dekompozycji homografii zaimplementowanej w Opencv 3.0+

decomposeHomographyMat

  • Funkcja Opencv zwraca zestaw możliwych obrotów, normalne kamery i macierze translacji.
  • Musisz wybrać prawidłowy zestaw spośród nich, porównując normalne kamery z normalną kamerą aparatu podczas robienia pierwszego zdjęcia
nbsrujan
źródło