Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Wyznaczanie położenia obiektów 3D za pomocą dwóch kamer.

atom1477 15 Paź 2007 17:40 3412 25
  • #1 15 Paź 2007 17:40
    atom1477
    Poziom 43  

    Chcę w robocie umieścić dwie kamery umieszczone w pewnej odległości od siebie. Obie maja patrzeć do przodu i maja być umieszczone prosto, tak żeby obiekty umieszczone bardzo daleko od nich widziały tak samo. Tak jak oczy u człowieka czy kota itp.
    I robiąc dwa zdjęcia (jedną i druga kamerą) otrzymam dwa różniące się zdjęcia jeżeli tylko na zdjęciu znajdzie się jakiś przedmiot znajdujący się wystarczająco blisko kamer. Im bliżej kamer, tym większa różnica pomiędzy zdjęciami. I teraz chcę zastosować jakiś algorytm który będzie w stanie dysponując tymi dwoma zdjęciami wyznaczyć przeszkody i odległości od nich.
    Problem polega na tym, że nie mam na razie żadnego konkretnego algorytmu. Wiem jak ma działać taki algorytm, ale żadnego konkretnego to nie mam. Algorytm po prostu ma przesuwać jedno zdjęcie względem drugiego, aż jakiś obiekt się na nich pokryje. Ilość pikseli o jaka trzeba przesunąć zdjęcie wyznacza odległość. Nie jest to zależność liniowa, ale jakaś jest i da się to skalibrować. To już mam opanowane, ale nie wiem jak program ma rozpoznawać że jakiś fragment zdjęcia akurat się pokrył. Ja jako człowiek widzę co jest na zdjęciu i mogę ręcznie je przesuwać i widzieć kiedy sie pokryje. Ale nie bardzo wiem jak to rozwiązać programowo. Tym bardziej że na zdjęciu mogą się pojawiać duże pola o identycznym kolorze na całej powierzchni i wtedy taki algorytm się zgubi, bo niezależnie o ile pixeli przesunę jedno zdjęcie, to oba fragmenty na obu fotach nadal będą takie same.
    Próbowałem wyznaczać podobieństwo bloków 8x8 pixeli z różnymi przesunięciami i wybierać takie przesunięcie, przy którym podobieństwo obu bloków z każdego zdjęcia jest maksymalne. I jednocześnie odrzucać takie bloki, w których prawdopodobieństwo jest zawsze małe, niezależnie pod przesunięcia. I wywalać takie, w których podobieństwo jest duże dla kilku przesunięć. Zostawiać tylko takie dla których jest małe, małe, małe i raptem dla jednego konkretnego przesunięcia duże, co powinno oznaczać że dokładnie trafiliśmy w dobre przesunięcie, ale nic z tego nie wyszło.
    Próbowałem nawet porównywać nie bezpośrednio bloki 8x8 pixeli, tylko bloki 8x8 pixeli po przeprowadzeniu transformaty DCT. Nadal efekty żadne.

    Może ktoś robił coś podobnego i może mi pomóc?
    To ma być do robota który będzie jeździł i omijał przeszkody. Ultradźwiękowe i inne rozwiązania mnie nie interesują.
    A duża wymagana szybkość procestora i duże zurzycie pamięci RAM też nie będzie dla mnie problemem.



    Właśnie znalazłem coś na ten temat:
    http://www.agh.edu.pl/uczelnia/tad/Przetwarzanie_obrazow_medycznych/3D-1.ppt

    Spróbuję zobaczyc co to warte.

    0 25
  • #3 17 Paź 2007 13:54
    atom1477
    Poziom 43  

    Niestety w tej książce nie ma ABSOLUTNIE NIC na ten temat co potrzebuję.
    Ja potrzebuję analizy DWÓCH obrazów jednocześnie.

    0
  • #4 17 Paź 2007 16:21
    Maly
    Poziom 28  

    Na Politechnice Łódzkiej powstał projekt robota, który miał rozpoznawać obraz na podstawie różnic obrazów z dwóch kamer. Ale z tego co wiem, algorym był dość skomplikowany i wątpię, aby autor zgodził się go udostępnić. bynajmniej to pracowało i zdawało egzamin.

    0
  • #5 19 Paź 2007 17:29
    Fyszo
    Spec od GSM

    Dopóki nie istnieje technologia dorównująca tkankom biologicznym wszystko co oparte jest o biologiczny sposób identyfikacji nie zda egzaminu. Oko posiada jeszcze coś takiego jak ogniskowanie. I musisz dołożyć jeszcze jedną zmienna 'ogniskową' soczewki kamery. Odległość można wyznaczyć z trójkąta tworzonego z: 1-kamera,2-kamera, obiekt. I przeliczyć kąty patrzenia kamer. Dokładność wykonania powinna byc jak najlepsza. A kamery jak najbardziej oddalone.

    0
  • #6 20 Paź 2007 12:16
    atom1477
    Poziom 43  

    ja wiem jak to liczyć ale nie wiem jak znaleść dwa odpowiadające soebie obiekty na dwóch zdjęciach. Czy Wy wogóle przeczytakiście moje pytanie?

    0
  • #7 20 Paź 2007 15:59
    qrdel
    Poziom 28  

    Zacznij pisać po polsku, to może uwierzymy że potrafisz przeczytać ze zrozumieniem.

    W rzeczywistym świecie potrzebujesz mózgu małpy wstawionego do pojazdu, żeby się orientował.
    Najpierw potrzebny jest "feature detector", proces wyróżniania obiektów z tła, dopiero potem możesz określać ich położenie.
    Proponuję pewne ułatwienia: Całe otoczenie jasno-szare (białe + cienie) a na nielicznych przeszkodach średnio duże czarne kropy.

    Algorytm:
    1. w obrazie jednej kamery znaleźć kropę.
    2. z obrazów obu kamer wyciągnąć po parę linii poziomych (zakładam że kamery rozstawione w poziomie) i uśrednić dane w pionie, w wyniku wychodzą 2 funkcje zależności jasności od przesunięcia.
    3. Znaleźć różnicę położenia kropy na obu obrazach (można potraktować jako różnicę fazy dwóch sygnałów)

    To oczywiście zgrubne pomysły ad hoc , ale chyba realne. Potem możesz w białym świecie wszystkie obiekty malować w pionowe czarne paski (albo tylko krewędzie).

    Zresztą może prościej odwrotnie, w czarnym, wyciemnionym pustym pomieszczeniu z "sufitu" wiszą jedynie żarówki (diody) a robot ma je omijać.

    0
  • #8 22 Paź 2007 03:32
    atom1477
    Poziom 43  

    Niestety takie "uproszczenia" są nie do przyjęcia.
    A jak kamery zobaczą kilka kropek to skąd algorytm ma wiedzieć która kropka to która? To już łatwiej jest rozpoznawać rzeczywiste przeszkody bo one przynajmniej w 99% będą się różniły od siebie.
    Jak już mam dawać kropy to wystarczy jedna kamera a odległość będzie się wyznaczało z wielkości kropy. Ale mi nie o to chodzi.

    0
  • #9 22 Paź 2007 19:39
    qrdel
    Poziom 28  

    No cóż, przy takim podejściu wiele nie pomogę.
    Piękną jest cecha wielkomyślności pozwalająca porywać się na wielkie dzieła, ale tylko w połączeniu z realnym spojrzeniem nie naraża na śmieszność.
    Poczytaj o budowie i funkcjonowaniu siatkówki ((i to raczej nie u człowieka a u muchy [tzn. u niej to oka złożonego]) , można tam znaleźć ciekawe patenty i to już ewolucyjnie przetestowane.
    ---
    A jednak dobrze pamiętałem, muchy mają siatkówkę.

    0
  • #10 22 Paź 2007 20:21
    Fyszo
    Spec od GSM

    atom1477 napisał:
    Niestety takie "uproszczenia" są nie do przyjęcia.
    A jak kamery zobaczą kilka kropek to skąd algorytm ma wiedzieć która kropka to która? To już łatwiej jest rozpoznawać rzeczywiste przeszkody bo one przynajmniej w 99% będą się różniły od siebie.
    Jak już mam dawać kropy to wystarczy jedna kamera a odległość będzie się wyznaczało z wielkości kropy. Ale mi nie o to chodzi.


    Nawet ten sam obraz z 2 innych kamer będzie inny. Różnice w rozrzucie parametrów musisz skorygować, co spowoduje utrate części szczegółów. Procesorek w myszce optycznej obrabia tylko 48 pikseli a u ciebie prawdopodobnie 2xVGA. Nawet jak napiszesz program to nie bedzie działał w czasie rzeczywistym.

    0
  • #11 22 Paź 2007 20:52
    qrdel
    Poziom 28  

    Jeśli chodzi o algorytmy to załączam parę "na szybko" wybranych artykułów o realnie działających systemach:

    na wstęp proponuję:

    http://www.jneurosci.org/cgi/reprint/13/11/45...INDEX=0&sortspec=relevance&resourcetype=HWCIT

    a potem drobniejsze szczegóły

    http://jn.physiology.org/cgi/reprint/86/2/950

    http://jn.physiology.org/cgi/reprint/77/3/1487

    http://www.nyu.edu/projects/desplan/papers/2004%20Wernet%20review%20Trends%20Cell%20Biol.pdf

    http://www2.cnrs.fr/en/582.htm

    http://www.jgp.org/cgi/reprint/97/4/777.pdf

    http://www.pubmedcentral.nih.gov/picrender.fcgi?artid=1691462&blobtype=pdf

    http://jn.physiology.org/cgi/reprint/77/3/1487

    http://www.jneurosci.org/cgi/reprint/19/3/1122

    http://www.jneurosci.org/cgi/reprint/15/8/559...INDEX=0&sortspec=relevance&resourcetype=HWCIT

    http://www.jneurosci.org/cgi/reprint/22/8/322...INDEX=0&sortspec=relevance&resourcetype=HWCIT

    http://www.jneurosci.org/cgi/reprint/19/18/80...INDEX=0&sortspec=relevance&resourcetype=HWCIT

    http://www.jneurosci.org/cgi/reprint/26/30/78...INDEX=0&sortspec=relevance&resourcetype=HWCIT

    http://www.jneurosci.org/cgi/reprint/11/9/276...NDEX=30&sortspec=relevance&resourcetype=HWCIT

    http://www.jneurosci.org/cgi/reprint/25/46/10...NDEX=20&sortspec=relevance&resourcetype=HWCIT

    http://www.jneurosci.org/cgi/reprint/25/15/39...NDEX=20&sortspec=relevance&resourcetype=HWCIT

    http://www.pubmedcentral.nih.gov/picrender.fcgi?artid=1691254&blobtype=pdf

    życzę powodzenia w kodowaniu ;-)

    0
  • #12 23 Paź 2007 13:52
    atom1477
    Poziom 43  

    Niestety nie mam tam nic konkretnego. A ju na pewno nie o stereoskopii.
    A algorytmów to chyba w ogule tam nie ma. Teoria tylko.
    Algorytm to lista KONKRETNYCH kroków do wykonania a nie ogólne stwierdzenia.
    Ja sam rozkminiam angorytm i powoli zaczynam mieć już jakies efekty. Zasada działania jest taka jak napisałem w moim pierwszym poście.

    0
  • #13 23 Paź 2007 15:00
    Fyszo
    Spec od GSM

    Wyobraź sobie że pół zdjęcia masz drzewo w odległości 100m i drugie pół kawałek płotu z odległości 1m. Poza tym nic więcej nie ma, ostrość i kontrast znakomite. Czy twój robot ominie płot czy na niego wjedzie. Tylko nie pisz że ominie, napisz lepiej dlaczego. Co z sytuacją gdy zasłonisz jedna kamerę (np. tym płotem).

    0
  • #14 23 Paź 2007 15:46
    atom1477
    Poziom 43  

    Przed kamerami bedzie szyba w pewnej odleglości po to żeby nie dąło się zasłonic jednej kamery. Szybę się walnie w takiej odległości w jakiej algorytm już bedzie w stanie wyznaczyc poprawnie odległość.
    Kamery bedą gdzieś 10cm od siebie więć zdjęcia z drzewem i płotem beda wyglądały tak jak na rysunku "bez tytułu.gif".
    Drzewo bedzie prawie nie przesunięte a płot mocno przesunięty.

    0
  • #15 23 Paź 2007 16:09
    atom1477
    Poziom 43  

    Ładniej tego nie chce mi się rysować więc przedstawię to na realnych efektach jakie uzyskałem.
    Rysunek 2 to oryginalny obraz z lewej kamery. Prawego juz nie zamieszczam.
    Rysunek 3 to obraz różnicowy.
    A Rysunek 1 to efekt porównywania jednego konkretnego bloku o rozmiarze 16x16 pixeli.
    Jak widać maximum podobieństwa występuje dla jednego konkretnego przesunięcia i to przesunięcie wyznacza odległość.
    Na razie nie pokażę jak wygląda całkowicie końcowy efekt bo jeszcze nie zrobiłem printscreena.
    Podeślę go za jakiś czas.

    Oczywiście w realu to algorytm robi na surowych danych (BMP) a nie na GIFach.
    W dodatku kamery mają wyłączoną wszelką automatykę oczywiście.
    A w zasadzie to kamer jeszcze nie mam. Zdjęcia zrobiłem cyfrówką z dwóch miejsc.
    I oczywiście algorytm nie poradzi sobie z obiektami umieszczonymi zbyt blisko kamer i dlatego wstawię tą szybę o której juz wspominałem.
    Algorytm podaje odległość tylko wtedy gdy znajdzie jedno konkretne maximum podobieństwa.
    Jak nie ma jednego konkretnego maximum (Tak jak na "bez tytułu 2.gif) to w danym miejscu na zdjęcie podaje błąd.
    I udało mi się naprawić algorytm żeby dosyć rzadko zwracał taki wynik. Zrobiłem to delikatnie rozmywając zdjęcia przed obliczeniami i stosując jeszcze kilka dużo bardziej skomplikowanych sztuczek.
    I na koniec odpowiedz dlaczego robot ominie płot: Bo jak uda mu się znaleźć odległość od płotu to będzie wiedział gdzie on jest. Odległość se policzy a kąt juz zna z położenia na zdjęciu. A jak nawet nie uda mu się znaleźć odległości to zwróci błąd i robot w ogóle nie zacznie jechać.
    Nie zdarzyło mi się jeszcze żeby algorytm dał zły wynik. Najgorszy efekt to niemożliwość podania odległości.
    Jeżeli już naprawdę zasłonię jedna kamerę to efekt będzie taki jak na "bez nazwy 2.gif" czyli algorytm nie poda odległości i robot nie ruszy. Ewentualnie ruszy do tyłu albo sie obróci w miejscu i zrobi nowe zdjęcia z innej pozycji. Jeszcze nie wiem jak rozwiąże taką sytuację.

    0
  • #16 23 Paź 2007 16:26
    atom1477
    Poziom 43  

    A co do korekcji parametrów dwóch kamer to sie zgadzam. To nie będzie trudne i wiem jak to zrobić.
    A jak wspomniałem na wstępie duże zużycie procesora mi nie przeszkadza. Wstawię ARM7 albo 9 i po sprawie. Wyrobi się w czasie rzeczywistym.

    0
  • #17 24 Paź 2007 17:13
    atom1477
    Poziom 43  

    A Ty [b] Fyszo [\b] to sie czepiasz.
    A jak kotu zasłonie jedno oko to co? Też straci możliwość widzenia stereoskopowego. Oczywiście zostanie mu jeszcze ocena odległości na podstawie ostrości i na podstawie zapamiętanej wielkości obiektów. A w dodatku może zrobić coś głupiego, na przykład się cofnąć jak się przestraszy że mu sie jedno oko zasłoniło i na przykład wejść na coś gorącego i się poparzyć. A robot przynajmniej nie będzie taki głupi i jak nic nie wyjdzie w wyznaczania odległości to sie nie ruszy. Podobnie człowiek. Choć jest 1000 razy mądrzejszy od kota to też z stereoskopowego widzenia nici bez jednego oka. Dwa obrazy to podstawa podstaw w takim widzeniu tak jak zasilanie urządzeń elektronicznych w elektronice. To tak jak byś się czepił: "A co jak odłączę zasilanie?" A to samo jak nie dam kotu jeść, czyli długo nie powidzi. To w tym znaczeniu żadna wada robota że bez jednego oka nie oceni odległości.
    A ta szyba to tylko polepszy i możliwe że dzięki niej nie da się zakryć tylko jednej kamery w przeciwieństwie do możliwości zakrycia tylko jednego oka u kota.
    Chodzi o to że gdy szyba będzie wystarczająco daleko od kamer to zanim całkowicie zakryję jedną kamerę to druga zdąży zobaczyć przynajmniej częściowo obiekt którym zakrywam pierwszą kamerę i da radę wyznaczyć odległość a jak nawet nie to przynajmniej się zorientuję że zakrywam. Bez szyby możliwe by było zakrycie tylko jednej kamery a wtedy robot nie był by w stanie odróżnić całkowitego zakrycia jednej kamery od uszkodzenia kamery czy czegoś podobnego.
    Więc w największym skrócie robot z szybą będzie lepszy od kota. Może i nie znajdzie wszystkich obiektów ale nie da się nabrać na zakrycie jednej kamery.

    Do [b] Kurdel: [\b]
    A pomysł ze znajdywaniem dwóch kropek to też nic ciekawego bo nie podałeś algorytmu znajdywania kropek.

    Chyba zamienimy się miejscami (ja ze wszystkimi). Zaczynam mieć mniej więcej jakieś postępy więć chyba to ja bedę teraz odpowiadał na Wasze pytania.

    0
  • #18 25 Paź 2007 00:22
    qrdel
    Poziom 28  

    No rzeczywiscie.
    A to przecie najstraszniejszy problem robotyki.

    0
  • #19 25 Paź 2007 07:09
    Fyszo
    Spec od GSM

    Przeszkadza ci konstruktywna krytyka?

    0
  • #20 25 Paź 2007 11:33
    atom1477
    Poziom 43  

    Nie ale wolę jak krytyka jest sensowna.

    0
  • #21 25 Paź 2007 21:41
    atom1477
    Poziom 43  

    A oto zapowiadane efekty.
    Na rysunku 1 widać efekt działania programu. Na dużej części okna programu widać widok od przodu. Kolor oznacza odległość według kolorowej skali na dole. Skala jak na razie jest zrobiona tak na pałe. Ale im bliżej czerwono tym dalej, choć może nie dokładnie w takiej samej skali jak to narysowałem. Na małej część okna widać widok od góry. Kolory też oznaczają odległość ale są zbędne bo z góry i tak widać odległość.
    Na rysunku 2 widać jak mniej więcej były naprawdę rozmieszczone obiekty (format "LA").
    1, 2, 9 - Butelki.
    3 - Oscyloskop.
    4 - Biurko.
    5 - Łóżko.
    6 - Krzesło (z pokazanymi nogami).
    7 - Klamka na ścianie.
    8 - Gniazdko na ścianie.

    Jak widać algorytm wywalił bardzo dużo czarnego koloru. To znaczy że nie poradził sobie z wyznaczeniem odległości w tych miejscach. Pisałem że program juz bardzo rzadko wywala czarny kolor. I taka ilość jak na rysunku 1 jest dla mnie juz małą ilością, bo program wykrył wszystkie obiekty.

    Naprawdę to co widać na zdjęciach z kamer jest trochę w innym "formacie". Jak przesuwam się w lewo po zdjęciu to oznacza że obiekty nie idą liniowo na lewo tylko oznacza że kąt idzie liniowo na lewo. Mam nadzieję że zrozumiale to napisałem. I dlatego wyniki pomiarów wymagają konwersji. Rysunek 2 narysowałem w formacie LA żeby łatwiej było porównać rzeczywiste rozmieszczenie obiektów z wynikami działania programu.
    Rysunek 3 przedstawia rozmieszczenie obiektów w formacie XY. I takie właśnie przekształcenie (Z LA do XY) trzeba będzie jeszcze dodać do programu aby ładnie wyświetlać widok z góry. To znaczy wyświetlać widok z góry w postaci XY a nie LA.
    XY - Odległość w osi X, Przesunięcie w osi Y.
    LA - L, Alfa (Odległość, Kąt widzenia).
    Tak nie jest źle ale dokonanie konwersji ułatwi analizę wyników przez człowieka.

    Te dwa formaty XY i LA to tak dła "ułatwienia". Ten format LA to nie jest gorszy od XY ale nie chciało mi się pisać procedur co to ładnie narysują i dlatego dane w postaci Odległość, Kąt narysowałem jako zwykłą prostokątną bitmapę bez przeliczania kątów i stąd konieczność wprowadzenia takich "formatów".

    0
  • #22 26 Paź 2007 07:24
    Fyszo
    Spec od GSM

    Nazywaj rzeczy po imieniu - układ kartezjański i układ biegunowy.

    PS. Jak ci się udało otrzymać ścianę na rysunku skoro nie powinna reagować na twój algorytm. I te zdjęcia to robiłeś z góry?

    0
  • #23 26 Paź 2007 12:21
    atom1477
    Poziom 43  

    Ściana nie reaguje na algorytm.
    A algorytm reaguje na ścianę bo są na niej charakterystyczne obiekty takie jak drzwi i gniazdko.
    Zdjęcia robiłem z boku. A gdzie widać że są z góry?

    0
  • #24 26 Paź 2007 12:49
    Fyszo
    Spec od GSM

    Słuchaj: wyjaśnij co to za zdjęcia, bo na nich masz widoczną płaską ścianę której twój agorytm w takim stanie jak podałeś nie jest w stanie określić (bo obie kamery widzą identyczny obraz). Rzut zdjęć jest z góry, poddawałeś go obróbce?

    Druga sprawa to jakim sposobem na rysunkach wychodzą ci takie ładne kółeczka po butelkach skoro kamerujesz z jednej strony?

    0
  • #25 26 Paź 2007 13:40
    atom1477
    Poziom 43  

    Cytat:
    Rysunek 2 narysowałem w formacie LA

    Rysunek 2 i 3 narysowałem sam żeby można było zobaczyć że algorytm wykrył jakieś obiekty mniej więcej tam gdzie były butelki i inne bajery.
    Ścianę też narysowałem sam bo te rysunki przedstawiają realne rozmieszczenie obiektów a nie efekt dzialania algorytmu.
    Efekt działania algorytmu jest na rysunku 1. Tam nie ma żadnej ściany tylko kupa kwadratów mniej więcej tam gdzie ona jest w realu.
    Kamery nie widzą identycznych obrazów. Widziały by gdyby obiekty były nieskończenie daleko (albo przyjanmniej bardzo daleko) od kamer a tak nie jest.

    0
  • #26 26 Paź 2007 13:52
    Fyszo
    Spec od GSM

    Niewidziałem rys1 bo go nie udostepniłeś (sama ramka z nazwą - bez rysunku)

    0