19
A.A. 2010/2011 Elaborazione dell’Immagine M Introduzione a OpenCV Federico Tombari Samuele Salti

Introduzione a OpenCV - t3lab.it - opencv.pdf · Elaborazione dell’immagine M Federico Tombari, Samuele Salti Struttura di OpenCV 2.2 • Molte più librerie, permette di linkare

Embed Size (px)

Citation preview

Page 1: Introduzione a OpenCV - t3lab.it - opencv.pdf · Elaborazione dell’immagine M Federico Tombari, Samuele Salti Struttura di OpenCV 2.2 • Molte più librerie, permette di linkare

A.A. 2010/2011

Elaborazione dell’Immagine M

Introduzione a OpenCV

Federico Tombari

Samuele Salti

Page 2: Introduzione a OpenCV - t3lab.it - opencv.pdf · Elaborazione dell’immagine M Federico Tombari, Samuele Salti Struttura di OpenCV 2.2 • Molte più librerie, permette di linkare

Federico Tombari, Samuele SaltiElaborazione dell’immagine M

La libreria Open CV

• Open Computer Vision Library: collezione di algoritmi open source per la

computer vision e l’image processing

• Sviluppato originariamente da Intel, attualmente un team di sviluppatori è

finanziato da Willow Garage (http://opencv.willowgarage.com )

• Utilizza le IPP - Integrated Performance Primitives - di Intel (prestazioni

migliori su processori Intel)

• Versione attuale: 2.2

• Scaricabile gratuitamente da:

– http://sourceforge.net/projects/opencvlibrary

• Disponibile per ambiente Windows e Unix

• Nel nostro corso:

– S.O. : Windows-based

– Ambiente di sviluppo: Visual .NET 2005

– OpenCV: versione per windows!

Page 3: Introduzione a OpenCV - t3lab.it - opencv.pdf · Elaborazione dell’immagine M Federico Tombari, Samuele Salti Struttura di OpenCV 2.2 • Molte più librerie, permette di linkare

Federico Tombari, Samuele SaltiElaborazione dell’immagine M

Materiale delle esercitazioni

• Scaricabile al sito del corso:

– didattica.arces.unibo.it

– Prof. Luigi Di Stefano

– Elaborazione dell’Immagine LS

– Materiale didatttico

– Materiale relativo alle esercitazioni di laboratorio

– Software ElabImage, Libreria OpenCV e Documentazione (file zip)

– Progetto di esempio contenuto nella sotto-directory “Elabimage”

Page 4: Introduzione a OpenCV - t3lab.it - opencv.pdf · Elaborazione dell’immagine M Federico Tombari, Samuele Salti Struttura di OpenCV 2.2 • Molte più librerie, permette di linkare

Federico Tombari, Samuele SaltiElaborazione dell’immagine M

Struttura di OpenCV pre 2.2

• 4 librerie principali:

– CV: kernel delle funzioni di IP/CV

• Image processing

• Motion analysis

• Pattern recognition

• 3D reconstruction

• …

– CxCore: funzioni a supporto

• Strutture dati principali

• Accesso alle strutture dati (creazione, inserimento/modifica valori, copia, ..)

• Operazioni su matrici (aritmetiche, logiche, trasformazioni, permutazioni, ..)

• Disegno (punti, linee, curve, figure, ..)

• …

– HighGui: semplici operazioni di I/O:

• Creazione/distruzione finestre per mostrare immagini

• Apertura/salvataggio immagini

• Gestione flusso video (da file e da cam)

• …

– CvCam

Page 5: Introduzione a OpenCV - t3lab.it - opencv.pdf · Elaborazione dell’immagine M Federico Tombari, Samuele Salti Struttura di OpenCV 2.2 • Molte più librerie, permette di linkare

Federico Tombari, Samuele SaltiElaborazione dell’immagine M

Struttura di OpenCV 2.2

• Molte più librerie, permette di linkare solo con feature richieste

– core: definisce tipi base, come punti, vettori, matrici mono e multi-canale(immagini), algebra

lineare, DFT, XML e YAML I/O

– imgproc: filtraggio, morfologia, resize, remap, conversione spazi di colore, istogrammi, etc..

– highgui: Creazione/distruzione finestre per mostrare immagini, riproduzione di video,…

– calib3d: camera calibration, matching stereo,…

– features2d 2D feature detectors and descriptors (SIFT, SURF, FAST, etc., including the

new feature detectors-descriptor-matcher framework)

– flann: wrapper della Fast Library for Approximate Nearest Neighbors (FLANN 1.5) per la

ricerca dei Nearest Neighbors in spazi ad alta dimensionalità

– ml: algoritmi di machine learning (SVM, Decision Trees, Boosting etc.)

– objdetect: object detection in singole immagini(Haar & LBP face detectors, HOG people

detector etc.)

– video: algoritmi realtivi a sequenze video(tracking, optical flow, background subtraction,…)

– gpu: acceleration of some OpenCV functionality using CUDA (stereo, HOG, linear algebra)

– contrib: contributed code that is not mature enough (SpinImages, Chamfer distance, …)

– legacy: obsolete code, preserved for backward compatibility

Page 6: Introduzione a OpenCV - t3lab.it - opencv.pdf · Elaborazione dell’immagine M Federico Tombari, Samuele Salti Struttura di OpenCV 2.2 • Molte più librerie, permette di linkare

Federico Tombari, Samuele SaltiElaborazione dell’immagine M

Operazioni (un po’ più) avanzate

• Possibilità limitate di strumenti per l’interazione utente e per gestione di

Graphical User Interfaces

• Versione pre 2.2:

– Creazione di trackbars per modificare parametri (HighGui)

– Cattura “click” del mouse sulle immagini (HighGui)

– Stampa testo su immagini

• Versione 2.2 ma ancora sperimentale: Qt backend for OpenCV

– text rendering using TTF fonts,

– separate "control panel" with sliders, push-buttons, checkboxes and radio buttons

– interactive zooming, panning of the images displayed in highgui windows, “save

as“, etc…

• Per il progetto finale, per chi è interessato (facoltativo!) : Microsoft

Foundation Classes (MFC), Java, …

Page 7: Introduzione a OpenCV - t3lab.it - opencv.pdf · Elaborazione dell’immagine M Federico Tombari, Samuele Salti Struttura di OpenCV 2.2 • Molte più librerie, permette di linkare

Federico Tombari, Samuele SaltiElaborazione dell’immagine M

How to get Help!

• Nella cartella di installazione:

– /doc/opencv.pdf

Descrizione (più o meno) completa di ciascuna funzione della libreria

• Forum su Yahoo Groups:

– http://tech.groups.yahoo.com/group/OpenCV/

È possibile porre delle domande sul forum (sperando

che qualcuno risponda)

Page 8: Introduzione a OpenCV - t3lab.it - opencv.pdf · Elaborazione dell’immagine M Federico Tombari, Samuele Salti Struttura di OpenCV 2.2 • Molte più librerie, permette di linkare

Federico Tombari, Samuele SaltiElaborazione dell’immagine M

OpenCV pre 2.2 e VisualStudio

• Per installare e utilizzare OpenCV su VisualStudio 2005:– Una tantum:

Tools ->Options -> Projects and Solutions -> VC++ Directories:• Include files:

– PATH\OpenCV\otherlibs\highgui

– PATH\OpenCV\cxcore\include

– PATH\OpenCV\cvaux\include

– PATH\OpenCV\cv\include

– (PATH\OpenCV\otherlibs\cvcam\include)

• Library files:– PATH\OpenCV\lib

– Ad ogni nuovo progetto:

• Specificare i file .lib di OpenCV. In “Project -> Properties”, selezionare la scheda “Configuration Properties -> Linker -> Input” e aggiungere nel campo “Additional dependencies” una stringa del tipo:

– “cv.lib cvaux.lib cxcore.lib highgui.lib”

• Aggiungere i comandi di “#include” degli header di OpenCV all’inizio del codice che viene compilato nel progetto. Ad esempio:

– #include “highgui.h “

– #include “cv.h“

– #include “cxcore.h“

– #include “cvaux.h“

– ( #include “cvcam.h“ )

– Includere le DLL necessarie nella directory dell’eseguibile

Page 9: Introduzione a OpenCV - t3lab.it - opencv.pdf · Elaborazione dell’immagine M Federico Tombari, Samuele Salti Struttura di OpenCV 2.2 • Molte più librerie, permette di linkare

Federico Tombari, Samuele SaltiElaborazione dell’immagine M

OpenCV 2.2 e VisualStudio

• Per installare e utilizzare OpenCV 2.2 su VisualStudio 2005/2010:

– Ad ogni nuovo progetto:

• Aggiungere la cartella include di OpenCV alle include directories. In “Project ->Properties”, selezionare la scheda “Configuration Properties -> C/C++ -> General” e aggiungere nel campo “Additional Include Directories” una stringa del tipo:

– “ROOT_OPENCV\include”

• Aggiungere la cartella libs di OpenCV alle include directories. In “Project ->Properties”, selezionare la scheda “Configuration Properties -> C/C++ -> General” e aggiungere nel campo “Additional Include Directories” una stringa del tipo:

– “ROOT_OPENCV\lib”

• Specificare le libreire di OpenCV necesarie. In “Project -> Properties”, selezionare la scheda “Configuration Properties -> Linker -> Input” e aggiungere nel campo “Additional dependencies” una stringa del tipo:

– “opencv_core220.lib opencv_imgproc220.lib opencv_highgui220.lib”

• Aggiungere il comando di “#include” del header di OpenCV all’inizio del codice che viene compilato nel progetto. Ad esempio:

– #include “opencv2/opencv.hpp

– Includere le DLL necessarie

• nella directory dell’eseguibile

• Oppure includere il percorso che le contiene nella variabile PATH (dire sì quando l’installante lo richiede)

Page 10: Introduzione a OpenCV - t3lab.it - opencv.pdf · Elaborazione dell’immagine M Federico Tombari, Samuele Salti Struttura di OpenCV 2.2 • Molte più librerie, permette di linkare

Federico Tombari, Samuele SaltiElaborazione dell’immagine M

IplImage

• Struttura dati di base di OpenCV

• Deriva dalle ipl (Intel Image Processing Library – ora non più utilizzate)

• Contenuta in CxCore (pre 2.2) / opencv_core (2.2)

• Tutte le informazioni necessarie sono contenute sul doc di CxCore/core

Page 11: Introduzione a OpenCV - t3lab.it - opencv.pdf · Elaborazione dell’immagine M Federico Tombari, Samuele Salti Struttura di OpenCV 2.2 • Molte più librerie, permette di linkare

Federico Tombari, Samuele SaltiElaborazione dell’immagine M

Accesso agli elementi dell’immagine

•Immagini: bidimensionali, ma memorizzate come vettori monodimensionali:

(imagename -> imageData)[index]

•Necessario un cast, in quanto in IplImage il campo imageData è definito come char *:

((datatype *) (imagename -> imageData)) [index]

0 1 2 3

4 5 6 7

8 9 10 11

12 13 14 15

Rappresentazione logica Rappresentazione fisica

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

•Accesso ai dati in lettura/scrittura tramite un unico indice:

(row-1) * w + (column-1)

•Es. : elemento in 3° riga, 2° colonna (n° 9) : 2 * w + 1 = 2 * 4 + 1 = 9

1° riga 2° riga 3° riga 4° riga

w

h

Page 12: Introduzione a OpenCV - t3lab.it - opencv.pdf · Elaborazione dell’immagine M Federico Tombari, Samuele Salti Struttura di OpenCV 2.2 • Molte più librerie, permette di linkare

Federico Tombari, Samuele SaltiElaborazione dell’immagine M

0 1 2 p

3 4 5 p

6 7 8 p

9 10 11 p

Es: immagine 3x4 = 12 elementi; h= 4, w = 3, ws = 4.

Aggiunta una colonna di padding per l’allineamento in memoria

delle righe dell’immagine.

Per accedere all’elemento 7 dell’immagine (in coordinate: (r,c) = (3,2) ):

• usando Width: 2*w + 1 accedo all’elemento in rosso (senza significato)

• usando WidthStep: 2*ws + 1 accedo all’elemento in verde (corretto)

w ws

h

Accesso agli elementi dell’immagine (2)

• Nel caso IplImage: WidthStep non sempre coincide con Width. Occorre

sempre utilizzare WidthStep quando si fa indicizzazione dell’array dati di una

IplImage.

Page 13: Introduzione a OpenCV - t3lab.it - opencv.pdf · Elaborazione dell’immagine M Federico Tombari, Samuele Salti Struttura di OpenCV 2.2 • Molte più librerie, permette di linkare

Federico Tombari, Samuele Salti

Accesso agli elementi dell’immagine (3)

• Accesso con un unico indice è adatto solo per immagini che contengono byte

– Hanno profondità IPL_DEPTH_8U, IPL_DEPTH_8S

• Un metodo di accesso valido per ogni tipo di immagine è invece il seguente

((datatype *) (imagename -> imageData + (row-1)*ws)) [col-1]

• Stesso esempio di prima, con dati short (2 byte per dato)

Elaborazione dell’immagine M

Es: immagine 3x4 = 12 elementi; h= 4, w =

3, ws = 8 (è in byte).

w ws

h

0 1 2 p

3 4 5 p

6 7 8 p

9 10 11 p

short* p = ((short*) (imagename -> imageData + 2*ws))

p[1] è il dato richiesto

p

Page 14: Introduzione a OpenCV - t3lab.it - opencv.pdf · Elaborazione dell’immagine M Federico Tombari, Samuele Salti Struttura di OpenCV 2.2 • Molte più librerie, permette di linkare

Federico Tombari, Samuele Salti

Accesso agli elementi dell’immagine (4)

• Immagini a colori hanno 3 canali: Blue, Green, Red(BGR).

• I canali sono memorizzati in maniera interleaved

Elaborazione dell’immagine M

Rappresentazione logica

Rappresentazione fisica

0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5

1° riga 2° riga

0 1 2 3

4 5 6 7

8 9 10 11

12 13 14 15

0 1 2 3

4 5 6 7

8 9 10 11

12 13 14 15

w

0 1 2 3

4 5 6 7

8 9 10 11

12 13 14 15h

• Per accedere ad un colore di un pixel, bisogna moltiplicare per 3 l’indice di riga e

aggiungere l’offset giusto

B: ((datatype *) (imagename -> imageData + (row-1)*ws)) [3*(col-1)]

G: ((datatype *) (imagename -> imageData + (row-1)*ws)) [3*(col-1)+1]

R: ((datatype *) (imagename -> imageData + (row-1)*ws)) [3*(col-1)+2]

Page 15: Introduzione a OpenCV - t3lab.it - opencv.pdf · Elaborazione dell’immagine M Federico Tombari, Samuele Salti Struttura di OpenCV 2.2 • Molte più librerie, permette di linkare

Federico Tombari, Samuele SaltiElaborazione dell’immagine M

cv::Mat

• Struttura dati di base di OpenCV 2.2

• E’ una classe C++ contenuta nel namespace cv

• E’ dotata di costruttori e operatori di cast per convertire da e verso IplImage.

• Tutte le informazioni necessarie sono contenute nel C++ cheatsheet

• /doc/opencv_cheatsheet.pdf

• Organizzazione in memoria identica ad IplImage

• widthStep rimpiazzato da step, width da cols, height da rows

• Accesso al pixel

((datatype *) (imagename -> data + (col-1)*step)) [(row-1)]

oppure

imagename->at<datatype>(row-1, col-1);

• La memoria è rilasciata automaticamente dal distruttore

Page 16: Introduzione a OpenCV - t3lab.it - opencv.pdf · Elaborazione dell’immagine M Federico Tombari, Samuele Salti Struttura di OpenCV 2.2 • Molte più librerie, permette di linkare

Federico Tombari, Samuele Salti

cv::Mat

• Le operazioni di algebra lineare sono realizzate ridefinendo gli operatori, è

quindi possibile scrivere codice «alla MATLAB»

cv::Mat A(3,3,CV_8UC1);

cv::Mat B(3,3,CV_8UC1);

cv::Mat C = A – B; // Esegue sottrazione elemento per elemento

C = 255 – A; // Vecchia memoria di C deallocata, nuova matrice creata ed ogni elemento inizializzato con 255 meno il corrispondente di A

C = cv::abs(2*A – cv::min(B)); // Vecchia memoria di C deallocata, nuova matrice creata ed ogni elemento inizializzato con il

valore assoluto di 255 per il corrispondente di A meno il minimo elemento

di B, saturazioni gestite in automatico

//Risolvere un sistema lineare con la matrice pseudo-inversa

Mat x = (A.t()*A).inv()*(A.t()*b);

Elaborazione dell’immagine M

Page 17: Introduzione a OpenCV - t3lab.it - opencv.pdf · Elaborazione dell’immagine M Federico Tombari, Samuele Salti Struttura di OpenCV 2.2 • Molte più librerie, permette di linkare

Federico Tombari, Samuele SaltiElaborazione dell’immagine M

Esercizio 1 – “invert grey”

• Costruire il “negativo” di una immagine in scala di grigi

• Data una immagine in scala di grigi (range di ciascun pixel: [0 255]), sostituire

ad ogni pixel di intensità I il valore (255-I)

Page 18: Introduzione a OpenCV - t3lab.it - opencv.pdf · Elaborazione dell’immagine M Federico Tombari, Samuele Salti Struttura di OpenCV 2.2 • Molte più librerie, permette di linkare

Federico Tombari, Samuele SaltiElaborazione dell’immagine M

Esercizio 2 – “invert RGB”

• Come prima, ma in questo caso l’immagine della quale si vuole costruire il

negativo è a colori

• L’immagine è formata da 3 canali (al contrario del caso precedente,

riconducibile al caso di un singolo canale), relativi ai 3 valori RGB

• L’intensità su ciascun canale assume un valore compreso nel range [0 255]

• Per ogni pixel dell’immagine è dunque necessario sostituire la tripletta (B,G,R)

con la sua inversa (255-B, 255-G, 255-R)

Page 19: Introduzione a OpenCV - t3lab.it - opencv.pdf · Elaborazione dell’immagine M Federico Tombari, Samuele Salti Struttura di OpenCV 2.2 • Molte più librerie, permette di linkare

Federico Tombari, Samuele SaltiElaborazione dell’immagine M

Esercizio 3 – Image difference

Realizzare un nuovo progetto VisualStudio che esegua le seguenti operazioni:

1. Apertura di 2 immagini (Immagine 1, I1 e Immagine 2, I2)

2. Calcolo della differenza tra le 2 immagini:

• “costruire” una immagine di output in cui ogni pixel di coordinate (x,y) è la

differenza (in valore assoluto) dei corrispondenti pixel di I1 e I2:

Out(x,y) = abs(I1(x,y) – I2(x,y))

3. Visualizzazione sullo schermo dell’immagine di output