poniedziałek, 21 września 2009

Podstawowe klasy w OpenCV


Ostatnio wspomniałem o nowym interfejsie w OpenCV, a dzisiaj przedstawię jego podstawowe klasy. Przede wszystkim nie będzie już struktur CvArr, CvMat i IplImage - wszystkie one zastąpione zostają klasą Mat. Tak jak reszta klas i funkcji, znajduje się ona w przestrzeni nazw cv. Nie chcę tutaj przepisywać dokumentacji, więc zademonstruję tylko na przykładzie "szumu" z telewizora ;-) Kod źródłowy (na githubie) oraz efekt:

Na początku zaznaczamy użycie przestrzeni nazw cv. Spowodowało to zniknięcie prefiksu "cv" z nazw funkcji. I tak nie ma już cvNamedWindow ale namedWindow. Parametry są niemal identyczne (jedyna zmiana w tej i podobnych funkcjach to użycie obiektu string zamiast wskaźnika char*). Dalej mamy obiekt klasy Mat. Posiada on wiele konstruktorów. W przykładowym kodzie pokazano tworzenie macierzy liczb typu double. Analogicznie można stworzyć np. macierz wartości boolowskich podając DataType< bool>::type itd. Można także deklarować według starego typu podając jako parametr np.CV_32F. Przykładowo, tak stworzymy obraz RGB o rozdzielczości 640x480:

Mat obr(640,480,CV_8UC3);

lub z wykorzystaniem Size:

Mat obr(Size(640,480),CV_8UC3);

Dalej mamy odpowiednik starego CvScalar czyli klasę Scalar. Obiekty tej klasy można zadeklarować tak jak w przykładowym kodzie Scalar_<typ>, lub z użyciem funkcji np.

Scalar scl = Scalar::all(0);

Kolejna funkcja to randu która zapełnia macierz wartościami losowymi z zakresu [0:1]. Ostatnia nowość to funkcja imshow - odpowiednik cvShowImage. I na koniec zauważyć można brak cvRelease :). Wszystkie klasy mają odpowiednio zaimplementowane destruktory, więc program sprząta po sobie sam :)

czwartek, 17 września 2009

OpenCV 2.0

Kilka dni temu pojawiła się nowa wersja biblioteki OpenCV oznaczona numerem 1.2.0 (a nazywana potocznie "dwójką"). Co zatem nowego? Przede wszystkim nowy , obiektowy interfejs C++ zamiast C (który nadal jest wspierany, będzie zachowana wsteczna kompatybilność). Dzięki niemu można praktycznie zapomnieć o alokacji i czyszczeniu pamięci, z czasem zobaczymy jak to wyjdzie "w praniu" ;-) (żegnajcie cvCreateXXX i cvReleaseXXX). Także takie operacje jak dodawanie macierzy będzie uproszczone (mając macierze A,B,C będzie można zrobić prostą operację C = A + B zamiast cvAdd(A,B,C)). Przeciążenia operatorów, zakresy i wszystkie inne dobrodziejstwa C++ dostępne, może twórcy OpenGLa w końcu postąpią podobnie... Od dawien dawna dostępna jest wersja dla Pythona, ale wersja C++ na pewno ucieszy wielu użytkowników, nie ukrywam, że mnie bardzo :).
Kontynuując, mamy kilkanaście nowych algorytmów (m.in. związanych z detekcją), przejście na CMake, dokumentację w LaTeXu, mocniejszą optymalizację (np. użycie SSE3, większą integrację z OpenMP) itd. Więcej w ChangeLogu ;-) Miłego korzystania :)