mg_todo

Sprawdziłem możliwość nagrywania. Test został zakończony pomyślnie, uzyskałem dwa pliki nagrane z dwóch kamer w tym samym czasie w rozdzielczości 640x480. Ewentualnie można napisać skrypt który dokładnie synchronizuje nagrywanie.

W następnym kroku planuję zapoznać się z programem Visage, sprawdzić czy działa, jeżeli tak to w jaki sposób i czy da się to wykorzystać.

Obecnie zajmuję się napisaniem aplikacji wykrywającej poruszanie się za pomocą uśrednainia jasności fragmentów obrazu Program dzieli obraz uzyskany z kamery na 100 regionów i oblicza ich średni kolor, co jest wykorzystywanie do porównywania z następnymi klatkami.

W openCV również są python-bindings i podobnie jak w gstreamer nie są udokumentowane, na szczęście wpis w blogu Josepha Javiera Perla [|capturing-frames-from-a-webcam-on-linux/] jest dokładnie tym czego potrzebowałem i w połączeniu z tym co wcześniej zrobiłem z gstreamerem teraz program działa płynnie (15 klatek na sekundę, ale przy 30 też działa).

Zlokalizowanie i poprawienie "wąskiego gardła" wynikającego z niepoprawnego konwertowania poszczególnych klatek, spowodowało, że program działa teraz w czasie rzeczywistym, jednakże zużycie procesora jest na tyle duże, że ciężko jest cokolwiek wyświetlać (flash) w tym samym czasie

Do komunikacji z kamerą używam OpenCV Do obróbki obrazów używam PIL (Python Imaging Library) http://www.pythonware.com/products/pil/ Do tworzenia animacji 2D używam Pygame [|www.pygame.org]

Udało się wykonać poruszanie kursorem myszy za pomocą biblioteki python-xlib (odpowiednik Xlib z C) W zasadzie wystarczy taki kawałek kodu: code format="python" from Xlib.display import Display display = Display display.warp_pointer(x,y) display.sync code Kolejnym etapem do wykonania jest dalsza optymalizacja programu.

Zdecydowałem że wizualizacją do programu wykrywającego ruch będzie prosta gra "ludzik zbierający truskawki". Celem gry jest sterowanie ludzikiem tak aby zebrał truskawkę, jedynym utrodnieniem jest to że ludzik sterowany jest gestami wykonywanymi przed kamerą. Inną ciekawą wizualizacją może być wyświetlanie czarno-białego obrazu i zamienianie obszarów na które się patrzy na kolorowe.

Zmieniłem sposób przetwarzania klatek, dotychczas przetwarzanie klatek odbywało się w następujący sposób: code format="python" while(True): nowaKlatka = pobierzKlatke wynik = przetworzKlatki(staraKlatka, nowaKlatka) staraKlatka = copy(nowaKlatka)

code obecnie klatki przetwarzane są w taki sposób: code format="python" while(True): klatki[licznik%2] = pobierzKlatke wynik = przetworzKlatki(klatki[0], klatki[1]) licznik += 1 code dzięki temu nie trzeba kopiować nowej klatki do starej klatki, oraz ułatwia przetważanie klatek piksel po pikselu (bez dzielenia na regiony).

Dodałem do programu możliwość przetważania klatek bez dzielenia na regiony, aby porównać szybkość oraz dokładność z wersją dzielące obraz na regiony. Podejrzewam również, że w wersji bez dzielenia klatek na regiony bardziej dostrzegalne będzie, czy moźliwe jest śledzenie ruchu bez dodatkowych heurystyk na zdjęciach w odcieniu szarości.

Pierwszym wnioskiem jest to, że nie można przechowywać klatki jako macierz (640x480) poniewaź inicjalizowanie tak dużych tablic jest zbyt wolne. Zatem chce aby dwie klatki zostały porównane bez tworzenia macierzy i ewentalnie stworzyć macierz tylko do ich różnicy.

Planuje sprawdzić czy jeżeli użyjemy segmentacji obrazu do wykrycia skóry przed detekcją ruchu, czy nie da to ciekawego efektu, zakładam że będzie to zbliżone do wykrywania ruchu dlonią. Poza tym warto sprawdzić jakie efekty dałoby użycie 'optical flow' do wykrywania ruchu.

Przeszedłem na wersję rozwojową biblioteki opencv z powodu niepoprawnego działania wielu funkcji opisanych w książce, w wersji "stabilnej" (1.0), nie działały takie funkcje jak cvCreateVideoWriter czy cvCreateFileCapture (przynajmniej dla mnie), czyli zapisywanie i odczytywanie filmów było niemożliwe. Aby zainstalować opencv z repozytorium cvs przerobiłem [|opencv-9999.ebuild] dla poprzednich wersji biblioteki.

Zafer Savas w swojej pracy magisterskiej [], bardzo dokładnie opisał rożne sposoby na detekcje i śledzenie oczu, w swoim programie do detekcji oczu używa twóch metod: dopasywania wzorców (template matching), oraz metody eigeneyes która jest wersją metody eigenfaces z tym, że do obliczania eigenvectors używane są obrazy oczu zamiast całych twarzy. Najpierw sprawdzę jak radzi sobie eigenfaces później spróbuje z oczami. Do detekcji twarzy można również użyć kaskad Haara. Kaskady twarzy są dostępne wraz ze źródłem biblioteki, natomias kaskad oczu należy poszukać. Opis implementacji eigenfaces znajduje się na tej stronie [].

Pojawiła się wersja 2.0 biblioteki OpenCV. W nowej wersji większość kodu została przepisana do C++ oraz dostępny jest nowy interfejs pythonowy (już nie na podstawie swig). Nowy interfejs pythonowy obsługuje więcej funkcji i rozwiązuje problemy z zarządzaniem pamięcią, wynikające z niemożliwości zaimplementowania pewnych funkcji za pomocą swig. W nowym interfejsie pythonowym cześć podstawowych typów została zastąpiona strukturami z pythona, np. cvSize. Nadal można używać interfejsu swigowego jeżeli biblioteka zostanie skompilowana z flagą deprecated. Funkcje z nowego interfejsu nie posiadają przedrostka cv.

Obecnie poprawiam swoje programy tak aby działały z nową wersją opencv.