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 rozwija

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.