La libreria OpenCV - 3 - Salvare Immagini

OpenCV

Prima di andare avanti con i tutorial, un piccolo appunto che mi è stato fatto notare da Andrea Salvi, membro dello staff e sostanzialmente grafico del sito (sì, è lui il creatore del fighissimo logo di Alla fine del Palo).
Nei precedenti articoli, abbiamo fatto riferimento a IplImage, ma questa struttura è un residuato dell'interfaccia C di OpenCV. Sarebbe più giusto utilizzare oggetti della classe Mat che sono parte di una struttura C++, quindi la gestione della memoria è molto più semplice (non c'è bisogno di fare release sull'oggetto). In ogni caso, entrambe le strutture derivano dalla classe CvArr, e sono perciò facilmente intercambiabili. Quindi, grazie ad Andrea per il suo intervento.

Il bello della libreria OpenCV è che non solo comprende funzioni di Image Analysis molto specifiche, utilizzabili a basso livello, ma contiene anche, già pronte per l'uso, funzioni di sistema utilissime, come quelle di cui andiamo a parlare in questo articolo. Abbiamo visto come aprire e visualizzare un'immagine, come fare sostanzialmente la stessa cosa anche con i video; vediamo adesso quali funzioni esistono per salvare in memoria un'immagine. Per prima cosa, procuriamoci un'immagine salviamola nella cartella del nostro nuovo progetto (magari chiamandola "image.jpg").

#include <iostream>
#include <opencv/cv.h>
#include <opencv/highgui.h>

using namespace std;
using namespace cv;

int main()
{
          Mat* img = (Mat*)cvLoadImage("image.jpg");
          if(!img){
        	  cout << "Loading Error!" << endl;
          }
          CvSize sz = cvGetSize(img);
          Mat* dst = (Mat*)cvCreateImage(sz , IPL_DEPTH_8U, 1);
          cvCanny(img, dst, 30, 60, 3);
          int result=cvSaveImage("image_2.jpg",dst);
          if(!result){
        	  cout << "Saving Error!" << endl;
          }
          cvNamedWindow("MyWindow");
          cvShowImage("MyWindow", dst);
          cvWaitKey(0);
          cvDestroyWindow("MyWindow");
          return 0;
}

Veniamo alle nuove procedure introdotte in questo semplice programma. La prima che salta subito all'occhio è cvCanny(). Possiamo anche evitare di parlare con precisione di questa funzione per adesso (vi assicuro che è già pronto un articolo piuttosto specifico a riguardo perchè è un argomento molto importante per l'Image Analysis). cvCanny() sarebbe l'implementazione dell'algoritmo di Canny, la procedura più famosa per l'Edge Detection. Per ora prendetela come una "black box" ed intendetela come un funzione che prende un'immagine e la modifica.
Prima di cvCanny() vediamo anche cvGetSize(), una semplice funzione che prende in ingresso un'immagine e restituisce un oggetto CvSize che mantiene il size (height e width) dell'immagine data come parametro.

La funzione più importante di questo esempio è però cvSaveImage():

int cvSaveImage( const char* filename, const CvArr* image );

La funzione prende in ingresso il filename dell'immagine che andrà a creare ed il puntatore all'oggetto CvArr che rappresenta la nuova immagine. Una funzione del genere può servire per esempio per estrarre frame da un video e salvarli sul disco fisso per riutilizzarli in seguito.

Per quanto riguarda l'algoritmo di Canny, il prossimo tutorial (che a breve sarà pubblicato) comprenderà una parte teorica allo scopo di introdurvi all'argomento nel modo più conciso e pratico possibile.

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 - 3 - Salvare Immagini ultima modifica: 2012-10-23T18:11:56+01:00 da Alessio Antonielli


Advertisment ad adsense adlogger