2012-06-11 11 views
6

Chcę powiększyć wirtualny obiekt na x, y, z metrze kamery wrt. OpenCV ma funkcje kalibracji kamery, ale nie rozumiem, jak dokładnie mogę podać współrzędne w metrachJak znaleźć matrycę kamery dla rozszerzonej rzeczywistości?

Próbowałem symulować kamerę w Unity, ale nie otrzymam oczekiwanego wyniku.

Ustawiam macierz rzutowania w następujący sposób i utworzę sześcian jednostkowy przy z = 2,415 + 0,5. Gdzie 2.415 to odległość między okiem a płaszczyzną rzutowania (kamera otworkowa) Ponieważ powierzchnia sześcianu znajduje się na przedniej płaszczyźnie obcinania, a jej wymiary to jednostka, czy nie powinna ona obejmować całej rzutni?

Matrix4x4 m = new Matrix4x4(); 
    m[0, 0] = 1; 
    m[0, 1] = 0; 
    m[0, 2] = 0; 
    m[0, 3] = 0; 

    m[1, 0] = 0; 
    m[1, 1] = 1; 
    m[1, 2] = 0; 
    m[1, 3] = 0; 

m[2, 0] = 0; 
    m[2, 1] = 0; 
    m[2, 2] = -0.01f; 
    m[2, 3] = 0; 

    m[3, 0] = 0; 
    m[3, 1] = 0; 
    m[3, 2] = -2.415f; 
    m[3, 3] = 0; 
+0

Jeśli ustawisz m [3,2] = -1/2,415f a m [3,3] = 1 macierz projekcji działa poprawnie –

Odpowiedz

4

Skończyło się na ręcznym mierzeniu pola widzenia. Kiedy już znasz FOV, możesz łatwo stworzyć matrycę projekcji. Nie musisz się martwić jednostkami, ponieważ na końcu projekcja ma postać (X * d/Z, Y * d/Z). Niezależnie od jednostek X, Y, Z może być stosunek X/Z pozostaje taki sam.

5

skali globalnej Twojego kalibracji (czyli jednostki miary współrzędnych przestrzeni 3D) jest określona przez geometrię obiektu kalibracji używasz. Na przykład, podczas kalibracji w OpenCV za pomocą obrazów płaskiej szachownicy, dane wejściowe do procedury kalibracji są odpowiednimi parami (P, p) punktów 3D P i ich obrazów p, współrzędnych (X, Y, Z) 3D Punkty wyrażane są w mm, cm, calach, milach, dowolnych, zależnych od wielkości celu, którego używasz (i optyki, która je obrazuje), a współrzędne 2D obrazów są w pikselach. Wyjściem procedury kalibracyjnej jest zestaw parametrów (komponenty macierzy rzutowej P i nieliniowe parametry dystorsji k), które "konwertują" współrzędne 3D wyrażone w tych jednostkach metrycznych na piksele.

Jeśli nie wiesz (lub nie chcesz użyć) faktycznych wymiarów celu kalibracji, możesz je po prostu krówkować, ale pozostawić niezmienione proporcje (tak, aby na przykład kwadrat pozostał kwadratem nawet choć prawdziwa długość jej boku może być nieznana). W takim przypadku kalibracja zostanie ustalona na nieznaną skalę globalną. Jest to tak naprawdę powszechny przypadek: w większości aplikacji do rzeczywistości wirtualnej nie obchodzi Cię, jaka jest globalna skala, o ile wyniki będą wyglądać prawidłowo na obrazie.

Na przykład, jeśli chcesz dodać parzystą parę warg 3D na filmie Angeliny Jolie i połączyć je z oryginalnym filmem, aby zupełnie nowe, fałszywe usta pozostały przyczepione i wyglądały "naturalnie" na twarzy wystarczy przeskalować model 3D fałszywych warg tak, aby zachodził poprawnie na obraz warg. To, czy model jest oddalony o 1 metr, czy o milę od kamery CG, w której renderujesz kompozyt, jest zupełnie nieistotne.

+1

Podoba mi się przykład :) – Ani

+1

Jestem w stanie powiększać modele bez odpowiedniej skali, ale ja chcę, żeby był dokładny w metrach. Będę robił rendering stereo i musi dawać dokładną percepcję głębi. –

+0

Dokładność pomiarów nie ma znaczenia w przypadku renderowania stereo: wszystko, co w tym przypadku dotyczy, to renderowanie z odpowiednią różnicą lewy-prawy w dwóch kamerach. Jeśli wszystkie wskaźniki rozmiaru i odległości są poprawne, rzeczywistej skali globalnej nie można dostrzec. –

5

Aby znaleźć obiekt, należy znaleźć położenie i orientację kamery. To jest to samo, co znajdowanie zewnętrznych elementów aparatu. Musisz najpierw obliczyć wewnętrzną rzeczywistość kamery (która nazywa się calibraiton).

OpenCV pozwala zrobić to wszystko, ale nie jest trywialne, wymaga pracy na własną rękę. Daję ci wskazówkę, najpierw musisz rozpoznać w scenie coś, co wiesz, jak to wygląda, abyś mógł obliczyć pozę kamery, analizując ten obiekt, nazwać go znacznikiem. Możesz zacząć od typowych fiducials, są one łatwe do wykrycia.

Spójrz na to thread.

Powiązane problemy