La libreria OpenCV - 2 - Preliminari sui Video

OpenCV

Continuano gli articoli preliminari per la libreria OpenCV. Il codice visto nel precedente articolo faceva riferimento solo a funzioni per caricare e visualizzare immagini. Ma per i video? Quali sono le funzioni di base per iniziare a lavorare sui video? Per prima cosa abbiamo bisogno, per l'appunto, di un video di prova. Potete scaricare un semplice file .avi da qui (è un breve video che mostra una funzione periodica in movimento). Adesso, chiamatelo input_video.avi e mettetelo nella cartella del vostro nuovo progetto C++. Dopo aver linkato le librerie come spiegato nei primi articoli, procedete a provare il codice seguente.


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

using namespace std;

int main( int argc, char** argv )
{
    IplImage  *frame;
    int key;
    CvCapture *capture = cvCaptureFromAVI( "input_video.avi" );
	if (capture == NULL) {
		cout << "Loading Error!" << endl;
		exit(-1);
	}

    if( !capture ) return 1;
    int fps = ( int )cvGetCaptureProperty( capture, CV_CAP_PROP_FPS );
    while( key != 'q' ) {
        frame = cvQueryFrame( capture );
        if( !frame ) break;
        cvShowImage( "video", frame );
        key = cvWaitKey( 1000 / fps );
    }

    cvReleaseCapture( &capture );
    cvDestroyWindow( "video" );

    return 0;
}

Probabilmente i più acuti di voi avranno pensato: "Ma come??? Lavoriamo sui video e non abbiamo incluso la libreria video.h???" Questo perchè quello che facciamo in questo esempio è semplicemente visualizzare un video, quindi tutto quello che ci serve è dentro highgui.h (ricordate, funzioni di I/O ecc...).

La prima nuova struttra dati che incontriamo è CvCapture. Un puntatore del genere ci serve per fare riferimento al video che catturiamo. Per attribuirgli il video che abbiamo appena scaricato, utilizziamo la funzione cvCaptureFromAVI() che prende come parametro il path del suddetto video.

Un'altra funzione importante di highgui.h è cvGetCaptureProperty(), che prende in ingresso il riferimento ad un video e, attraverso parametri definiti di OpenCV, la specifica proprietà del video che vogliamo ottenere. In particolare, le proprietà restituite dalla funzione sono:

  • CV_CAP_PROP_POS_MSEC - la posizione in millisecondi del video;
  • CV_CAP_PROP_POS_AVI_RATIO - posizione relativa del video (0 per l'inizio, 1 per la fine);
  • CV_CAP_PROP_FRAME_WIDTH - larghezza dei frame nello stream video;
  • CV_CAP_PROP_FRAME_HEIGHT - altezza dei frame nello stream video;
  • CV_CAP_PROP_FPS - frame rate;
  • CV_CAP_PROP_FOURCC - codice di 4 caratteri che indica il codec del video;
  • CV_CAP_PROP_FRAME_COUNT - numero di frame del video;

Entriamo adesso in un ciclo while finchè non è premuto il tasto Q della tastiera o non finisce il video. Per fare ciò, attraverso la funzione cvQueryFrame() ci facciamo restituire il frame attuale del video e lo referenziamo con un puntatore a IplImage (dopo tutto, un video lo possiamo pensare come una sequenza di immagini). Il controllo ci dice che se il frame è vuoto, possiamo uscire dal while perchè il video è terminato. Altrimenti, sempre grazie alla funzione cvShowImage() mostriamo il frame sul monitor. Prima di terminare il processo, sono rilasciate le strutture dati che abbiamo allocato (finestra e video).

Se voi foste muniti di webcam, lo stesso codice vi può far visualizzare in una finestra ciò che in questo momento sta inquadrando la vostra camera. L'unica modifica che dovete apportare al codice è sostituire la riga in cui inizializziamo capture con cvCaptureFromAvi() con la funzione:

CvCapture *capture = cvCreateCameraCapture( index );

index è un intero che identifica la vostra videocamera (nel caso ne aveste più di una collegata al pc). Se ne avete una sola, dovete passare 0 alla funzione.

Nel prossimo breve tutorial, vi sarà spiegato come salvare in memoria un'immagine grazie ad OpenCV

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 - 2 - Preliminari sui Video ultima modifica: 2012-10-07T15:44:27+01:00 da Alessio Antonielli


Advertisment ad adsense adlogger