Lab1 Obsługa obrazów


Systemy Wizyjne
Kurs OpenCV
Instrukcja 1
Obsługa obrazów
Operacje na pikselach
ROI
Rysowanie
Tekst na ekranie
Mysz
Suwaki
Opracował: Ziemowit Dworakowski zdw@agh.edu.pl
Informacja o ćwiczeniu:
Ta instrukcja wprowadza informacje i funkcje służące do podstawowej obsługi obrazów:
Wczytywanie obrazu, zapis obrazu na dysk, wyświetlanie, działania na poszczególnych pikselach
obrazu, wyznaczanie ROI, wykonywanie podstawowych rysunków i wyświetlanie tekstu,
korzystanie z myszki oraz tworzenie suwaków do zmian parametrów
Potrzebne funkcje:
W dzisiejszej instrukcji należy skorzystać z bibliotek core oraz imgproc
Odczyt i zapis obrazu:
Obrazy w OpenCV przechowujemy w obiektach klasy Mat. Deklarujemy je np tak:
Mat obraz1;
Mat obraz2;
Mat obraz3, obraz4;
Aby wczytać obraz z pliku wykorzystujemy funkcję imread podając nazwę pliku wraz ze ścieżką
dostępu do niej oraz sposób wczytania obrazu. Na potrzeby tej instrukcji wczytywać będziemy
obrazy jako kolorowe:
string nazwa = "C:\\Users\\Student\\Desktop\\OpenCVPrograms\\image1.jpg";
obraz1 = imread(nazwa, CV_LOAD_IMAGE_COLOR);
Za pomocą funkcji imread wczytywać można również obrazy w skali szarości:
CV_LOAD_IMAGE_GRAYSCALE oraz bez precyzowania rodzaju obrazu (Tak, jak zapisany):
CV_LOAD_IMAGE_UNCHANGED. Obrazy zapisujemy korzystając z funkcji imwrite, podając
lokalizację i nazwę obrazy zapisanego oraz nazwę Mat-a który ma zostać zapisany. W tym
przypadku brakuje ścieżki do pliku, co oznacza że obraz zapisany zostanie w folderze z
programem:
imwrite("ObrazTestowy.jpg",obraz2);
Aby wyświetlić obraz na ekranie należy stworzyć okno w którym obraz będzie wyświetlany a
następnie wyświetlić w nim odpowiedni Mat. Wybranie funkcji CV_WINDOW_NORMAL pozwoli
użytkownikowi na zmianę rozmiaru okna:
namedWindow("OKNO", CV_WINDOW_AUTOSIZE);
namedWindow("DRUGIEOKNO", CV_WINDOW_NORMAL);
imshow("OKNO",obraz);
imshow("DRUGIEOKNO",obraz);
Działania na poszczególnych pikselach obrazu:
Aby opisać w jaki sposób możemy odczytać i zmodyfikować wartość konkretnego piksela obrazu
stworzymy na początek macierz Mat "ręcznie", poprzez określenie jej rozmiarów i wykorzystanej
metody. CV_8UC1 oznacza, że korzystamy z 8 bitów na piksel (256 możliwych wartości każdego
piksela) i jednego kanału barwnego (Sprawdz w tutorialu inne możliwości!)
Mat E = Mat(10 , 10, CV_8UC1);
Stworzony obraz możemy wypełnić losową treścią korzystając z funkcji randu przyjmującej nazwę
obrazu oraz minimalną i maksymalną wartość dopuszczalną w obrazie (Wyświetl obraz po tej
operacji, aby zobaczyć, jak wygląda):
randu(E,0,255);
Pole data w klasie Mat jest wskaznikiem do pierwszego piksela obrazu. Możemy poruszać się po
obrazie korzystając z tej informacji:
uchar* pointer = E.data + 6;
Po takiej operacji wskaznik pointer pokazuje na 6 piksel obrazu. Możemy teraz zmienić jego
wartość:
*p = 255;
Aby uzyskać współrzędną y naszego obrazu można skorzystać z pola rows w klasie Mat. Poniższa
operacja zmodyfikuje piksel w 6 kolumnie i 5 rzędzie macierzy:
uchar* p = E.data + E.rows*4+6;
*p = 100;
W przypadku korzystania z obrazu wielokanałowego aby określić szerokość macierzy dodatkowo
skorzystać trzeba z ilości kanałów (pole E.channels()) zastanów się lub sprawdz w tutorialu jak i
dlaczego.
Wyznaczanie ROI
Region Of Interest (ROI) to podobraz będący częścią obrazu zródłowego, który z jakiegoś powodu
jest dla nas interesujący. ROI może służyć do wyodrębnienia fragmentu obrazu zawierającego
istotne dla nas obiekty, do obcięcia części obrazu zawierającej zakłócenia lub obszar nieistotny z
punktu widzenia zadania, które przed nami stoi. ROI z obrazu tworzymy komendą:
Mat obraz_roi (obraz, Rect(10, 10, 100, 100) )
gdzie obraz_roi to nazwa nowo utworzonego Mat-a, obraz to obraz zródłowy a Rect(10, 10, 100,
100) to sposób wycięcia obrazu (w tym wypadku prostokąt o określonych współrzędnych).
Zauważ, że korzystamy tutaj z jednego z konstruktorów wbudowanego w klasę Mat.
Rysowanie:
OpenCV pozwala na rysowanie prostych kształtów geometrycznych.
Aby rysować kształty przydatne będzie zdefiniowanie elementów pomocniczych: punktów i
kolorów. Punkt o współrzędnych int x,y;
Point Pkt1 = Point(x, y);
Kolor kształtów określimy za pomocą obiektu Scalar, w którym trzy wartości odpowiadają
składowym R,G,B:
Scalar colour = Scalar(230,0,230);
Linia na obrazie Mat image; zaczynająca się w punkcie Pkt1, a kończąca w punkcie Pkt2. Pozostałe
parametry odpowiadają wcześniej zdefiniowanemu kolorowi oraz zmiennym typu int określającym
grubość i rodzaj linii:
line( image,Pkt1,Pkt2,colour,thickness,lineType);
Elipsa na obrazie Mat image o środku w punkcie Pkt1, szerokości 100x50 px, nachylona pod kątem
int angle angle z przedziału 0-360 stopni:
ellipse( image,Pkt1,Size(100, 50),angle,0,360,colour,thickness,lineType );
Okrąg na obrazie Mat image, o środku w punkcie Pkt1 i promieniu int radius:
circle( image,Pkt1,radius,colour,thickness,lineType );
Prostokąt na obrazie Mat image rozpięty na przekątnej między punktami Pkt1 i Pkt2
rectangle( image,Pkt1,Pkt2,colour,thickness,lineType );
Wyświetlanie tekstu:
Tekst na obraz wstawić można za pomocą funkcji putText, precyzując na jakim obrazie tekst ma być
wstawiony (Tu: Mat image), Jak ma brzmieć, Gdzie ma się rozpoczynać (Pkt1), fggJaką czcionką
będzie napisany (int fonttype) i jakiej będzie wielkości (int size):
putText( image, "Testing text rendering", Pkt1, fonttype, size, colour, thickness,lineType);
Praca z myszą:
Jeżeli chcemy wskazać punkt na obrazie myszą, w treści programu wykorzystać można funkcję
setMouseCallback, która sprawdza, czy nie wydarzyło się coś związanego z myszą (poruszenie
wskaznika, wciśnięcie przycisku) na określonym oknie a następnie uruchamia funkcję zarządzającą
tym wydarzeniem. W przypadku okna o nazwie "OKNO" oraz funkcji o nazwie "Reakcja" linijka w
kodzie programu będzie wyglądała tak:
setMouseCallback( "OKNO", Reakcja, 0 );
Reakcję trzeba w jakiś sposób zdefiniować. Jest to funkcja przyjmująca w argumentach między
innymi wydarzenie związane z myszą (event), oraz współrzędne obrazu na których do wydarzenia
doszło (x i y). Treść funkcji powinna odpowiadać naszym oczekiwaniom. Np funkcja wypisująca
współrzędną x kursora po kliknięciu lewego przycisku będzie zdefiniowana następująco:
static void onMouse( int event, int x, int y, int, void* )
{
if( event == EVENT_LBUTTONDOWN ) cout << "Pozycja x myszy:" << x << endl;
}
Przykłady zdarzeń:
EVENT_LBUTTONDOWN // Wciśnięty lewy przycisk
EVENT_MBUTTONDBLCLK // Podwójne kliknięcie środkowym klawiszem
EVENT_RBUTTONUP // Puszczony prawy klawisz (jednorazowo, po kliknięciu)
Tworzenie suwaka
Suwak (trackbar) umożliwiający użytkownikowi zmianę parametru tworzymy komendą
createTrackbar. Jako przykład suwaka zaprezentujemy suwak do zmiany wartości zmiennej th. Na
początku należy zdefiniować nazwę suwaka (Tu: TrackbarName), wskazać okno, w którym będzie
wyświetlany (Tu: OKNO1), określić parametr który będzie zmieniany (Tu: int th), podać zakres
suwaka oraz połączyć z nim odpowiednią funkcję (Tu: function).
createTrackbar("TrackbarName", "OKNO1", &th, 255, function );
Funkcja wywoływana jest za każdym razem, gdy użytkownik zmieni wartość parametru za pomocą
suwaka. W tym przypadku po każdorazowej zmianie parametru program wyświetla na ekran jego
aktualną wartość:
void function( int, void* )
{
printf("%d\n",th);
}


Wyszukiwarka

Podobne podstrony:
Lab1 RoboWorks
obsługa pojazdu Egzamin
DNS ObslugaNazw
obsluga wiertarki stolowej
Rozdział 04 System obsługi przerwań sprzętowych
Instrukcja obsługi bankomatu 1
APD lab1
Instrukcja obsługi Przenośna uniwersalna ładowarka USB Nokia DC 18
instrukcja obslugi Sagemcom DSI83
Instrukcja obsługi alarm Logic CAN LC 5 wyd 1 (2)
Nokia16 UG pl instrukcja obsługi
Instrukcja obsługi Ferguson Ariva T65 PL v1 50
Elementarz obsługi człowieka
OLYMPUS µ [mju] III 80 instrukcja obsługi

więcej podobnych podstron