czwartek, 23 lipca 2009

OpenCV

OpenCV to prawdopodobnie najbardziej znana biblioteka związana z komputerową "wizją". Chodź od dłuższego czasu nic w niej się nie dzieje, to wydaje się nie tracić na popularności. Miałem okazję zapoznać się z nią na laboratorium przedmiotu Sensoryka i Systemy Wizyjne. Na zajęciach wykorzystywaliśmy Visual C++, a teraz chciałbym móc pracować z tą biblioteką w NetBeans na Ubuntu 8.04. Okazało się, że chęć tę bardzo łatwo przekuć w czyn. Oto co należy zrobić:
Nie zamierzam instalować ostatniej wersji z CVS czy SVN. Chcę wykorzystać to co jest w repozytorium Ubuntu. Mamy tam dostępną wersję 1.0.0. Aby dowiedzieć się jakie są nazwy paczek należy wpisać:
apt-cache search opencv
. W odpowiedzi dostaniemy:
libcv-dev - development files for libcv
libcv1 - computer vision library
libcvaux-dev - development files for libcvaux
libcvaux1 - computer vision extension library
libhighgui-dev - development files for libhighgui
libhighgui1 - computer vision GUI library
opencv-doc - OpenCV documentation and examples
python-opencv - Python bindings for the computer vision library

Nie potrzebujemy dokumentacji, która jest dostępna tutaj (dla wersji 1.0) lub tutaj (dla wersji 1.1). W repozytorium znajduje się wersja 1.0. Wydaje mi się, że nie różni się ona zbytnio od 1.1, ale nie przeglądałem changeloga, więc nie wiem na pewno. W każdym razie dokumentacja jest w internecie, a Pythona nie zamierzam używać.
Zatem instalujemy paczki:
sudo apt-get install libcv1 libcv-dev libcvaux1 libcvaux-dev libhighgui1 libhighgui-dev
W odpowiedzi dostaniemy:
Czytanie list pakietów... Gotowe
Budowanie drzewa zależności
Odczyt informacji o stanie... Gotowe
Zostaną zainstalowane następujące dodatkowe pakiety:

libatk1.0-dev libavcodec-dev libavformat-dev libavutil-dev libcairo2-dev libdc1394-13-dev libexpat1-dev libfontconfig1-dev libfreetype6-dev libglib2.0-dev libgsm1-dev libgtk2.0-dev libice-dev libjpeg62-dev libogg-dev libpango1.0-dev libpixman-1-dev libpng12-dev libpthread-stubs0 libpthread-stubs0-dev libraw1394-dev libsm-dev libtheora-dev libtiff4-dev libtiffxx0c2 libvorbis-dev libx11-dev libxau-dev libxcb-xlib0-dev libxcb1-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxft-dev libxi-dev libxinerama-dev libxrandr-dev libxrender-dev x11proto-composite-dev x11proto-core-dev x11proto-damage-dev x11proto-fixes-dev x11proto-input-dev x11proto-kb-dev x11proto-randr-dev x11proto-render-dev x11proto-xext-dev x11proto-xinerama-dev xtrans-dev zlib1g-dev
Sugerowane pakiety:
libcairo2-doc libglib2.0-doc libgtk2.0-doc imagemagick libpango1.0-doc
libraw1394-doc
Zostaną zainstalowane następujące NOWE pakiety:
libatk1.0-dev libavcodec-dev libavformat-dev libavutil-dev libcairo2-dev libcv-dev libcv1 libcvaux-dev libcvaux1 libdc1394-13-dev libexpat1-dev libfontconfig1-dev libfreetype6-dev libglib2.0-dev libgsm1-dev libgtk2.0-dev libhighgui-dev libhighgui1 libice-dev libjpeg62-dev libogg-dev libpango1.0-dev libpixman-1-dev libpng12-dev libpthread-stubs0 libpthread-stubs0-dev libraw1394-dev libsm-dev libtheora-dev libtiff4-dev libtiffxx0c2 libvorbis-dev libx11-dev libxau-dev libxcb-xlib0-dev libxcb1-dev libxcomposite-dev libxcursor-dev libxdamage-dev libxdmcp-dev libxext-dev libxfixes-dev libxft-dev libxi-dev libxinerama-dev libxrandr-dev libxrender-dev x11proto-composite-dev x11proto-core-dev x11proto-damage-dev x11proto-fixes-dev x11proto-input-dev x11proto-kb-dev x11proto-randr-dev x11proto-render-dev x11proto-xext-dev x11proto-xinerama-dev xtrans-dev zlib1g-dev
0 aktualizowanych, 59 nowo instalowanych, 0 usuwanych i 0 nieaktualizowanych.
Konieczne pobranie 0B/17,3MB archiwów.
Po tej operacji zostanie dodatkowo użyte 62,9MB miejsca na dysku.
Czy chcesz kontynuować [T/n]?
Odpowiadamy, że oczywiście tak. Jak widać instaluje się mnóstwo innych paczek - z tego co widać jedne służą do obsługi różnych formatów obrazów i filmów, a inne do obsługi interface'u (np libgtk2.0-dev). Gdy ta czynność się zakończy pliki nagłówkowe będą zainstalowane w /usr/include/opencv, a biblioteki w /usr/lib.
Zaczynamy teraz pracę z NetBeans:
Tworzymy nowy projekt typu "C/C++ Application". Nadajemy mu nazwę "openCV Hello World".
Mamy czysty projekt z pojedynczym plikiem main.cpp. Teraz trzeba powiedzieć kompilatorowi, gdzie znajdują się biblioteki, które ma dołączyć do projektu. Należy kliknąć prawym przyciskiem w oknie "Projects" na obecnym projekcie i przejść do jego właściwości (Properties). Po wybraniu "Linker" dodać ścieżkę do bibliotek (Additional Library Directories): /usr/lib oraz biblioteki (Libraries): cv, cvaux, highgui.

Teraz możemy napisać trochę kodu. Oto propozycja:
#include <stdlib.h>
#include "opencv/cv.h"
#include "opencv/cvaux.h"
#include "opencv/highgui.h"

/*
*
*/
int main(int argc, char** argv) {
//tworzenie zmiennej przechowującej obraz i załadowanie obrazu z pliku, 0 = czarno-biały
IplImage* obraz = cvLoadImage("/home/daniel/Obrazy/hello.jpg", 0);
//utworzenie okna nazwanego Hello World
cvNamedWindow("Hello world");
//wyświetlenie obrazu
cvShowImage("Hello world", obraz);
//oczekiwanie na wciśnięcie klawisza, domyślnie 0 = nieskonczonosc
cvWaitKey();
//zamknięcie okna, można użyć cvDestroyAllWindows()
cvDestroyWindow("Hello world");
//zwalniamy pamięć zajętą przez zmienną obraz
cvReleaseImage(&obraz);
return (EXIT_SUCCESS);
}
Efekt po wciśnięciu F6: