sobota, 5 lutego 2011

Instalacja OpenCV 2.2

Zaczynając nowy cykl powrót do korzeni, czyli instalacja OpenCV :) Tym razem skupię się na najnowszej wersji tej biblioteki w wersji 2.2. Przynosi ona kilka istotnych zmian. Pierwszą z nich jest nowy podział biblioteki na moduły. Tym razem jest ich znacznie więcej i są bardziej wyspecjalizowane.:
  • core - podstawowe struktury, algebra, obsługa XML/YAML,
  • imgproc - operacje na obrazach (filtracje, konwersje kolorów, zmiana rozmiarów itp.),
  • highgui - obsługa I/O i GUI,
  • ml - uczenie maszynowe (sztuczne sieci neuronowe i inne statystyczne),
  • features2d - detektory punktów i obszarów charakterystycznych na płaskich obrazach,
  • video - analiza ruchu, śledzenie obiektów,
  • objdetect - detekcja obiektów (np. twarzy),
  • calib3d - kalibracja kamer, stereowizja,
  • flann - po prostu FLANN ;-),
  • contrib - kod wstępnie zatwierdzony, ale nie stabilny na rozwinięty na tyle by stanowił integralną część biblioteki,
  • legacy - zapewnia wsteczną kompatybilność,
  • gpu - część algorytmów z wykorzystaniem wsparcia obliczeń na kartach graficznych.
Jak widać, trochę się to rozrosło, ale będzie chyba łatwiej ograniczyć się podczas tworzenia własnego projektu do niezbędnych części OpenCV.
Linux
OpenCV na linuksie zainstalować można na dwa sposoby. Pierwszy banalny (na przykładzie Ubuntu):
Uruchamiamy menadżer pakietów Synaptic, szukamy "opencv", zaznaczamy i instalujemy (niestety obecnie jest to wersja 2.1, trzeba poczekać na aktualizację).
Metoda druga pozwala na większą kontrolę nad tym co i jak instalujemy. Pobieramy źródła opencv, rozpakowujemy, a następnie uruchamiamy cmake (można doinstalować w synapticu, polecam wersję z interfejsem graficznym ;-).  Uruchamiamy cmake-gui i wybieramy katalog ze źródłami oraz miejsce do zbudowania wersji binarnej (przydatne także do usuwania OpenCV):
Klikamy przycisk Configure i dostajemy wynik pierwszego przebiegu
Na czerwono podświetlone są pozycje które wymagają weryfikacji (na początku wszystkie), tutaj można zaznaczyć ewentualne opcje których potrzebujemy (np. obsługa okien z wykorzystaniem Qt)
W ten sposób można też wybrać wiele innych rzeczy, np. czytanie niektórych formatów pilków, które wymaga dodatkowych bibliotek w wersji dev do zainstalowania z synaptica. Tutaj można wskazać też takie dodatkowe rzeczy jak wykorzystanie GPU czy IPP. Kiedy już wszystko zostanie poprawione ponownie klikamy Configure. Na czerwono zostaną zaznaczone tylko te pozycje, które wymagają ponownej weryfikacji lub mają niespełnione zależności:
Tutaj tylko weryfikujemy i klikamy ponownie Configure (dodam tylko, że Qt musi być doinstalowane ręcznie, np. z Synaptica). Teraz pozostaje tylko kliknięcie Generate i jeżeli wszysko było ok, otrzymaliśmy wersję gotową do kompilacji.
Uruchamiamy konsolę i wchodzimy do katalogu w którym została ona utworzona. Wpisujemy make (z parametrem -j 2 jeżeli posiadamy dwurdzeniowy procesor, -j 4 jeżeli cztery rdzenie itd.) a następnie jeżeli wszystko przebiegło bez problemów sudo make install i cieszymy się nowym OpenCV :) W ten sposób można też instalować najświeższą wersję z SVNa. Trzeba pamiętać by odinstalować starą wersję przed instalacją innej poleceniem w konsoli sudo make uninstall.

