OpenCV (ang. Open Source Computer Vision Library) jest biblioteką do przetwarzania obrazów w czasie rzeczywistym. Obecnie udostępniana jest na licencji BSD i wspiera wszystkie najważniejsze platformy programowe. Napisana jest C, ale istnieją nakładki na inne języki. Możliwości biblioteki są ogromne, począwszy od prostych operacji na pojedynczych pikselach przez zaawansowane algorytmy przetwarzania obrazów, po algorytmy uczenia maszynowego, wykorzystywane w takich zagadnieniach jak detekcja twarzy. Niewątpliwą zaletą jest możliwość wykonywania wszystkich operacji “w locie”, bezpośrednio na strumieniu wideo.

1. Biblioteka

Biblioteka składa się z czterech głównych komponentów:

  • CV – przetwarzanie obrazów i algorytmy wizyjne.
  • MLL – klasyfikatory i narzędzia grupujące.
  • HighGUI – GUI oraz wejście/wyjście dla obrazów i wideo.
  • CXCORE – podstawowe struktury danych i algorytmy.

1.1 Przykładowy program

Listing 1 zawiera prosty program wczytujący i wyświetlający dowolny obraz, podany jako argument. Wykorzystano w nim HighGUI, które zajmuje się operacjami wejścia-wyjścia w bibliotece.

Listing 1: Prosty program wczytujący i wyświetlający plik graficzny.

#include "cv.h"
#include "highgui.h"
int main(int argc,char** argv)
{
IplImage *img = cvLoadImage(argv[1],1);
cvNamedWindow("Przyklad",CVWINDOWAUTOSIZE);
cvShowImage("Przyklad",img);
cvWaitKey(0);
cvReleaseImage (&img);
cvDestroyWindow("Przyklad");
return 0;
}

Wykrywanie obiektów za pomocą OpenCV

Rysunek 1: Prosty program.
Program można skompilować za pomocą polecenia:

gcc first.c -o first $(pkg-config --cflags --libs opencv)

2. Klasyfikator Haar i detekcja obiektów

Wykrywanie obiektów na obrazie, należy do zadań, dla których ciężko jest stworzyć algorytm. Problem ten jest bardzo złożony. Dlatego też do jego rozwiązania stosuje się elementy inteligencji obliczeniowej. Dziedzina ta zajmuje się między innymi uczeniem maszynowym, czyli grupą algorytmów które uczy się pewnych zadań na podstawie wzorców.

W obecnym czasie do rozpoznawania obiektów, szeroko-stosowane są dwa rozwiązania. Pierwsze z nich to eigenface, a drugie to haar. Biblioteka korzysta z tego drugiego rozwiązania. Metoda ta została opracowana przez Paula Viol’a. Opiera się ona na wirtualnym oknie, które przesuwa się po obrazie, w celu znalezienie pasujących regionów. Więcej informacji oraz demo można znaleźć na morph.cs.st-andrews.ac.uk.

3. Trening klasyfikatora

Biblioteka udostępnia szereg wytrenowanych już klasyfikatorów. Zapisywane są one w formacie XML. W ostatniej wersji biblioteki można między innymi:

  • haarcascade eye tree eyeglasses.xml
  • haarcascade eye.xml
  • haarcascade frontalface alt2.xml
  • haarcascade frontalface alt tree.xml
  • haarcascade frontalface alt.xml
  • haarcascade mcs mouth.xml
  • haarcascade mcs nose.xml

Widzimy tu klasyfikatory wytrenowane w wyszukiwaniu twarzy (frontalnie i z profilu) oraz jej części składowych takich jak uszy oczy itp.

3.1 Własny klasyfikator

Do wytrenowania własnego klasyfikatora potrzebne są dwa zbiory uczące. Pierwszy zbiór to pozytywy czyli obrazy przedstawiające tylko interesujący nas obiekt. Zbiory uczące powinny zawierać kilka tysięcy przykładów. Zgromadzenie takich zbirów może wymagać dużo czasu. Dla twarzy istnieją gotowe bazy danych takie jak MIT CBCL Face Data oraz FERET. Zbiór negatywów, to zbiór wszystkiego co może być tłem obiektu. Do budowania zbiorów uczących służy polecenie opencv_createsamples. Poniższy listing 2 zawiera opis jego parametrów.

Listing 2: Parametry polecenia opencv_createsamples

