openCVsprawko

Uniwersytet warmińsko-mazurski w Olsztynie

Wydział nauk technicznych

Mechatronika

Studia Stacjonarne rok ….. semestr …..

Ćwiczenia laboratoryjne

Urządzenia Mechatroniczne EIB

Przedmiot

Temat: Przetwarzanie obraz z Open CV

Bartosz Pszczółkowski

……………………………………………….

…….…………………………………………

……………………………………………….

Grupa 3/ Podgrupa -.

Data : . . ./ . . ./ 201…

  1. Czym jest przetwarzanie obrazu ?

Każdego dnia dokonujemy decyzji na podstawie analizy informacji odbieranych przez narządy zmysłów. Najwięcej danych, bo aż 90% dostarczają oczy, dlatego też głównie na podstawie tego, co widzimy podejmujemy odpowiednie działania. W celu zautomatyzowania stanowiska pracy zajmowanego przez człowieka, należy budowad urządzenia bazujące na wizji maszynowej – automatyczne systemy wizyjne, będące elektronicznym odpowiednikiem wzroku.

Faktem jest, iż efektywnośd wykorzystywania wspomnianych systemów rośnie z dnia na dzieo. Co więcej, coraz więcej gałęzi nauki czerpie z dużych możliwości jakie daje przetwarzanie obrazów. Znanymi od wielu lat dziedzinami wykorzystującymi analizę obrazu są:

Medycyna – analiza obrazów biomedycznych (np. radiografia, rezonans magnetyczny, tomografia komputerowa, ultrasonografia, morfologia, mammografia cyfrowa. Za pomocą przetwarzania obrazów zaobserwowano m.in. 62% wzrost skuteczności diagnozy płodowych wad rozwojowych i ginekologii, 28% wzrost ilości informacji diagnostycznej przy badaniach wątroby i przewodu żółciowego),

  1. Wstęp do biblioteki openCV

OpenCV (Open Source Computer Vision library) jest bezpłatną, open-source’ową biblioteką do użytku komercyjnego i edukacyjnego, bez konieczności udostępniania swoich projektów opartych o jej implementację. Została napisana w języku C i C++ i rozwijana jest za pomocą programow w wielu językach programowania takich jak C#, Python, Ruby, Matlab czy Java. Posiada wielu użytkowników na całym świecie – doskonałym przykładem jest grupa tematyczna o OpenCV na portalu Yahoo, która aktualnie posiada ponad 48.000 użytkowników.

Biblioteka ta została stworzona na potrzeby aplikacji czasu rzeczywistego gdzie wydajność obliczeniowa programów jest bardzo istotna. Napisana jest w zoptymalizowanym języku C/C++ i wykorzystuje możliwości jakie dają popularne od kilku lat procesory wielordzeniowe.

Jednym z głównych celów biblioteki OpenCV jest dostarczenie narzędzia, które pozwoli tworzyć zarówno proste programy jak również zaawansowane projekty ludziom z różnym poziomem wiedzy na temat programowania i przetwarzania obrazów. Amatorzy za pomocą OpenCV i kamery internetowej mogą poznawać elementy przetwarzania obrazów w zakresie: wykrywania krawędzi, segmentacji czy filtracji obrazów bez większego wysiłku. Zaś sami specjaliści nie muszą poświęcać czasu na pisanie bazowych funkcji w zaawansowanych

projektach – nigdy więcej wymyślania koła! Możliwe jest to dzięki wbudowanym w bibliotekę ponad 500 funkcjom, które obejmują wiele obszarów komputerowej wizji takich jak robotyka, stereowizja, bezpieczeństwo, analiza obrazów medycznych czy kalibracja kamery. Wiele projektów wykorzystujących zdjęcia z lotu ptaka czy mapowanie ulic takie jak – „Google Maps”, czy „Google Street’s View”, wykorzystuje kalibracje kamery oraz metody „zszywania” obrazów, które są częścią OpenCV. Bezzałogowe samoloty, urządzenia do detekcji obiektów czy układy monitoringu również oparte są o wizje komputerową.

Inspiracją do zgłębienia tematyki OpenCV był artykuł „Innovations from a robot rally” w SCIENTIFIC AMARICAN[1] o wyścigu „Grand Challange” przeznaczony dla autonomicznych pojazdów. Wyścig odbył się w październiku roku 2005, a organizatorem była amerykaoska agencja DARPA, zajmująca się rozwojem technologii wojskowej. Samochód „Stanley” – Volkswagen Touareg przejechał samodzielnie trasę 212 km po pustyni Mojave oraz południu Las Vegas w czasie 6 godzin i 54 minut. Jedną z głównych ról przy projektowaniu systemu wizyjnego odegrała właśnie biblioteka OpenCV.

  1. Głównymi celami OpenCV

