Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

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

atom1477 15 Oct 2007 17:40 3784 25
Tespol
  • #1
    atom1477
    Level 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.
  • Tespol
  • Tespol
  • #4
    Maly
    Level 31  
    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.
  • #5
    Fyszo
    Level 37  
    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.
  • #7
    qrdel
    Level 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ć.
  • #8
    atom1477
    Level 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.
  • #9
    qrdel
    Level 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ę.
  • #10
    Fyszo
    Level 37  
    atom1477 wrote:
    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.
  • #11
    qrdel
    Level 28  
  • #12
    atom1477
    Level 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.
  • #13
    Fyszo
    Level 37  
    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).
  • #14
    atom1477
    Level 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.
  • #15
    atom1477
    Level 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ę.
  • #16
    atom1477
    Level 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.
  • #17
    atom1477
    Level 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.
  • #18
    qrdel
    Level 28  
    No rzeczywiscie.
    A to przecie najstraszniejszy problem robotyki.
  • #19
    Fyszo
    Level 37  
    Przeszkadza ci konstruktywna krytyka?
  • #21
    atom1477
    Level 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".
  • #22
    Fyszo
    Level 37  
    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?
  • #24
    Fyszo
    Level 37  
    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?
  • #25
    atom1477
    Level 43  
    Quote:
    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.
  • #26
    Fyszo
    Level 37  
    Niewidziałem rys1 bo go nie udostepniłeś (sama ramka z nazwą - bez rysunku)