Usage: ./opencv_createsamples
[−info <description_file_name>]
[−img <image_file_name>]
[−vec <vec_file_name>]
[−bg <background_file_name>]
[−num <number_of_samples = 1000>]
[−bgcolor <background_color = 0>]
[−inv ] [−randinv ] [−bgthresh <background_color_threshold = 80>]
[−maxidev <max_intensity_deviation = 40>]
[−maxxangle <max_x_rotation_angle = 1.100000>]
[−maxyangle <max_y_rotation_angle = 1.100000>]
[−maxzangle <max_z_rotation_angle = 0.500000>]
[−show [<scale = 4.000000>]]
[−w <sample_width = 24>]
[−h <sample_height = 24>]

Najistotniejsze są pierwsze trzy parametry:

  • img przykład pozytywny
  • bg przykład negatywny
  • vec nazwa pliku wynikowego

Można też użyć wielu przykładów. Wymagane do tego jest utworzenie pliku dat. Pomocny może być prosty skrypt z listingu 3.

Listing 3: Tworzenie pliku dat.

find zbior_przyklady −name '*.png' \\
−exec identify −format '%i 1 0 0 %w %h' \{\} \ ;\\
> zbior.dat

Następnym krokiem jest właściwy trening klasyfikatora. Służy do tego polecenie opencv_haartraining (listing 4).

Listing 4: Parametry polecenia opencv_createsamples.

$ opencv_haartraining −data haarcascade −vec poz.vec −bg neg.dat \\
−nstages 20 −n splits 2 −minhitrate 0.999 −maxfalsealarm 0.5\\
−npos 7000 −nneg 3019 −w 25 −h 25 −nonsym −mem 1024 −mode ALL

Po tej operacji można utworzyć plik XML. Służy do tego polecenie convert_cascade, znajdujące się w katalogu samples\c. Tak przygotowany klasyfikator, może być już użyty w programie. W katalogu samples\c znajduje się przykładowy program face_detect.c, pozwalający przetestować wykrywanie zarówno na pliku jak i na strumieniu wideo. Rysunek 2 przedstawia wynik wyszukiwania twarzy, okręgami zaznaczone są znalezione obiekty. Jak widać, nie wszystkie twarze udało się znaleźć, co tylko potwierdza fakt, że warto eksperymentować samodzielnie.

Wykrywanie obiektów za pomocą OpenCV

Rysunek 2: Wynik wyszukiwania. Źródło:lwn.net/Articles/464307/

4 Zakończenie

Zadaniem tego artykułu było przedstawienie możliwości biblioteki OpenCV, jaką jest rozpoznawanie obiektów i zachęcenie czytelnika do własnych eksperymentów. Biblioteka ma obecnie najbardziej popularną implementacje algorytmu Haar. Poza detekcją twarzy, wykorzystywana jest w rozwiązaniach związanych z
monitoringiem ulicznym (wykrywanie samochodów, numerów rejestracyjnych).

Literatura:

  1. Computer Vision and Pattern Recognition, 1991. Proceedings CVPR ’91., IEEE Computer Society Conference on In Proceedings. 1991 IEEE Computer Society Conference on Computer Vision and Pattern Recognition (1991), pp. 586-591
  2. Paul Viola and Michael J. Jones, “Rapid Object Detection using a Boosted Cascade of Simple Features,” IEEE CVPR, 2001.
  3. Jaesik Choi,Realtime On-Road Vehicle Detection with Optical Flows and Haar-like feature detector

