Kalibracja kamery / model aparatu z otworem pinowym i wypracowanie pozycji 3D

10

Mam skalibrowaną kamerę i posiadam wewnętrzne parametry. Mam również parametry zewnętrzne względem punktu (pochodzenie świata) na płaskiej powierzchni w świecie rzeczywistym. Ten punkt ustawiłem jako początek współrzędnych świata rzeczywistego [0,0,0] z normalną równą [0,0,1].

Na podstawie tych parametrów zewnętrznych mogę obliczyć pozycję i obrót kamery we współrzędnych 3d płaszczyzny świata, używając tego tutaj: http://en.wikipedia.org/wiki/Camera_resectioning

Teraz mam drugi punkt, w którym wyodrębniłem współrzędne obrazu dla [x, y]. Jak teraz uzyskać pozycję 3D tego punktu w światowym układzie współrzędnych?

Myślę, że intuicja polega na tym, że muszę prześledzić promień, który przechodzi od optycznego środka kamery (dla której mam teraz pozycję 3D, jak opisano powyżej), przez płaszczyznę obrazu [x, y] kamery, a następnie przez mój samolot z prawdziwego świata, który zdefiniowałem na górze.

Teraz mogę przeciąć promień 3d współrzędnej świata z płaszczyzną, którą znam normalnie, i wskazać na tej płaszczyźnie. Nie rozumiem, jak ustalam pozycję i kierunek 3D, kiedy opuszcza płaszczyznę obrazu przez piksel. To dezorientacja mnie przez różne układy współrzędnych.

Gepard
źródło
Sprawdź tę odpowiedź, może pomóc. Jeśli uważasz, że coś można / może zostać zakończone, po prostu powiedz mi. dsp.stackexchange.com/a/2737/1473
Jav_Rock

Odpowiedzi:

6

Jeśli masz elementy zewnętrzne, jest to bardzo łatwe. Posiadanie elementów zewnętrznych jest tym samym, co posiadanie „pozy kamery” i to samo, co posiadanie homografii. Sprawdź ten post w stackoverflow.

Masz elementy zewnętrzne, zwane także pozycjami kamery, co jest określane jako tłumaczenie i obrót:

Pose=[R|t]=[R11R12R13txR21R22R23tyR31R32R33tz]

Można uzyskać Homography od Stanowią w ten sposób:

H.=1tz[R1xR2)xtxR1yR2)ytyR1zR2)ztz]

Następnie możesz rzutować punkty 2D na odpowiadające im punkty 3D, mnożąc homografię przez punkty:

p2)re=[xy1] Dodaj z=1 aby były jednorodne

p3)re=H.p2)re

p=p/p(z) Normalizuj punkty

Jav_Rock
źródło
co rozumiesz przez p (z) tutaj?
Belal Homaidan
3

Masz dwie opcje, użyj projekcji wstecznej lub projekcji między dwiema płaszczyznami (homografia).

W przypadku projekcji wstecznej pobierasz pseudo odwrotność matrycy kamery i mnożisz wynik przez jednorodną prezentację punktu obrazu:P

P=K[RRC]Xreprojected=P+x

Teraz masz linię 3D, która porusza koryta centrum kamera i punkcie X . Jeśli chcesz, możesz przekonwertować to na łatwiejsze w obsłudze. Na przykład z jednym wektorem punktu i kierunku (pamiętaj, aby znormalizować współrzędne jednorodne V = ω [ X Y Z 1 ] T tak, aby współczynnik skali ω = 1 przed faktycznymi obliczeniami):CXV=ω[XYZ1]Tω=1

u=XreprojectedCv=uuL(t)=C+tv

Jeśli masz płaszczyznę , możesz rozwiązać równanie L ( t ) = Π dla t .Π=[π1π2π3π4]T,π1X+π2Y+π3Z+π4=0L(t)=Πt

Jeśli zdecydujesz się na użycie homografii, musisz obliczyć macierz homografii H , która jest zdefiniowana jako rzut między płaszczyzną obrazu i płaszczyzną czujnika kamery:3×3H

Xplane=[XY01]Tx=PXplane=H[XY1]T

x

Xplane=H1x

H

H=R+1dTNT

dT.=-Rdo. (Ma, Soatto, Kosecká, Sastry - Zaproszenie do trójwymiarowej wizji od obrazów do modeli geometrycznych, s. 132)

buq2
źródło
2

Nie możesz znać pozycji 3D drugiego punktu. Może to być dowolny punkt na promieniu od środka kamery do nieskończoności.

Możesz wykonać następujące czynności:

  • Utwórz predefiniowaną przestrzeń 3D, która przypomina scenę z prawdziwego życia
  • Zdobądź więcej punktów obrazów pod innym kątem, używając przecięcia promieni pod różnymi kątami, możesz uzyskać przybliżenie punktu 3d.
Geerten
źródło
Wytrzymać. Czy mogę znaleźć punkt świata 3D, że promień 3D przecina powierzchnię płaską, na pewno? Jak wiem, współrzędna świata 3d i świat normalny 3d tej płaszczyzny ..... punkt 3d, który próbuję znaleźć, to punkt przecięcia tej płaskiej powierzchni !! (Przepraszam, czuję, że moje wyjaśnienie nie było wystarczająco dobre)
Gepard
Co masz na myśli mówiąc o płaskiej powierzchni? Płaszczyzna obrazu czy płaszczyzna zerowych współrzędnych świata? W przypadku tego drugiego możesz obliczyć przecięcie, ale to oznacza, że ​​twoja scena 3d nie jest 3d, ale 2d :) (ponieważ jest to płaszczyzna).
Geerten
Tak, przepraszam, to po prostu nie przyszło mi do głowy. Rozumiem, co mówisz, to po prostu nie ma dla mnie sensu wizualnie. Tak, tak, moja scena jest w rzeczywistości „2d”, ponieważ mam płaszczyznę obrazu i mam płaszczyznę świata rzeczywistego, na której leży rzeczywiste pochodzenie [0,0,0] i ma normalny świat rzeczywisty wynoszący [0,0, 1], dlatego każdy punkt na tej płaszczyźnie świata rzeczywistego ma postać [x, y, 0]. Wiem, że mogę obliczyć przecięcie choć ax + przez + cz + d = 0, ale mam z tym problem. (Ciąg dalszy nastąpi w następnym komentarzu)
Gepard
Mam promień, który zaczyna się w centrum / źródle aparatu, dla którego mam świat rzeczywisty [x, y, z] i normalny świat rzeczywisty [nx, ny, nz]. Muszę wystrzelić promień z tego punktu, który przecina płaszczyznę obrazu w [u, v], a następnie przecina płaszczyznę świata rzeczywistego w [x, y, 0] (to ten x, y chcę uzyskać). Mam problem z pierwszym bitem, przecięciem z płaszczyzną obrazu. Nie widzę, jak to robię?
Gepard
Możesz zajrzeć na: en.wikipedia.org/wiki/Line-plane_intersection
Geerten