Głównymi celami OpenCV jakie zostały założone w trakcie jej budowania było stworzenie darmowego, otwartego i zoptymalizowanego kodu dla podstawowych funkcji przetwarzania obrazów. Kod ten musiał być czytelny i łatwy do przenoszenia, gdyż był podstawą dla deweloperów, którzy mieli go rozwijać http://opencv.willowgarage.com/wiki/

Można by się zastanawiać dlaczego Intel stworzył bardzo pomocą bibliotekę dla deweloperów całkowicie za darmo. Idea była bardzo prosta – wykorzystanie tej biblioteki pomagało w projektowaniu aplikacji wymagających dużej mocy obliczeniowej, a tym samym szybkich procesorów. Sprzedaż komponentów firmy Intel była bardziej opłacalna niż wypuszczenie na rynek dodatkowego oprogramowania. Pomysł mógł byd zrealizowany tylko przy dużej popularności tej biblioteki. Intel nie pomylił się z prognozami – do tej pory ze strony projektu http://sourceforge.net/projects/opencv/ biblioteka OpenCV została ściągnięta 2.858.950 razy, co stanowi 40.5 TB danych!

  1. Pobieranie i instalacja

Aplikacje stworzone na potrzeby tej pracy projektowałem za pomocą aktualnej wersji OpenCV oraz środowiska Visual Studio C++ 2010 Express. Visual Studio Express jest wersją darmową jednakże nie jesteśmy ograniczeni kompilatorami których będziemy używać podczas zajęć zrealizowano operacje obróbki plików ”jpg” w Code::block . Visula studio można pobrać ze strony http://www.microsoft.com/express/downloads/ zaś Code::block z http://www.codeblocks.org/downloads/binaries w wersji webowej i później zainstalować z wykorzystaniem dostępu do Internetu. Jak już wspomniałem przy okazji statystyk, bibliotekę można pobrać ze strony projektu – najlepiej wersję wykonywalną (OpenCV-2.1.0-win32-vs2008.exe). Następnie instalujemy OpenCV otwierając ściągnięty plik. Wskazujemy miejsce docelowe instalacji biblioteki (domyślnie C:\OpenCV2.1) wraz z określeniem zmiennej systemowej PATH – informuje system, w którym miejscu znajdują się pliki dynamicznych bibliotek DLL (Dinamic-Link Library) OpenCV. Po zainstalowaniu możemy przejśd do tworzenia nowego projektu. W tym celu otwieramy Visual Studio C++ Express z menu START bądź włączamy code::block a, Następnie otwieramy nowy projekt:

Szczegółowa instrukcja przygotowania programu code::block do pracy :

  1. Architektura OpenCV

OpenCV składa się z pięciu podstawowych komponentów:

  1. Praca z OPENCV

Gotowy program należy przekopiować do programu w który wybraliśmy do pracy realizacja zostanie przedstawiona w programie code::block

Gotowy program należy przekopiować do kompilatora

#include "opencv2/highgui/highgui.hpp"

#include <iostream>

using namespace cv;

using namespace std;

int main( int argc, const char** argv )