Artykuł zajął drugie miejsce w konkursie, w którym do wygrania był WikiReader.

  • Greg

    Czy to nie z tej biblioteki korzysta może Goolge Picasa?

  • TomJ

    Na jakiej zasadzie działa to wykrywanie twarzy? Biblioteka szuka specyficznych punków i odległości między nimi? Jest tak dobra że rozpozna serio twarze, czy wyłapuje kontakt w ścianie jako buzię? Takie coś robi mój Nikon :/

  • Admn

    Ale nie wszystkich wykryło. Wrzuci to ktoś na picasę i porówna jak ona sobie z tym radzi?

  • Sebek

    hmm… to nie jest problem algorytmu ale jego wiedzy czyli wytrenowania, 2 programy mogą korzystać z tego samego algorytmu ale będą miały inna bazę wzorców i dadzą inny wynik, tu jest klasyfikator haar, picassa korzysta z PCA czyli eigenface. Z haar'a korzysta digikam. Najprosciej tłumacząc polega to na tym, że dajemy programowi kilka zdjęć on je w ,,magiczny'' sposób uśrednia i wie jakie wartości mają piksele gdy znajduje się na nim twarz. Oczywiście na zdjęcie zdjęcia lub kontur na bluzie/scianie/kartce tez często zareaguje. Dla upewnienia się można wtedy zastosować wykrywanie odcieni skóry itp… Są też techniki bazujące na odbiciu Lambertowskim i ich juz tak latwo sie nie oszuka, ale wymagaja one kilku klatek i obliczenia trwają dłużej.

    • Alias

      Sebastian, ciekawie piszesz! W sumie interesuje mnie tematyka tego typu. Może jakiś felietonik porównujący tego typu algorytmy? :)

      Na czym polegająe odbica Lambertowskie?

    • Sebek

      Chodzi o sposób w jaki dany materiał rozprasza światło. Takie materiały rozpraszają światło równomiernie we wszystkich kierunkach. Twarz jest lambertowska (oprócz oczu), co nam to daje ? Mając serie klatek z różnym oświetleniem można ,,wyciągnąć'' kształt obiektu ze zdjęcia(skanowanie 3d za pomocą aparatu i lampki biurkowej :D . Felieton no nie wiem, po pierwsze chyba w tematykę serwisu nie wchodzi, po drugie ciężko się porównuje heurystyki…

    • Odbicie rozproszone (odbicie lambertowskie)…. przeczytałem na Wikipedii, ale nie jestem w stanie sobie wyobrazić jak to może pomóc w tego typu sprawach. Wyjaśnisz?

    • Sebek

      Najprostsza technika to Photometria Stereo(nie wiem jak to polsku bedzie ale chyba tak), majac kilka klatek tej samej sceny ale ze zmiennym oswietlniem mozemy obliczyc wektror normany kazdego piksela, potem zbudowac powierzchnie i siatke 3d, nie jest to takie proste ale w 2 slowach: rownanie opisujace zjawisko, trzeba dostarczyc dane == wyjdzie powierzchnia 3d, aha technika powstala dawno temu bo 1980 r. Troche obrazkow można obejrzec w google grafika, haslo: photometric stereo

    • Dzięki za rozjaśnienie ;)

  • kbm

    Fajny artykuł, przypomina skrypt do laborek :)

  • Tomas

    Tak się zastanawiam czy można by to wykorzystać w systemie kamer do rozpoznawania twarzy. Chodzi mi o monitoring mojego domku jednorodzinnego. Że kamerka wideo podłączona do kompa monitoruje drzwi wejściowe. Jak wykryje twarz to robi zdjęcie.

    Potem może je porównać z bazą i np. zostawić wpis w log, że ktoś był pod drzwiami, dzwonił, pukał a nas nie było. I w logu ładnie będzie:

    2012-01-01, 00:12: Tomasz Jankowski

    Da radę?

    • Sebek

      OpenCv da rade. Problemem moze byc tylko dostarczenie strumienia do programu i ewentualne bledy klasyfikatora podczas pracy(bez testow nie da rady – w nocy moze np. w szumie znalesc obiekt, no chyba ze podswietla sobie podczerwienia, ale i tak w nocy szumy powinny byc wieksze, zalezy od sprzetu). Dochodzi jeszcze aspekt, że aplikacja obciąży kompa w sposob ciagly, bedzie sie grzac, pobierac wiecej pradu ….. i tego typu pierdoly :D W OpenCV jest demo wykrywania twarzy w strumieniu, wystarczy wziasc i nieco przerobic.

    • Sebek

      a jeszcze jedno wykrycie obiektu to inny aspekt to ze program znajdzie twarz to jedno a identyfikacja/weryfikacja to drugie, tu już nie jest tak różowo bo zagadnienie dalej jest otwarte tzn. prace i badania trwają a super efektywnych metod nie ma :) (jeszcze)

    • Jacek

      Sebek bardzo ciekawie piszesz pomożesz mi rozkminić podstawy tego programu?
      http://www.youtube.com/watch?v=1FPzvkMrz4k
      z góry dzięki z jakiekolwiek informacje
      Pozdrawiam Jacek

  • Pingback: Rozpoznawanie twarzy na Raspberry Pi za pomocą OpenCV()

  • o_O

    >Listing 1: Prosty program wczytujący i wyświetlający plik graficzny.
    Czy CV to narzędzie do wykrywania obiektów w mapie pikseli, czy może aspituje do bycia biblioteką GUI? Bo już się pogubiłem. I autorzy OpenCV chyba też.
    Co to w ogóle za przykład, który nie mówi jak użyć tych najważniejszych funkcji OpenCV, a zamiast tego pokazuje jak wyświetlić obrazek, co w 99% zastosowań nie jest w ogóle potrzebne ani pożądane.

  • Pingback: Rozpoznawanie twarzy na Raspberry Pi za pomocą OpenCV()