Biblioteka OpenCV na Androida - Szybki start
OpenCV na Androida - wprowadzenie
Aby możliwa była integracja biblioteki OpenCV ze środowiskiem Eclipse IDE wymagane jest pobranie i instalacja niektórych składników takich jak:
- Najnowsza wersji OpenCV kompatybilna z platformą Android, która jest dostępna tutaj:
http://sourceforge.net/projects/opencvlibrary/files/opencv-android/ - Sun Java Development Kit 6 przystosowana do odpowiedniego systemu operacyjnego komputera, na którym będzie tworzona aplikacja.
http://www.oracle.com/technetwork/java/javase/downloads/index.html - Najnowsza wersja Android SDK do tworzenia aplikacji pod Android OS.
http://developer.android.com/sdk/index.html - Środowisko programistyczne Eclipse IDE
http://www.eclipse.org/downloads/ - Wtyczka ADT dla środowiska programistycznego Eclipse IDE.
Szczegółowe instrukcje dotyczące instalacji dostępne na stronie:
http://developer.android.com/sdk/installing/installing-adt.html
Jeśli wszystkie z powyższych składników zostały wypakowane z archiwów i zainstalowane w systemie należy uruchomić środowisko Eclipse. Przy uruchomieniu należy określić nową przestrzeń roboczą na dysku.
Następnie jeśli wtyczka ADT została pomyślnie zainstalowana należy się upewnić czy w ustawieniach została dodana ścieżka do Android SDK. W tym celu należy wybrać w pasku ustawień środowiska Eclipse zakładkę Window ►Preferences ► Android i w miejscu, gdzie widnieje napis "SDK Location" wybrać miejsce, w którym został zainstalowany pakiet Android SDK. Jeśli wszystko zostało wybrane prawidłowo to okno programu powinno wyglądać następująco.
Kolejnym krokiem jest wejście w ustawienia "Android SDK Manager" w celu wybrania wersji Android API. Minimalna wersja interfejsu do jakiej przystosowana jest biblioteka OpenCV dla platformy Android to API w wersji nr. 8, lecz zalecana wersja to wersja nr. 11 lub wyższa. Aby pobrać i zainstalować wybrany interfejs programistyczny należy przejść do zakładki Window ►Android SDK Manager. W oknie, które się ukaże należy dokonać wyboru odpowiedniej wersji interfejsu oraz zaznaczyć kategorię "Tools", a następnie zainstalować pakiety.
Następnym krokiem jest przystąpienie do importu biblioteki OpenCV wraz z projektem aplikacji do przestrzeni roboczej. Aby tego dokonać należy przejść do zakładki File ►Import ► General ► Existing Projects into Workspace i przycisnąć "Next". W kolejnym oknie należy podać miejsce gdzie znajduje się katalog z biblioteką OpenCV w miejscu "Set root directory". Po wybraniu katalogu głównego pod spodem pojawią się wszystkie projekty środowiska Eclipse, które zostaną zaimportowane.
Możliwe, że po zaimportowaniu wybranych projektów środowisko Eclipse wykryje błędy. Należy wówczas sprawdzić czy biblioteka OpenCV została dołączona do projektów. Aby to zweryfikować należy wejść do właściwości projektu Properties ►Android i w sekcji "Library" dodać zaimportowany projekt zawierający kod źródłowy biblioteki OpenCV. Powinno to wyglądać podobnie jak na rysunku pod spodem - tzn. biblioteka powinna być odznaczona zielonym znacznikiem. Warto także "odświeżyć" wszystkie projekty poprzez zakładkę Project ►Clean ►Clean all.
Jeśli wszystkie projekty zostały załadowane pomyślnie i nie występują żadne błędy, wówczas można przejść do uruchomienia wybranego projektu. Jeśli uruchamiamy aplikację po raz pierwszy ukaże się okno trybu uruchomienia aplikacji należy wtedy wybrać z dostępnych trybów opcję "Android Application".
Po uruchomieniu aplikacji w emulatorze urządzenia z systemem Android programista powinien ujrzeć tego typu widok jak na rysunku pod spodem. Widać na nim biało-czarną szachownicę z poruszającym się po niej zielonym kwadratem. Jest to spowodowane tym, że program emulujący urządzenie nie ma możliwości przechwytywania obrazu z kamery internetowej albo z innego źródła, dlatego w całości nie jest możliwe przetestowanie takiej aplikacji na emulatorze urządzenia. Do uruchomienia aplikacji należy posiadać urządzenie typu smartfon lub tablet z zainstalowanym systemem operacyjnym Android OS w wersji przynajmniej 2.2 (API 8) lub nowszej.
Biblioteka OpenCV
penCV jest otwartą biblioteką funkcji wykorzystywanych podczas obróbki obrazu. Stworzona została w językach C i C++ i pozwala na korzystanie z wielu udogodnień związanych z szeroko pojętą dziedziną wizji komputerowej.
Początki OpenCV wiążą się z firmą Intel, słynącą na całym świecie z produkcji procesorów. Prowadzono w niej wiele badań dotyczących aplikacji wykorzystujących skomplikowane obliczeniowo algorytmy - między innymi związanych z grafiką komputerową. Pracownicy Intela odwiedzali w tamtym czasie wiele ośrodków badawczych na całym świecie zajmujących się przetwarzaniem obrazów i doszli do pewnych spostrzeżeń. Wynikało z nich, że różne ośrodki naukowe prowadzące badania na podobny temat budowały biblioteki na własny użytek służące do przetwarzania obrazu, które nie były do końca usystematyzowanymi implementacjami. Biorąc pod uwagę to spostrzeżenie firma Intel zainteresowała się projektem stworzenia uniwersalnej, otwartej biblioteki do badań związanych z tematyką wizji komputerowej. W roku 1999 podjęto prace w tym kierunku. Bibliotekę miała cechować wysoka wydajność, czytelność kodu oraz przede wszystkim otwartość. Dopiero w roku 2007 powstała pierwsza finalna wersji tej biblioteki i od tego czasu cieszy się niesłabnącym uznaniem. OpenCV jest nadal rozwijana i dopracowywana, a przy tym pozostaje otwarta i całkowicie darmowa nawet do celów komercyjnych.
Warto też wspomnieć, że biblioteka OpenCV jest projektowana z myślą o przenośności na różne platformy. W rzeczywistości można ją uruchomić na platformach Windows, Linux, MacOS, BSD, Solaris, Android OS, iOS i innych. Warto też wspomnieć, że istnieją także alternatywne interfejsy programistyczne, które pozwalają na używanie funkcji biblioteki pisząc w językach : Java, C#, Python, Ruby i innych. Możliwe jest także zintegrowanie OpenCV z pakietem Matlab.
Celem stworzenia biblioteki OpenCV było dostarczenie prostego w użyciu, a zarazem potężnego narzędzia, na bazie których programiści mogliby w sposób relatywnie szybki tworzyć zaawansowane projekty z dziedziny wizji komputerowej. Rezultatem tego założenia jest na dzień dzisiejszy ponad 500 funkcji, które oferuje OpenCV programistom związanym z grafiką komputerową. Funkcje te dotyczą np.: operacji na histogramach, określania konturów, wykonywania różnych operacji na obrazach (operacje logiczne, splot, zmiana przestrzeni kolorów itp.), segmentacji obrazu, śledzenia ruchów obiektów, przechwytywania strumienia obrazów z kamer, projekcji i wizji 3D, uczenia maszynowego (mechanizmów wspomagania automatycznym przekształcaniem danych w informacje - bazujące przede wszystkim na statystycznym dopasowaniu wzorców oraz klasteryzacji).
Jak wspomniano wcześniej, biblioteka OpenCV została stworzona w językach C i C++, dlatego najlepsza wydajność zapewniona jest jeśli aplikacja, wykorzystująca OpenCV, pisana jest w tych językach. Twórcy biblioteki chcąc zapewnić jej przenośność, stworzyli także alternatywne interfejsy programistyczne, które pozwalają na wykorzystanie funkcji biblioteki w innych językach programowania i dostosowanie ich do innych platform. Działają one na zasadzie funkcji lub klas opakowujących (ang. wrapper), które zapewniają wywołanie odpowiednich metod biblioteki bazowej oraz konwersje typów argumentów. Programiści urządzeń mobilnych Android OS chcący wykorzystać bibliotekę OpenCV mogą tworzyć aplikacje w dwojaki sposób albo zdecydować się na skorzystanie z klas opakowujących, albo pisać kod źródłowy w języku C++. Twórcy Androida zalecają programowanie przy wykorzystaniu Android SDK (tak jak to zostało opisane w artykule "Jak zacząć z OpenCV na Androidzie"), czyli w języku Java, aniżeli w Android NDK, jednak decyzja należy w tym wypadku do programisty. Wybór języka C++ jest najbardziej uzasadniony w przypadku gdy programista dysponuje już kodem C++, wtedy może on spróbować uruchomić taki kod na platformie Android. Programiście, który zaczyna pisanie programu od początku w Androidzie, wygodniej będzie napisać aplikację w języku Java z wykorzystaniem klas opakowujących, gdyż wywołania metod tych klas są przetestowane i wolne od błędów. Natomiast programując z wykorzystaniem biblioteki OpenCV w języku C++ na platformie Android nie ma gwarancji, że dana funkcja zadziała identycznie jak np. na komputerze PC. Poza tym właściwa konfiguracja środowiska programistycznego jest w takim wypadku trudniejsza i obarczona dużymi trudnościami.
System detekcji i rozpoznawania znaków drogowych wersja na Androida
arzeniem wielu kierowców jest samochód poruszający się samodzielnie. Pomimo faktu, że polska nazwa "samochód" kojarzy się z maszyną poruszającą się bez ingerencji człowieka, w rzeczywistości aby podróżować bezpiecznie potrzebny jest doświadczony i rozsądny kierowca. W obecnym czasie angażuje się wiele środków dla zapewnienia jak największego bezpieczeństwo podróżujących samochodami. Ograniczenia, specjalne znaki drogowe, kontrole radarowe, mają poprawić bezpieczeństwo i organizację ruchu drogowego. W dużej mierze bezpieczeństwo zależy także od kierowcy, który pod wpływem różnych czynników może stanowić zagrożenie dla ruchu drogowego. Wiele producentów samochodów stara się zapewnić swoim użytkownikom jak najbardziej bezpieczne pojazdy, wypełnione najnowszymi systemami zapewniającymi poprawę bezpieczeństwa jazdy tj.: ABS, ESP, ASR i wiele innych.
Spore grono kierowców nie dostrzega tak podstawowych rzeczy jak znaki drogowe, które ostrzegają, informują i nakazują dostosowanie się do przepisów ruchu drogowego. Może to być spowodowane niekorzystnymi czynnikami rozpraszającymi kierującego tj.: zmęczenie, upojenie alkoholowe, gorsza percepcja, małe doświadczenie oraz wiele innych. Nawet jeśli prowadzący auto spełnia wszystkie kryteria idealnego kierowcy to nadal jest ryzyko, że nie zauważy np. znaku zakazu lub nakazu, co może być opłakane w skutkach. Nie zawsze można winić za to kierowcę, gdyż racjonalność umieszczania kolejnych znaków na polskich drogach jest często nieuzasadniona. Dziesiątki znaków zostają umieszczone w jednym miejscu, a percepcja kierowcy może nie wyłapać najbardziej ważnych w danej sytuacji. Dlatego system wizyjny wyłapywania znaków drogowych ma sens w takiej sytuacji. Przy niezastosowaniu się do przepisów ruchu drogowego można dostać mandat lub, w najgorszym wypadku, spowodować wypadek lub kolizję drogową. Wydaje się, że zastosowanie takiego systemu mogłoby ograniczyć tego typu sytuacje, dlatego producenci aut zdecydowali się umieszczać systemy rozpoznawania znaków drogowych nie tylko we flagowych modelach swoich marek, ale także w tańszych tj. Ford Focus. Pierwszym autem z tego typu systemem był Opel Insignia, jednak od tego czasu wielu producentów umieściło już w swoich samochodach podobne urządzenia.
Celem wielu naukowców i konsorcjów motoryzacyjnych jest stworzenie pojazdu poruszającego się bez ingerencji kierowcy. Niegdyś badania tego typu nad bezzałogowymi pojazdami były intensywnie prowadzone przez struktury wojskowe. Teraz w obliczu zwiększonej ilości samochodów na drogach zaczęto wprowadzać techniki automatyzacji do użytku codziennego. W przyszłości komunikacja będzie w pełni zoptymalizowana, za sprawą nowoczesnych technologii. Globalny projekt Intelligent Transportation System (ITS) jest przykładem na to jak w przyszłości będzie wyglądać transport, nastawiony na polepszenie bezpieczeństwa, oszczędność paliwa, skrócenie czasu podróży itd. Do tego celu pojazdy muszą być wyposażone w specjalne detektory, które będą analizować całą sytuację na drodze i podejmować trafne decyzje w ułamku sekundy. Firma Google od końca 2010 roku testuje samochody, które nie potrzebują kierowcy do bezpiecznego poruszania się w ruchu drogowym. Auta wyposażone są m.in. w rejestratory video, czujniki radarowe, laserowe czujniki odległości wspomagane dokładnymi mapami terenu. Prototypy mają już za sobą nawet 200 000 kilometrów bezkolizyjnej jazdy po drogach publicznych, badania są więc w bardzo zaawansowanym stadium.
Tematem projektu jest stworzenie aplikacji umożliwiającej efektywną detekcję i identyfikację znaków drogowych w czasie rzeczywistym. Założenia dotyczące projektu aplikacji są następujące:
- wykorzystanie prostej analizy obrazu w celu wykrywania i detekcji znaków drogowych
- działanie na platformie mobilnej i wykorzystanie kamery wbudowanej w urządzenie typu smartfon do przechwytywania obrazu
- możliwie największa wykrywalność znaków
- działanie w czasie rzeczywistym
Ostatnie z założeń wymaga dodatkowego wyjaśnienia. Działanie w czasie rzeczywistym, oznacza bowiem ograniczenie czasowe związane z przetwarzaniem obrazu, aby żaden znak drogowy nie został pominięty. Rysunek przedstawia hipotetyczną sytuację drogową. Można założyć, że samochód porusza się na autostradzie z maksymalną dopuszczalną prędkością na terenie Polski, czyli 140 km/h. Kamera rejestrująca obraz znajduje się w odległości 40 metrów od znaku. Należy założyć, że odległość 40 metrów jest to maksymalny dystans, przy którym obraz z kamery wizyjnej pozwala na prawidłowe rozpoznanie znaku.
Można wówczas obliczyć czas jaki jest potrzebny kierowcy pojazdu na przejechanie dystansu 40 m z prędkością 140 km/h (czyli ok 39m/s), aby określić ograniczenie czasowe algorytmu. Ograniczenie to można wyliczyć ze wzoru na czas w ruchu jednostajnym prostoliniowym w sposób następujący :
Powyższe wyliczenia wskazują na fakt, że założeniem projektu jest stworzenie systemu detekcji i rozpoznawania znaków drogowych, który potrafi dokonywać rozpoznawania znaków w czasie krótszym niż 1.03 sekundy, aby móc powiadomić kierowcę o wystąpieniu znaku w odpowiednim czasie.
Projekt został stworzony w oparciu o bibliotekę graficzną OpenCV.
O tym jakiego typu problemy napotkaliśmy w związku z tworzeniem aplikacji można znaleźć w artykule dotyczącym trudności w wykrywaniu znaków.
System w działaniu przedstawia zdjęcie poniżej.