openCVsprawko

background image

Uniwersytet warmińsko-mazurski w

Olsztynie

Wydział nauk technicznych

Mechatronika

Studia Stacjonarne rok 3 semestr 6

Dwiczenia laboratoryjne

Urządzenia Mechatroniczne EIB

Przedmiot

Temat:

Przetwarzanie obraz z Open CV

Bartosz Pszczółkowski

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

Grupa 3/ Podgrupa -.

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

background image

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),

Astronomia,

Robotyka,

Radiologia,

Metrologia,

Sejsmologia,

Metalurgia,

Systemy zabezpieczeo i wiele innych.

2. 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śd
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
tworzyd 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ą poznawad 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ęcad czasu na pisanie bazowych funkcji w zaawansowanych

background image

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, bezpieczeostwo, 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.

3. 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ł byd czytelny i łatwy do przenoszenia, gdyż był podstawą dla
deweloperów, którzy mieli go rozwijad

http://opencv.willowgarage.com/wiki/

Można by się zastanawiad 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!

4. 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żywad
podczas zajęd zrealizowano operacje obróbki plików ”jpg” w Code::block . Visula studio
można pobrad ze strony

http://www.microsoft.com/express/downloads/

zaś Code::block z

http://www.codeblocks.org/downloads/binaries

w wersji webowej i później zainstalowad z

wykorzystaniem dostępu do Internetu. Jak już wspomniałem przy okazji statystyk, bibliotekę
można pobrad 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 :

background image

5. Architektura OpenCV

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

CV oraz CVaux – komponenty zawierające funkcję transformacji, filtracji oraz konwersji
przestrzeni obrazów, funkcję analizy obrazów takie jak selekcja, operacje morfologiczne,
detekcję krawędzi oraz obsługę histogramów, detekcję obiektów, kalibrację kamery,
rekonstrukcję sceny 3D i inne,

MLL – Machine Learning Library, jak sama nazwa wskazuje zawiera funkcje tworzenia
klasyfikatorów bazujących na statystyce odgrywających znaczącą rolę w uczeniu maszyn
sposobu detekcji,

HighGUI – zawiera metody akwizycji i zwalniania obrazów, sekwencji wideo, narzędzia
tworzenia interfejsu okienkowego, suwaków, obsługi myszy etc.

CxCore – Podstawowy komponent biblioteki zawiera operacje na tablicach, algebrę macierzy,
funkcje matematyczne, transformacje Fouriera, wsparcie dla plików XML, narzędzia
rysowania obiektów 2D i inne.

6. Praca z OPENCV

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

Gotowy program należy przekopiowad 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 podad ścieżkę do pliku szczególnej uwagi
w opcji drugiej wymaga sposób zapisywania ścieżki przykład

background image

„C:\\codeblock\\programy\\pierwszy_projekt_openCV poprzez zmianę Komedy codu podkreślonego
możemy edytowad obraz tak jak tylko

warunkiem jest znajomośd 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 .

7. Funkcje wykrywania twarzy

Open Cv oferuje także możliwośd 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



background image

#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

background image

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ętad 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żyd różnych plików XML a tym samym poszukiwad
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ęd profili do wyboru),
● górna częśd ciała (od pasa),
● dolna częśd 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źd zestaw niezbędnych programów
umożliwiających tworzenie własnych rozwiązao w tym zakresie a dokładny opis konfiguracji i
obsługi tego oprogramowania jest udostępniony za darmo i można go znaleźd 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 :

background image

Jak widad twarz został odnaleziona lecz jeszcze wspomnę proces jej poszukiwania trwał dosyd długo
około 3 s podkreślę ze ten obrazek jest dosyd mały i wartośd 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 inwestowad 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 byd bilansowany nie stawimy 100% na jakośd
gdyż czas oczekiwania na wyniki będzie bardzo długi musimy bilansowad szybkośd wyników do
rezultatów pracy .

8. OpenCV analizowanie filmów

Operacja ta niczym się nieróżni od poprzednich tylko zamiast pojedynczych klatek program musi
analizowad 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\\haarca

scade_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);

background image


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żyd 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 pokazad 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 spotkad pokaźną
ilośd materiałów lecz poleca się do rozpoczęcia tej pracy zapoznanie z program Vitusa studio gdyż
większośd pokazów i operacji jest wykonywanych właśnie na nim lecz to jest tylko uwaga nic nie
stoi na przeszkodzie aby dale współpracowad 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