Wierzę, że to, o co prosisz, nazywa się transformacją rzutową . Poniższy link poprowadzi Cię przez dokładnie to, czego potrzebujesz.
Demonstration of calculating a projective transformation z właściwym składem matematycznym na Math SE.
Chociaż możesz rozwiązać ten problem ręcznie i zapisać go w swoim kodzie ... Zdecydowanie polecam używanie biblioteki matematycznej lub nawet zapisywanie własnych funkcji matematycznych przed ręcznym obliczaniem równań, ponieważ będziesz musiał rozwiązać symbolicznie, aby przekształcić go w kod i który będzie bardzo ekspansywny i podatny na błędy w obliczeniach.
Oto kilka wskazówek, które mogą pomóc w wyjaśnieniu (stosując ją do swojego problemu):
Wasza Matryca (źródło) jest zbudowany z 4 punktów xy w aparacie obrazu (pikseli lokalizacje) .
-Materia B (docelowa) jest zbudowana z pomiarów w rzeczywistym świecie.
-Dla szybkiej rekalibracji sugeruję zaznaczanie punktów na ziemi, aby móc szybko umieścić kostkę w 4 lokalizacjach (a następnie uzyskać zmienione lokalizacje pikseli w aparacie) bez konieczności ponownej oceny.
-Trzeba tylko wykonać kroki 1-5 (jeden raz) podczas kalibracji, a następnie, gdy chcesz poznać położenie czegoś, po prostu uzyskaj współrzędne na obrazie i wykonaj je w kroku 6 i kroku 7.
-Będziesz chciał, aby twoje punkty kalibracji były jak najdalej od siebie (w granicach rozsądku, ponieważ w ekstremalnych odległościach w sytuacji zbiegu szybko zaczynasz tracić gęstość pikseli, a tym samym dokładność obrazu źródłowego). Upewnij się, że żadne 3 punkty nie są współliniowe (po prostu umieść, 4 punkty mniej więcej w przybliżeniu kwadratowym prawie w całym przęśle kamery w rzeczywistym świecie)
ps Przepraszam, że nie piszę tego tutaj, ale oni mają ochotę edycja matematyczna i wygląda na czystszą!
końcowe kroki do stosowania tej metody do tej sytuacji:
Aby przeprowadzić kalibrację, trzeba będzie ustawić globalną pozycję domową (prawdopodobnie najłatwiej to zrobić arbitralnie na podłodze i mierzyć położenia kamery względem do tego momentu). Z tej pozycji będziesz musiał zmierzyć odległość obiektu od tej pozycji zarówno w współrzędnych X, jak i Y na podłodze. Chociaż bardziej ciasno spakowany zestaw kalibracyjny da więcej błędów, najprostszym rozwiązaniem może być po prostu arkusz wymiarowany (myślę o kawałku papieru do drukarki lub dużej desce lub czymś podobnym). Powodem, dla którego będzie to łatwiejsze, będzie to, że będzie on wbudowany w osie (tj. Obie strony będą prostopadłe, a użyjesz tylko czterech rogów obiektu i użyjesz odległości w puszce w swojej kalibracji). EX: w przypadku kawałka papieru punkty będą wynosić (0,0), (0,8.5), (11,8.5), (11,0)
. Wykorzystanie tych punktów i pikseli spowoduje utworzenie przekształcić matrycę, ale to wciąż daje ci globalną pozycję x, y na osiach, które mogą być trudne do zmierzenia (mogą być pochylone w zależności od tego, jak mierzyłeś/skalibrowałeś). Więc trzeba będzie obliczyć swój aparat offset:
obiekt w coords rzeczywistym świecie (z kroków powyżej): X1, Y1 aparatu coords (XC YC)
dist = sqrt (pow (x1-XC, 2) + pow (y1-Yc, 2))
Jeśli ręczne mierzenie położenia kamery z globalnego pochodzenia jest zbyt kłopotliwe, można zmierzyć odległość do 2 różnych punktów i podać te wartości do powyższego równania, aby obliczyć przesunięcie kamery, które następnie będziesz przechowywać i używać w dowolnym momencie, aby uzyskać końcową odległość.
Czy jesteś zainteresowany tylko odległością punktów na podłodze? To znaczy. czy interesuje Cię tylko jedna płaszczyzna w przestrzeni 3D? –
Ups, przepraszam. Moje sformułowanie nie było precyzyjne. Przez odległość rozumiem odległość od pierwiastka światowego układu współrzędnych (może to być położenie kamery) do środka dolnej krawędzi obiektu. Obiekty (na przykład mała kostka) stoją na podłodze, więc podłoga powinna być pojedynczą płaszczyzną w przestrzeni 3D. – Marcello90
Schemat pomoże! –