Tags Posts tagged with "opencv"

opencv

przez -
3 1209
OpenVX

Khronos Group ogłosiło wydanie specyfikacji OpenVX 1.0, nowego API do akceleracji rozpoznawania obrazów (computer vision acceleration API). OpenVX ma być całkowicie wolnym standardem, a jego obecna forma ma charakter przeglądowy, aby więcej osób i podmiotów miało okazję to udoskonalić. OpenVX ma zwiększać wydajność i optymalizować algorytmy rozpoznawania obrazów w różnych zastosowaniach.

Zastosowania OpenVX:

  • Śledzenie ruchów twarzy, ciała i gestów
  • Inteligentne zarządzanie filmem
  • Automatyczne systemy wspomagania kierowców
  • Rekonstrukcja obiektów i scen
  • Rozszerzona rzeczywistość
  • Kontrola jakości
  • Robotyka

OpenVX będzie potrafił wykorzystywać akcelerację z użyciem tradycyjnych procesorów, procesorów graficznych, klastrów i innego dedykowanego sprzętu.

przez -
3 2996
Konsola program

OpenCV jest biblioteka open-source za pomocą której możliwe jest w czasie rzeczywistym przetwarzanie obrazu i  używania go w aplikacjach do np. mapowania gestów, śledzenia ruchu czy rozpoznawania twarzy. Pierre Raufas wykorzystał Raspberry Pi z modułem kamery i OpenCV do utworzenia aplikacji, która rozpoznaje twarze.

Pierre przygotował siedmioczęściowy poradnik jak tego dokonać, aby każdy mógł sprawdzić na własne oczy jak to działa.

Raspberry Pi

Już od dłuższego czasu dostępna w sklepach jest dedykowana kamera dla Raspberry Pi, która obsługiwana jest przez najnowsze wersje Raspbian-a. Kamera posiada 5 megapiksel-ową matrycę i pozwala nagrywać wideo o rozdzielczości do 1080p (1920×1080 pikseli) z 30 kl/s oraz robić zdjęcia o wielkości 2592 x 1944 pikseli. Do czego można użyć takiej kamery? Możliwości jest sporo zaczynając od monitoringu, nagrywaniu wideo czy robienia zdjęć po wykorzystanie kamery wraz z openCV do przetwarzania obrazu oraz jego analizowania. W tym artykule przedstawimy nasze wyniki testów odnośnie jakości przechwytywanych materiałów video oraz zdjęć z kamery.

Jakość zdjęć

Oświetlenie

Poniżej przedstawione są zdjęcia w pełnej rozdzielczości w świetle dziennym, sztucznym i bez oświetlenia (zaciemnionym pomieszczeniu).

Powyższe zdjęcia były robione z domyślnymi ustawieniami za pomocą polecenia

raspistill -o image.jpg

Możliwe jest ustawianie za pomocą filtrów m.in. kontrastu (opcja --contrast), balansu (opcja --awb), ekspozycji (opcja --exposure) jak również w najbliższym czasie ustawieniem ISO zdjęcia (opcja –ISO), która jest w przygotowaniu.

Efekty

Za pomocą opcji --imxfx możemy wybrać kilkanaście efektów m.in. negatyw, pastele, sępie czy efekt filmu.

Więcej informacji o filtrach dostępne jest w oficjalnych poradniku pomocy dostępny na tej stronie.

Film poklatkowy z serii zdjęć

Poniżej przedstawiony jest film poklatkowy wykonany z serii zdjęć za pomocą polecenia

raspistill -t 7200000 -tl 10000 -o image_num_%d_today.jpg

Zdjęcia robione były co 10 sekund.

Jakość video

Nagrywanie video za pomocą polecenia raspivid umożliwia rejestrowanie filmu z rozdzielczością 640x480p60/90 kl/s, 720p do 60 kl/s oraz 1080p/30 kl/s. Poniżej przedstawione są nagrania w kilku konfiguracjach.

720p – przy takiej rozdzielczości oraz 60 klatek na sekundę obraz jest płynny.

1080p – przy tej rozdzielczości oraz 30 klatek na sekundę zdarzają się zgubione klatki. Winna tego jest posiadana przez nas karta SD, która nie jest w stanie zapisywać ciągle takiej ilości danych.

Ruchomy obraz – użyta rozdzielczość 720p. Film wygląda płynnie. Nie widać zniekształceń obrazu. Drgania spowodowane wibracjami wiatraka oraz nawiewem.

Nagranie 640x480p z 90 klatkami na sekundę

Podsumowanie

Kamera jak na matrycę 5Mpix daje bardzo dobrej jakości zdjęcia, które bez problemu można przetwarzać. Jakość wideo daje duże możliwość, do przetwarzania obrazu w czasie rzeczywistym, jak również do późniejszej obróbki. Zapewne w najbliższym czasie znajdą się projekty typu OpenKinect, bazujące na Raspberry Pi z modułem kamery. Urządzenie z powodzeniem może służyć również, jako monitoring pomieszczeń, do strumieniowania obrazu czy do wykorzystania w robotyce lub w budowie wideo-domofonu. Ciężko znaleźć w przedziale cenowym 300 zł kamerę IP z takimi możliwościami, jak przedstawiona tutaj. Jedyną jej wadą jest kiepskie działanie w całkowitych ciemnościach, aczkolwiek już znaleźli się śmiałkowie, którzy zaradzają temu. Kamera warta jest wydania 120 – 140 zł nie tylko dla hackerów i dłubaczy, ale i dla zwykłej osoby początkującej, która znajdzie w niej sporo zabawy i możliwości.

Choć nie ma obecnie dostępnych obudowy dla kamery, da się obejść i bez niej:

montowanie kamery

Podziękowania

W podzięce za pomoc w realizacji nagrania pozwoliliśmy naszemu TUX-owi ochłodzić się troszkę :)

Programowanie

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.

Polecane

Jesień Linuksowa

1 1185
Polska Grupa Użytkowników Linuksa ma zaszczyt zaprosić na konferencję Jesień Linuksowa 2017, która odbędzie się w dniach 22 – 24 września 2017 roku. Jako...