{

Mat obraz = imread("test.jpg", CV_LOAD_IMAGE_UNCHANGED /*odczytanie danyc z pliku test.jpg i umieszczenie ich w obiekcie należy piętac o tym żeby plik operacyjny był zawarty w naszym katalogu zapisu programu w innym przypadku należy podać ścieżkę do pliku szczególnej uwagi w opcji drugiej wymaga sposób zapisywania ścieżki przykład „C:\\codeblock\\programy\\pierwszy_projekt_openCV poprzez zmianę Komedy codu podkreślonego możemy edytować obraz tak jak tylko warunkiem jest znajomość kodów i posiadanie odpowiednich bibliotek umożliwiających edytowanie obrazów */

if (obraz.empty()) //jeżeli obiekt jest pusty nie ma pliku program zasygnalizuje błąd

{

cout << "Blad : brak pliku!!" << endl;

return 1;

}

namedWindow("OknoGlowne", CV_WINDOW_AUTOSIZE); /*utworzenie okna dialogowego o nazwie OknoGlowne*/

imshow("OknoGlowne", obraz//wyswietlenie zawartosci obiektu w oknie OknoGlowne

waitKey(0); //Czekaj na dowolny klawisz

destroyWindow("OknoGlowne"); //zniszcz okno (zamknij je i usun wszystkie informacjie)

return 0;

}

Przykład obrazu ukazanego w odcieniach szarości :

Po przetworzeniu obrazu przed przetworzeniem

To jest tylko prosta sztuczka z kopiowaniem i podmianą kodu możliwości są o wiele większe

Link do kursu : w języku polskim : http://cpp0x.pl/kursy/Kurs-OpenGL-C++/101 lecz do bardziej zawansowanych prac poleca się stronę http://opencv-srf.blogspot.com/ oraz fora lecz wymagają one znajomości języka angielskiego .

  1. Funkcje wykrywania twarzy

Open Cv oferuje także możliwość wykrywania poszczególnych obiektów na obrazach

Począwszy od wykrywania nosa po maszyny wojenne wymaga to tylko podania odpowiednich bibliotek do programu i zaczęcia pracy

Instrukcja przygotowania programu do zadania :

  1. Włączamy code::block tworzymy nowy project .

  2. Kopiujemy poniższy kod programu

#include <iostream>

#include <opencv2/highgui/highgui.hpp>

#include "opencv2/objdetect/objdetect.hpp"

#include "opencv2/imgproc/imgproc.hpp"

using namespace cv;

using namespace std;

string nazwa_okna = "Okno detekcja obrazu";

const string nazwa_obrazu = "face.jpg";/*ścieżka pliku bądź dodajemy do pliku w tym przypadku to face.jpg lecz nic nie stoi na przeszkodzie żeby to była ścieżka do pliku przypominam ze plik znajduje się w katalogu projektu */

string nazwa_kaskady = "haarcascade_smile.xml";

CascadeClassifier kaskada_1;

void detectFace( Mat obraz );

int main( int argc, char** argv )

{

Mat obraz; //tworzymy obiekt macierzy

obraz = imread( nazwa_obrazu ); //zaczytujemy obraz

if ( !obraz.data ) //kontrola błędów odczytu początek

{

cout << "Nie znaleziono grafiki " << nazwa_obrazu << ".";

return -1; //brakuje pliku

}

if( !kaskada_1.load( nazwa_kaskady ) )

{

cout << "Nie znaleziono kaskady " << nazwa_kaskady << ".";

return -2; //brak kaskady

}

//kontrola błędów odczytu koniec

namedWindow(nazwa_okna, CV_WINDOW_AUTOSIZE);

detectFace(obraz);

waitKey(0); // dowolny przycisk zniszczy wszystkie dane

destroyWindow(nazwa_okna); // dowolny przycisk zniszczy wszystkie dane

return 0;

}

void detectFace( Mat obraz ) //pobiera obraz macierz zadeklarowaną

{

vector<Rect> obiekt; /* deklaracja tabeli wektorowej Macierz obraz_szarosci gdzie zawierała będzie współrzędnej wierzchołków prostokąta analizującego obraz*/

Mat obraz_szrosci;

cvtColor(obraz, obraz_szarosci, CV_BGR2GRAY ); // konwert z bgr do gray

kaskada_1.detectMultiScale(obraz_szarosci, obiekt, 1.1, 3, 0|CV_HAAR_SCALE_IMAGE, Size(50, 50) ); //funkcja wykrywajaca obiekt 1.1, 3, 0 wielkosc kwadrat i powiekszania x1.1 i wielkosc .. Size(50, 50) wielkosc minimalna twarzy

for( unsigned i = 0; i < obiekt.size(); i++ ) // pentla rysująca prostokąt

{

Rect obiekt_otoczony( obiekt[i] );

rectangle(obraz, obiekt_otoczony, Scalar( 0, 255, 0 ), 2, 2, 0 ); /*definiujemy kolor ramki

kolory ramek znajdziemy na stonie http://pl.wikipedia.org/wiki/Kolory_w_Internecie .*/

}

imshow(nazwa_okna, obraz); //wyswietlamy nasze okno

}

3. Po przekopiowaniu klucza należy pamiętać o sprawdzeniu błędów i poprawieniu kodu czyli operacje wyrównania linii itp. Gdyż program word zagęszcza tekst do formatu A4

4. kopiowanie kronik .xml do katalogu zawierającego program bądź dodanie ich do katalogów programu mianowicie Detekcja twarzy odbywa się za pomocą biblioteki OpenCV. Szukany obiekt rozpoznawany jest podstawie danych zawartych w pliku XML, w którym zapisane są definicje poszukiwanych obiektów. Do procesu można użyć różnych plików XML a tym samym poszukiwać różnych obiektów. Aktualnie biblioteka OpenCV zawiera wiele typów danych porównawczych zapisanych w postaci plików XML (opencv/sources/data/haarcascades) tj.:

● oczy,

● nos,

● usta,

● twarz (pięć profili do wyboru),

● górna część ciała (od pasa),

● dolna część ciała (do pasa),

● całe ciało ludzkie, i inne kształty.

Dodatkowo Biblioteka OpenCv umożliwia konstruowanie własnych klasyfikatorów Haar’a dla wybranego obiektu. W podkatalogu biblioteki można znaleźć zestaw niezbędnych programów

umożliwiających tworzenie własnych rozwiązań w tym zakresie a dokładny opis konfiguracji i

obsługi tego oprogramowania jest udostępniony za darmo i można go znaleźć w źródle :

http://note.sonots.com/SciSoftware/haartraining.html

Wizualizacja całego procesu:

https://vimeo.com/12774628

przykład wyników operacji dla poszukiwania twarzy :

Jak widać twarz został odnaleziona lecz jeszcze wspomnę proces jej poszukiwania trwał dosyć długo około 3 s podkreślę ze ten obrazek jest dosyć mały i wartość szerokości jest nie duża ,wyobraźmy sobie zdjęcie z lustrzanki powyżej 16Mpikseli obraz tego typu jest wielko krotni większy wiec i proces się wydłuży za każdym razem można inwestować komputery o wyższej mocy obliczeniowej

Ale co jeśli będziemy animowali film w najlepszym przypadku 24 klatki na sekundę . dążę do tego ze proces analizowania i przetwarzanie obrazu powinien być bilansowany nie stawimy 100% na jakość gdyż czas oczekiwania na wyniki będzie bardzo długi musimy bilansować szybkość wyników do rezultatów pracy .

  1. OpenCV analizowanie filmów

Operacja ta niczym się nieróżni od poprzednich tylko zamiast pojedynczych klatek program musi analizować ich ciąg w czasie

Kod programu wygląda następująco ;

#include <opencv2/objdetect/objdetect.hpp>

#include <opencv2/highgui/highgui.hpp>

#include <opencv2/imgproc/imgproc.hpp>

#include <iostream>

#include <stdio.h>

using namespace std;

using namespace cv;

int main(int argc, const char** argv)

{

CascadeClassifier kaskada_twarz;

kaskada_twarz.load("C:\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml");

//VideoCapture captureDevice;

//captureDevice.open(0);

VideoCapture captureDevice; //

captureDevice.open("http://192.168.0.106:8080/video?x.mjpeg");

Mat ramkaFilmu;

Mat ramkaSzarosci;

namedWindow("outputCapture", 1);

while(true)

{

captureDevice>>ramkaFilmu;

cvtColor(ramkaFilmu, ramkaSzarosci, CV_BGR2GRAY);

equalizeHist(ramkaSzarosci, ramkaSzarosci);

vector<Rect> faces;

kaskada_twarz.detectMultiScale(ramkaSzarosci, faces, 1.1, 3, CV_HAAR_FIND_BIGGEST_OBJECT|CV_HAAR_SCALE_IMAGE, Size(30,30));

for(int i = 0; i < faces.size(); i++)

{

Point pt1(faces[i].x + faces[i].width, faces[i].y + faces[i].height);

Point pt2(faces[i].x, faces[i].y);

rectangle(ramkaFilmu, pt1, pt2, cvScalar(0, 255, 0, 0), 1, 8, 0);

}

imshow("outputCapture", ramkaFilmu);

waitKey(33);

}

return 0;

}

Po raz kolejny należy zwarcic na przywrócenie kodu do normalności po modyfikacjach Word

Jak można zauważyć w Ścieszce odczytu jest adres telefonu który udostępniał obraz z wbudowanej kamery program obecny jest wyczulany na wykrywanie twarzy lecz możliwości obliczeniowe komputera na były w stanie pokazać obrazu biorącego występowało opóźnienie które z biegiem odczytu się wydłużało .

W celu dalszej nauki poleca się Tutoriale openCV na stronie youtube można spotkać pokaźną ilość materiałów lecz poleca się do rozpoczęcia tej pracy zapoznanie z program Vitusa studio gdyż większość pokazów i operacji jest wykonywanych właśnie na nim lecz to jest tylko uwaga nic nie stoi na przeszkodzie aby dale współpracować z Code::block.


Wyszukiwarka

Podobne podstrony:
2009 10 OpenCV – systemy wizyjne [Programowanie]
0 OpenCV Wprowadzenie do OpenCV
2 OpenCV RS232
openCVsprawko
Rafał Petryniak Detekcja ruchu w OpenCV porównanie klatek

więcej podobnych podstron