La libreria OpenCV - 12 - selezionare aree di immagini

Scrivo questo semplice tutorial come premessa ad un progettino al quale sto lavorando da qualche settimana e che a breve (si spera) sarà trattato anche sul sito. Magari chi ci segue anche su twitter ha già visto alcune immagini a riguardo. In quest tutorial vedremo perciò come selezionare staticamente una porzione di immagine da visualizzare in finestra.
Quello che ci serve è la struttura dati Rect della libreria core. Rect rappresenta il template per un rettangolo 2D nella libreria OpenCV. Gli unici attributi sono le coordinate del punto di origine (in alto a sinistra), il valore della base ed il valore dell'altezza. Tra i metodi, una citazione di merito va a alle funzioni area() che restuisce l'area del rettangolo e contains(Point p) la quale restituisce true se il punto p è contenuto nel rettangolo o false altrimenti.

Un'altra feature interessante di questa struttura dati sono tutti gli overload fatti sugli operatori di base che permettono di "mixare" con facilità più oggetti Rect. Vi mostro di seguito le operazioni possibili prese dalla documentazione di OpenCV:

  • rect = rect +- point (shifting del rettangolo di un certo offset)
  • rect = rect +- size (espansione o contrazione del rettangolo di un certo valore)
  • rect = rect1 & rect2 (intersezione fra rettangoli)
  • rect = rect1 | rect2 (minimo rettangolo che li contiene)
  • rect &= rect1, rect |= rect1 (operazioni binarie)
  • rect == rect1, rect != rect1 (confronto fra rettangoli)
  • Utilizzando queste operazioni già implementate sarà facile, per esempio, controllare se due rettangoli si intersecano o sono annidati (uno dentro l'altro).

    Esiste più di un costruttore per questa classe. Per esempio un Rect può essere inizializzato sia tramite il suo punto in alto a sinistra e la coppia altezza/base del rettangolo, sia esplicitando i punti (intesi come oggetti Point) in alto a sinistra e in basso a destra del rettangolo.

    Se vogliamo visualizzare solo una porzione conosciuta di un'immagine ci basteranno quindi queste due righe di codice:

    
    // inizializazione
    	Mat image = imread("image.jpg");
            Point pt1 = Point(20,20);
            Point pt2 = Point(100,100);
    
    // instanziazione del rettangolo di maschera
    	Rect roi = Rect(pt1, pt2);
    
    // applicazione della maschera sull'immagine
    	Mat img = image(roi);
    
    // la sezione di immagine è mostrata a video
            namedWindow(wndname, 1);
            imshow(wndname, img);
    

    Con questo veloce tutorial volevo anche scusarmi a nome di tutto lo staff per questo ultimo periodo di latitanza.
    Potrei citare le parole di Leo Ortolani sul suo blog:
    "Insomma… abbiate pazienza se questo blog rallenterà il ritmo, è che sulla sabbia si corre più lentamente.
    Non è che vi ho voltato le spalle."

    In realtà non siamo sulla spiaggia in questo periodo (per lo meno non tutti...), ma siamo tutti oberati dagli impegni universitari. Questo significa però che appena sarà tutto finito preparatevi ad una inondazione di articoli sui progettini universitari che abbiamo portato avanti negli ultimi mesi.

    Alessio Antonielli

    Ingegnere informatico, appassionato di cinema, musica, videogiochi e serie tv. Insomma, le solite cose che vi aspettereste da un ex studente di Ingegneria Informatica, giusto per rafforzare lo stereotipo…

    La libreria OpenCV - 12 - selezionare aree di immagini ultima modifica: 2013-06-30T17:47:21+01:00 da Alessio Antonielli


    Advertisment ad adsense adlogger