2. System wizyjny
Opracowany system wizyjny bazuje na aplikacji stworzonej w środowisku Visual C++ i współpracującej z kamerą internetową USB firmy Logitech.
Rys. 3. System wizyjny
Na wyjściu kamery USB z matrycy półprzewodnikowej fotoelementów otrzymujemy cyfrowy obraz otoczenia w postaci dwuwymiarowego rastra o 320 kolumnach i 240 wierszach. Każdy element rastra tzw. piksel jest reprezentowany przez 3 bajty informacji odpowiadające standardowi RGB (Red Gren Blue). Sygnał z kamery trafia przez interfejs USB do komputera, gdzie tworzona jest bitmapa obrazu, która zapisywana jest w pamięci za pomocą kontrolki ActiveX użytej w aplikacji w postaci macierzy
B = [bij]
o wymiarach 320x240 gdzie bij jest 24 bitową skalą kolorów. Na podstawie otrzymanego obrazu sceny roboczej należy dokonać identyfikacji obiektów ( robota, przeszkód oraz obiektu „celu” ), a następnie określić ich położenie określenie ich położenia i orientacji w układzie bazowym, a następnie przekazanie tablicy z informacjami o obiektach do systemu sterowania. Tak wyznaczone parametry są następnie przekazywane do systemu sterowania.
Identyfikacja obiektów na scenie roboczej jest przeprowadzana w kilku etapach:
- wstępna filtracja zapisanego obrazu
- wyodrębnianie obiektów:
- na podstawie histogramu bitmapy lub
- krawędziowanie i konturowanie
- wyznaczenie kształtu oraz orientacji robota
- zapisywanie informacji o obiektach w postaci wektorów
2.1. Wstępna filtracja Ze względu na niedoskonałość układu optycznego użytej kamery, histogram obrazu tła jednolitego białego reprezentuje funkcja paraboliczna rys. 4. W celu uzyskania równomiernie jasnego obrazu należy przeprowadzić wstępna filtrację oraz tzw. wyrównywanie obrazu.
Rys. 4. Histogram obrazu z kamery tła jednolitego
Zastosowanie filtru korekcyjnego pozwala na „wyrównanie” histogramu. Filtr ten wyznacza współczynnik korekcyjny alfa dla całej bitmapy (oddzielnie dla każdego koloru) przez zsumowanie jasności wszystkich pikseli i podzieleniu ich przez ich ilość wg wzoru:
Następnie odległość od środka rozpatrywanego punktu w danej chwili jest mnożona przez współ. i dodawana do wartości piksela. W przypadku, gdy jest przekraczana dozwolona wartość 255 automatycznie jest ona obcinana i zapisywana pod tym samym adresem w bitmapie.
Współczynnik korekcyjny może być również dowolnie modyfikowany przez system wizyjny co pozwala na dostrajanie i automatyczną konfigurację systemu w wypadku zmiany warunków działania systemu np. oświetlenia.
Tak modyfikowany obraz sceny pozwala na dalszą obróbkę bitmapy.
2.2. Obróbka obrazu 2.2.1. Przetwarzanie na podstawie histogramu Wiedząc o tym, że każdy obraz możemy zapisać w postaci wykresu tzw. histogramu rys. 5 w łatwy sposób jesteśmy wstanie przypisywać obiektom na scenie roboczej ich własne poziomy jasności przez co łatwo je identyfikować. Problem, który pojawia się przy tej metodzie zdobywania informacji to możliwość przesunięcia się poziomu jasności przypisanego np. do robota. Rozwiązaniem może okazać się przedział, w którym badany obiekt będzie się zawierał.
Rys. 5. Przykładowy histogram
Metoda ta jednak wymaga kamery, o jak najlepszej jakości dostarczanego obrazu z odpowiednio dużym współczynnikiem kontrastu, gdyż obiekty na histogramie ulegają rozmyciu przez co ich granice nie są jednoznacznie reprezentowane.
2.2.2. Przetwarzanie na podstawie różnicowania obrazów W celu polepszenia obróbki obrazu i jego jakości została wykorzystana metoda różnicowania bitmapy. Pobierana bitmapa z pustej planszy, a obraz wynikowy przekazywany dalszym funkcjom jest wynikiem różnicy tej bitmapy oraz bitmap pobieranych z kamerki na bieżąco.
W następnej kolejności wyliczane są średnie wartości składowych poszczególnych kolorów na całym obrazie, a wszystkie punkty, których poszczególne składowe kolorów niewiele odbiegają od wartości średnich zamieniane są na punkty całkowicie czarne. W ten sposób usuwane jest tło. Następnie powstały obraz jest próbkowany co cztery piksele w pionie i poziomie. Punkty tła nie są brane pod uwagę więc powstały zbiór tworzy kształt przedmiotów na planszy.
Aby wyodrębnić poszczególne obiekty brany jest najniżej położony punkt i sprawdzane są wszystkie jego połączenia z pozostałymi punktami. Połączenia nie ma w chwili gdy między porównywanymi punktami znajduje się chociaż jeden czarny punkt. Wszystkie punkty które mają połączenie z tym najniżej położonym tworzą jeden obiekt. Procedura ta jest powtarzana aż do wyczerpania wszystkich punktów, z tym że za każdym razem rozpatrywany zbiór punktów jest pomniejszany o rozpoznany obiekt.
Wobec każdego rozpoznanego obiektu stosowany jest algorytm znajdowania powłoki wypukłej. Ma on na celu opisanie zbioru punktów za pomocą wielokąta wypukłego, którego wierzchołkami są właśnie punkty tego zbioru.
Rys. 6. Powłoka wypukła znajdowanego obiektu
Odbywa się to w następujący sposób:
1. wybierany jest najniżej położony punkt zbioru (który wyznaczony był już na potrzeby poprzedniego algorytmy) i oznaczany jako pierwszy,
2. wszystkie pozostałe punkty tworzące obiekt są sortowane według tangensa kąta jaki tworzy linia pozioma i połączenia tych punktów z punktem pierwszym,
3. kolejny punkt jest dodawany na próbę do powłoki wypukłej,
4. sprawdzane są wszystkie punkty wstecz w powłoce, i usuwane te, które razem ze swoim punktem poprzedzającym opisują taką prostą, która rozdziela punkt nowo dodany od punktu pierwszego,
Rys. 7. Znajdowanie punktów obiektu
Tak rozdzielone i opisane obiekty można rozpoznawać po kolorach. W pierwszej kolejności znajdowany jest obiekt zaznaczony jako cel, następnie robot, a pozostałe obiekty to przeszkody. Badany przedmiot o danym kolorze najlepiej rozpoznaje się po kolorach przeciwnych, np. kolor czerwony zawiera najmniejszą składową zieloną. Rozpoznane przedmioty zaznaczane są na mapie rastrowej o rozdzielczości 40 x 30, która jest używana do wyznaczana trasy za pomocą algorytmu czoła fali prostokątnej. Polega on na tym, że kratka, w której znajduje się cel, oznaczana jest wybraną wartością całkowitą, wszystkie kratki w bezpośrednim sąsiedztwie mają przyznawaną wartość mniejszą o jeden, a wszystkie położone o dwie kratki dalej mają wartość mniejszą o dwa itd. Przeszkody muszą być oznaczone najmniejszą wartością występującą na mapie. Zaczynając z dowolnego miejsca, aby wyznaczyć trasę wystarczy jako następny punkt wybierać rastry o wartości większej niż raster pozycji aktualnej. W celu optymalizacji z trasy można wyeliminować punkty leżące wewnątrz jednej prostej.
2.2.3. Przetwarzanie przez konturowanie Pierwszym krokiem przy tej metodzie jest rozmycie obrazu, w celu usunięcia szumów przez użycie splotu obrabianego obrazu z macierzą filtra w tym wypadku w postaci:
Tab. 1 Filtr górno przepustowy
Wyniki dla każdego piksela są dzielone przez współczynnik korekcyjny równy 36 i następnie zapisywane do bitmapy. W celu uzyskania krawędzi obiektów należy zastosować filtr do wykrywania krawędzi obrazu przy pomocy dwóch macierzy (filtry Prewitta):
Tab. 2 Filtry Prewitta do wykrywania krawędzi poziomych a) i pionowych b)
Dla tych macierzy suma elementów wynosi 0, więc nie dzielimy wyniku. Ostateczny kolor piksela jest pierwiastkiem kwadratowym z sumy kwadratów kolorów uzyskanych przy pomocy obydwóch macierzy.
Ostatnim etapem filtracji jest rozmycie obrazu macierzą
Tab. 3 Filtr rozmywający
i podzieleniu wyniku przez współczynnik korekcyjny równy 9 w celu usunięcia nieciągłości konturów, które mogą uniemożliwić działami algorytmów rozpoznawania kształtu.
Kolejną czynnością, którą musi wykonać system wizyjny jest znalezienie konturu obiektu. Przeglądanie elementów obrazu należących do konturu wykonuje się obierając jakąś drogę, zawsze to musi być droga zamknięta. Algorytm można opisać z punktu widzenia obserwatora przechodzącego wzdłuż elementów obrazu należących do zbioru i wybierającego najbliższy, dostępny element z prawej strony. Element początkowy znajduje się różnymi metodami obejmującymi przeglądanie płaszczyzny z góry na dół z lewa na prawo. Szukanie kończy się, gdy elementem bieżący jest taki sam jak początkowy. Algorytm należy zastosować jednorazowo do konturu zewnętrznego jak i do dziury obszaru.
W praktyce działa to tak:
Rys. 8. Początkowy obraz sceny roboczej
Rys. 9. Obraz po odfiltrowaniu szumów i pozostawieniu jedynie składowej zielonej
Rys. 10. Obraz po konturowaniu
Rys. 11. Finalny efekt działania filtrów i algorytmów rozpoznawania kształtów i kierunku
2.3 Wyznaczanie kształtu i orientacji robota
2.3.1. Rozpoznanie kształtu Rozpoznawanie kształtu po przefiltrowaniu obrazu polega na wyborze zbioru punktów ze zbioru wszystkich punktów opisujących figurę geometryczną, wyliczeniu średniej arytmetycznej ich współrzędnych jako środka figury, oraz sprawdzeniu ich odległości od tego środka i odchyłki od prawdopodobnego promienia wyliczonego jako połowa różnicy współrzędnych skrajnych punktów.
Rys. 12. Metoda rozpoznania kształtu obiektu
2.3.2. Rozpoznanie orientacji Rozpoznawanie półkola wewnątrz dużego koła polega na wybraniu skrajnych punktów ze zbioru punktów opisujących tą figurę i wyliczeniu sinusa kąta wewnętrznego powstałego trójkąta.
Rys. 13. Metoda rozpoznania orientacji robota
Jeżeli przyjmiemy, że po prawej stronie dużego koła znajduje się półkole i jest to kierunek zgodny z ruchem robota to, jeżeli sinus kąta zaznaczonego na rysunku jest ujemny, to znaczy, że wektor kierunku ruchu robota jest przeciwny niż wektor . Natomiast jeżeli sinus jest dodatni to wektor kierunku jest zgodny z wektorem .