Introduzione a OpenCV
Transcript
Introduzione a OpenCV
A.A. 2010/2011 Elaborazione dell’Immagine M Introduzione a OpenCV Federico Tombari Samuele Salti 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! Elaborazione dell’immagine M Federico Tombari, Samuele Salti 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” Elaborazione dell’immagine M Federico Tombari, Samuele Salti 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 Elaborazione dell’immagine M Federico Tombari, Samuele Salti 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 Elaborazione dell’immagine M Federico Tombari, Samuele Salti 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, … Elaborazione dell’immagine M Federico Tombari, Samuele Salti 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) Elaborazione dell’immagine M Federico Tombari, Samuele Salti 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 Elaborazione dell’immagine M Federico Tombari, Samuele Salti 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) Elaborazione dell’immagine M Federico Tombari, Samuele Salti 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 Elaborazione dell’immagine M Federico Tombari, Samuele Salti 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 4 8 h 12 1 5 9 13 2 6 10 14 w 3 7 11 15 Rappresentazione logica 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1° riga 2° riga 3° riga 4° riga Rappresentazione fisica •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 Elaborazione dell’immagine M Federico Tombari, Samuele Salti 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. 0 3 6 h 9 1 4 7 10 w ws 2 p 5 p 8 p 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) Elaborazione dell’immagine M 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) w p h 0 3 6 9 1 4 7 10 2 5 8 11 ws p p p p Es: immagine 3x4 = 12 elementi; h= 4, w = 3, ws = 8 (è in byte). short* p = ((short*) (imagename -> imageData + 2*ws)) p[1] è il dato richiesto Elaborazione dell’immagine M 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 w 0 4 8 h 12 0 1 2 4 5 6 0 1 2 3 8 9 10 4 5 6 7 1 2 12 3 13 14 8 9 10 11 5 6 7 12 13 14 15 9 10 11 13 14 15 3 7 11 15 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 1° riga 2° riga Rappresentazione fisica Rappresentazione logica • 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] Elaborazione dell’immagine M Federico Tombari, Samuele Salti 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 Elaborazione dell’immagine M 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 Federico Tombari, Samuele Salti 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) Elaborazione dell’immagine M Federico Tombari, Samuele Salti 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) Elaborazione dell’immagine M Federico Tombari, Samuele Salti 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 Elaborazione dell’immagine M Federico Tombari, Samuele Salti