2016-12-12 51 views
6

Załóżmy, że umieszczam mały obiekt na płaskiej podłodze w pokoju.Zmierz odległość do obiektu za pomocą pojedynczej kamery w statycznej scenie

  • Pierwszy krok: Zrób zdjęcie podłogi pokoju ze znanej, statycznej pozycji w światowym układzie współrzędnych.
  • Drugi krok: wykryj dolną krawędź obiektu na obrazie i odwzoruj współrzędną piksela na pozycję obiektu w światowym układzie współrzędnych.
  • Trzeci krok: Za pomocą miarki zmierz rzeczywistą odległość od obiektu.

Mogę przesunąć mały obiekt, powtórz te trzy kroki dla każdej współrzędnej piksela i utwórz tabelę odnośników (klucz: współrzędna piksela, wartość: odległość). Ta procedura jest wystarczająco dokładna dla mojego przypadku użycia. Wiem, że jest problematyczne, jeśli istnieje wiele obiektów (obiekt może pokryć inny obiekt).

Moje pytanie: Czy istnieje łatwiejszy sposób utworzenia tego tabeli odnośników? Przypadkowa zmiana kąta kamery o kilka stopni niszczy ciężką pracę. ;)

Być może jest możliwe wykonanie trzech kroków dla kilku określonych współrzędnych pikseli lub pozycji w światowym układzie współrzędnych i wykonanie "kalibracji" w celu obliczenia odległości za pomocą obliczonych parametrów?

+0

Czy jesteś zainteresowany tylko odległością punktów na podłodze? To znaczy. czy interesuje Cię tylko jedna płaszczyzna w przestrzeni 3D? –

+0

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

+2

Schemat pomoże! –

Odpowiedz

2

Większość bibliotek wizyjnych (w tym opencv) ma wbudowane funkcje, które pobierają kilka punktów z ramki odniesienia kamery i powiązanych punktów z płaszczyzny kartezjańskiej i generują dla ciebie macierz osnowy (transformację afiniczną). (niektóre z nich są wystarczająco fantazyjne, aby dołączyć odwzorowania nieliniowości z wystarczającą ilością punktów wejściowych, ale to sprowadza cię z powrotem do czasu, aby skalibrować problem)

Ostatnia uwaga: większość bibliotek wizyjnych używa pewnego rodzaju siatki do kalibracji np. szachownica. Jeśli napisałeś kalibrację, aby przerobić taki arkusz, musisz zmierzyć odległości tylko do jednego obiektu docelowego, ponieważ transformacje zostaną obliczone przez arkusz, a cel po prostu zapewni przesunięcia światowe.

2

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ść.

+0

Dziękuję za link. – Marcello90

5

Jeżeli podłoga jest płaski, jego równanie jest to, że w płaszczyźnie, niech

a.x + b.y + c.z = 1 

we współrzędnych aparat (pochodzenie jest środek optyczny kamery, XY stanowi płaszczyznę ogniskową i Z. kierunek patrzenia).

Następnie promień od środka aparatu do punktu obrazu w pikselach współrzędne (u, v) jest przez

(u, v, f).t 

gdzie f jest ogniskowa.

Promień uderza płaszczyźnie, gdy

(a.u + b.v + c.f) t = 1, 

tjw punkcie

(u, v, f)/(a.u + b.v + c.f) 

Wreszcie, odległość od aparatu do punktu jest

p = √(u² + v² + f²)/(a.u + b.v + c.f) 

Jest to funkcja, że ​​trzeba tworzyć tabele. Zakładając, że f jest znany, możesz określić nieznane współczynniki, pobierając trzy punkty bez wyrównania, mierząc współrzędne obrazu (u, v) i odległości oraz rozwiązując układ równań liniowych 3x3.

Z ostatniego równania można następnie oszacować odległość dla dowolnego punktu obrazu.

Odległość ogniskową można zmierzyć (w pikselach), patrząc na cel o znanym rozmiarze, w znanej odległości. Proporcjonalnie stosunek odległości ponad wielkością wynosi f na całej długości obrazu.

1

Jak już wspomniano w poprzednich odpowiedziach, będziesz potrzebował transformacji rzutowej lub po prostu homografii. Rozważę to jednak z bardziej praktycznego punktu widzenia i postaram się podsumować to krótko i prosto.

Tak więc, biorąc pod uwagę prawidłową homografię, możesz wypaczyć zdjęcie samolotu tak, aby wyglądało, jakbyś wziął go z góry (jak here). Jeszcze prostsze jest przekształcenie współrzędnej piksela obrazu na współrzędne globalne płaszczyzny (tak samo dzieje się podczas odkształcenia każdego piksela).

Homografia jest w zasadzie macierzą 3x3 i przekształcasz współrzędne przez pomnożenie jej z macierzą. Możesz teraz pomyśleć, poczekać na matrycę 3x3 i współrzędne 2D: musisz użyć homogeneous coordinates.

Jednak większość frameworków i bibliotek zrobi to za Ciebie. Musisz znaleźć (przynajmniej) cztery punkty (współrzędne x/y) na swojej planecie/podłodze świata (najlepiej w rogach prostokąta, wyrównane do pożądanego układu współrzędnych świata), zrobić zdjęcie ich, zmierzyć piksel jest współrzędny i przechodzi zarówno do "funkcji szukania homografii" pożądanej wizji komputera lub biblioteki matematyki.

W OpenCV, który będzie findHomography, tutaj example (metoda perspectiveTransform następnie wykonuje rzeczywistą transformację).

W programie Matlab można użyć czegoś od here. Upewnij się, że używasz transformacji rzutowej jako typu transformacji. Rezultatem jest rzutnik tform, który można zastosować w połączeniu z metodą this, aby przekształcić punkty z jednego układu współrzędnych na inny.

Aby przekształcić się w innym kierunku, wystarczy odwrócić homografię i zamiast tego użyć wyniku.