Przykładowy program na linuksie
Do pisania programów w C++ używam ostatnio Qt Creatora. Tworzymy nowy projekt, wybieramy aplikację konsolową, ustawiamy nazwę projektu i jego położenie.
Początkowo mamy dwa pliki: *.pro z opcjami projektu oraz *.cpp z kodem. Plik pro przetrzymuje opcje projektu, takie jak dołączone biblioteki. Zmieniamy jego zawartość na następującą 
TARGET = pierwszy
CONFIG   += console
CONFIG   -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
INCLUDEPATH += /usr/local/include/opencv2
LIBS += -L/ur/local/lib \
    -lopencv_highgui
gdzie  to nazwa pliku pro będąca też nazwą projektu. Zwrócić uwagę należy na INCLUDEPAH gdzie wskazano katalog z plikami nagłówkowymi OpenCV oraz LIBS gdzie deklaruje się użyte biblioteki. Znacznikiem -L wskazujemy katalog z bibliotekami (należy zwrócić uwagę na brak odstępu pomiędzy -L a początkiem ścieżki). Znak \ wskazuje, że kontynuujemy zawartość LIBS w kolejnej linii. Bibliotekę wskazujemy znacznikiem -l (także bez spacji) zgodnie z konwencją uniksową. Jeżeli plik biblioteki nazywa się libXXX.so to omijamy przedrostek lib. Do main.cpp wsawiamy przykładowy kod użyty w dokumentacji
#include <highgui/highgui.hpp>
#include <opencv.hpp>

using namespace cv;

int main(int, char**)
{
    VideoCapture cap(0);
    if(!cap.isOpened())
        return -1;
    Mat edges;
    namedWindow("edges",1);
    for(;;)
    {
        Mat frame;
        cap >> frame;
        cvtColor(frame, edges, CV_BGR2GRAY);
        GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
        Canny(edges, edges, 0, 30, 3);
        imshow("edges", edges);
        if(waitKey(30) >= 0) break;
    }
 
    return 0;
}
Klikamy Uruchom (skrót klawiszowy Ctrl+R) i jeżeli wszystko jest ok, oglądamy obraz z kamery z wykrytymi krawędziami

Windows
W Windowsie ściągamy plik instalacyjny z wersją binarną (OpenCV-2.2.0-win32-vs2010.exe) i instalujemy w standardowy windowsowy sposób pamiętając o zaznaczeniu po drodze o dodaniu do PATHa
Inną metodą jest instalacja ze źródła. Podobnie jak w linuksie wykorzystujemy do tego cmake, do ściągnięcia ze strony autorów. Należy także zaznaczyć dodanie CMake do PATHa i uruchamiania go z uprawnieniami administratora. Do instalacji ze źródeł ściągamy plik OpenCV-2.2.0-win.zip. Dalej postępujemy tak jak w przypadku linuksa, z tym że wybieramy po drodze odpowiedni kompilator (u mnie Visual Studio 10):
Dzięki takiemu wyborowi dostajemy odpowiednie pliki projektów do Visual Studio 10 (np. INSTALL).
Przykładowy program na windowsie
Uruchamiamy Visual Studio 10 i tworzymy nowy projekt C++
Przechodzimy do opcji. W zakładce C/C++ dodajemy folder z plikami nagłówkowymi
Następnie w zakładce Linker/General należy dodać katalog z bibliotekami
a w Linker/Input biblioteki z których korzystamy
Dopisujemy kod programu i uruchamiamy :) Na windowsie miałem z tym masę problemów, do teraz nie wiem czemu to raz działa, raz nie (bo 64-bity, bo sterownik do kamery dziwny itd.), więc tymczasowo podziękuję systemowi Microsoftu...

1 komentarz:

Anonimowy pisze...

Super strona. Zachęcam do kontynuowania tego co sie tu dzieje.
Skorzystałem właśnie z instalacji i opisu linkowania biblioteki opencv pod linuxem w programie qt.
Aby moc pracować na c++ nie wystarczy opencv z synaptica.

Na poczatku skorzystalem z tego tutoriala:

http://rpetryniak.blogspot.com/2011/03/opencv-instalacja-i-pierwszy-przykad-w.html

Ale potem zabrakło mi informacji co zrobić dalej ze skompilowana biblioteka i jako poczatkujacy nie potrafilem sobie poradzic wiec dokonczylem czytajac tego bloga.

Bardzo dziekuje autorowi za pomoc