mg_opencv

We wrześniu wydawnictwo O'Reilly wydało książkę [|"Learning OpenCV"] napisaną przez twórców biblioteki. W październiku ukazała się nowa wersja biblioteki (1.1pre1). Na tej stronie będę opisywał różne możliwości biblioteki OpenCV.

Wbrew temu co jest napisane w pliku INSTALL dostarczanego wraz z kodem źródłowym, wersję z SVN kompilujemy wykonując następujące polecenia: code format="bash" cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/opt/opencv -D BUILD_PYTHON_SUPPORT=ON make make install code Aby swobodnie korzystać z biblioteki zainstalowanej w niestandardowej ścieżce należy wykonać następujące polecenia (lub dodać do ~/.bashrc) code format="bash" export PYTHONPATH=/opt/opencv/lib/python2.5/site-packages:${PYTHONPATH} export LD_LIBRARY_PATH=/opt/opencv/lib/:${LD_LIBRARY_PATH}

code Niektóre funkcje opencv nie posiadają poprawnych bindingów dla pythona, np. cvReleseFileStorage. Głównym powodem braku obsługi tych funkcji jest występowanie w nich podwójnych wskaźników. Biblioteka ctypes-opencv zawierająca inny zestaw bindingów do opencv, poprawnie obsługuje część funkcji z dwoma wskaźnikami. Wadą ctypes-opencv jest to, że ta biblioteka nie działa razem z wersją rozwojową opencv, a co najwyżej z wersją 1.1.0-pre.

Niektóre funkcje modułu cv:


 * cvSmooth** - prosta transformacja obrazu, umożliwia wygładzanie obrazu za pomocą wybranej funkcji np. CV_GAUSSIAN. Bez podglądu nieprzetworzonych klatek trudno dostrzec jest jakąkolwiek różnicę.


 * cvPyrDown** - zmniejsza rozmiar klatki o połowę. Najpierw wykonywane jest wygładzenie, a następnie usuwana jest co druga linia w oryginalnej klatce.


 * cvCvtColor** - dokonuje konwersji przestrzeni kolorów np. CV_BGR2GRAY.


 * cvCanny** - metoda wykrywania krawędzi Canny'ego (Canny edge detector). Należy pamiętać że funkcja jako obraz wejściowy przyjmuje tylko klatki w odcieni szarości. Przy pobieraniu obrazu z kamery wygładzenie obrazu znacznie poprawia skuteczność wykrywania krawędzi.


 * cvGoodFeaturesToTrack** - funkcja implementująca detektor rogów wedłóg algorytmu Shi i Tomasi. Należy przygotować jednokanałowy obraz wejściowy w formacie 8U lub 32F oraz dwa obrazy o takim samym rozmiarze co obraz wejściowy w formacie 32F. Dodatkowo jako parametry należy podać maksymalną ilość rogów do odnalezienia, poziom jakości rogu (przyjmuje się, że 0.1 lub 0.01 to dobre wartości), oraz minimalny dystans eliminujący rogi będące zbyt blisko siebie.

Część biblioteki OpenCV zawierająca zbiór narzędzi umożliwiających odczytywanie wielu formatów plików graficznych oraz wideo, jak również pobieranie obrazów z kamery.
 * Highgui Toolkit**

Niektóre funkcje wchodzące w skład modułu highgui:


 * cvLoadImage** - Funkcja wczytująca plik graficzny. Typ pliku jest rozpoznawany automatycznie na podstawie rozszerzenia pliku. Obsługuje szeroki zasób formatów, w których skład wchodzą pliki o rozszerzeniach bmp, jpeg, dib, jpe, png, pbm, pgm, ppm, sr, ras i tiff. Funkcja zwraca wskaźnik do struktury IplImage, dzięki tej strukturze możemy manipulować obrazem innymi funkcjami z biblioteki opencv.


 * cvCreateFileCapture/cvCreateCameraCapture** - Wczytuje plik wideo i zwraca wskaźnik do struktury CvCapture. Obsługuje nieskompresowane pliki avi. Przydatne do wielokrotnego przeprowadzania eksperymentu na wcześniej przygotowanym filmie.


 * cvCreateVideoWriter** - Umożliwia zapisanie przechwytywanego obrazu do pliku. Tworzy strukturę cvVideoWriter.


 * cvGetCaptureProperty/cvSetCaptureProperty** - Wczytuje/ustawia właściwości wczytywanego wideo takie jak wysokość, szerokość, fps, ilość klatek.


 * cvQueryFrame** - Wczytuje klatkę filmu ze struktury CvCapture. Klatka nie jest strukturę IplImage, lecz wskaźnikiem na odpowiednie miejsce w strukturze CvCapture.


 * cvConvertImage** - Umożliwia obrócenie klatki.


 * cvNamedWindow** - Funkcja tworząca okno na ekranie w którym można wyświetlać obrazy.


 * cvShowImage** - Funkcja wyświetlająca obraz we wcześniej przygotowanym oknie.


 * cvWriteFrame** - Zapisuje klatkę do struktury cvVideoWriter.


 * cvWaitKey** - Funkcja zatrzymująca działanie programu dopóki nie zostanie wciśnięty dowolny klawisz. Zapobiega zbyt szybkiemu zniknięciu wyświetlanych obrazów.


 * cvCreateTrackbar** - Dodaje do wskazanego okna suwak, przydatny do manipulowania parametrami takimi jak jasność, kontrast lub pozycja w filmie.


 * cvSetTrackbarPos** - Ustawia pozycje suwaka.


 * cvReleaseVideoWriter** - Kończy zapisywanie do pliku i zwalnia zasoby przeznaczone dla struktury cvVideoWriter.


 * cvDestroyWindow** - Funkcja usuwająca okno oraz zwalniająca zasoby przydzielone dla tego okna. Wywołanie tej funkcji nie jest konieczne, ale to dobry zwyczaj, żeby po sobie posprzątać.

Zapisywanie obiektów opencv do pliku
Opencv umożliwia zapisywanie obiektów takich jak macieże do pliku w formacie xml lub yaml. Podobnie jak przy zapisywaniu plików graficznych, format pliku będzie wybrany na podstawie rozszerzenia nazwy pliku.


 * cvOpenFileStorage** - Otwiera magazyn danych, jako parametr podajemy nazwę pliku oraz tryb zapis/odczyt. Zwraca uchwyt do magazynu.


 * cvReleaseFileStorage** - Zamyka plik i zwalnia zasoby.


 * cvWriteInt** - Zapisuje liczbę całkowitą.


 * cvWriteReal** - Zapisuje liczbę rzeczywistą.


 * cvWrite** - Zapisuje obiekty typu cvArr.

Interfejs dla języka python
Istotną różnica na jaką się natknąłem jest zmieniony sposób używania struktur cvMat. Z powodu innego sposobu zarządzania pamięcią, w języku python nie ma struktury IplImage i wszystkie metody korzystające ze struktur IplImage pobierają i zwracają strukturę cvMat. Do struktury cvMat dodano pola związane z obrazem takie jak wysokość, szerokość, ilość kanałów itd. aby ta struktura zachowała funkcjonalność struktury IplImage. Nie działają funkcje związane z ROI i COI, aby uzyskać podobną funkcjonalność należy używać funkcji cvGetSubRect oraz cvMerge i cvSplit. Do struktury cvMat dodano również specjalne metody języka python __iter__, oraz __getitem__, aby uprościć iterowanie i dostęp do elementów. Iterowanie: code format="python" x = cvCreateMat(m, n, type) for row in x: # zamiast cvGetRow for col in x.colrange: # zamiast cvGetCol code Dostęp do elementów: code format="python" row = x[i] col = x[:, i] slice = x[0:10, 0:10] elem = x[i, j] elem = x[i][j]

code Ustawianie wartości komórek: code format="python" x[0:10, 0:5] = y[10:20, 1:6] x[i, j] = 1; x[0:10, i] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

code