OpenCv: acquisizione stream video

OpenCv è una libreria multipiattaforma di computer vision, open source, che conta moltissimi algoritmi di analisi dell’immagine e svariati campi di applicazione come:

  • motion tracking
  • gesture recognition
  • stereopsis
  • face detection
  • object identification

Nell’ambito del controllo e dell’automazione in genere, il riconoscimento e l’elaborazione immagine sono fondamentali, infatti l’immagine catturata dalla telecamera se opportunamente elaborata è in grado di fornire moltissime informazioni, come reperire misure, riconoscere forme o oggetti e inseguirli.

In questo post vedremo come recuperare lo stream video dalla webcam, visualizzarlo in una finestra ed infine come applicare un filtro effetto soglia regolabile.

INSTALLAZIONE

Per prima cosa occorre installare la libreria sul proprio pc, se il tuo sistema operativo è Linux, questo link fa al caso tuo.

LET’S START

Una volta installata la libreria, gedit aperto, siamo pronti per scrivere l’Hello World di OpenCv: acquisizione dello stream da una webcam, fino a quando non viene premuto il tasto ‘q’ che chiude lo stream.

passo 1. header files

includiamo gli header files necessari, per l’elaborazione dell’immagine e la creazione di una finestra.

 C |  copy code |? 
1
2
#include <stdio.h>
3
#include "cv.h"
4
#include "highgui.h"
5

passo 2. variabili

dichiariamo le variabili che useremo nel nostro programma, ovvero uno stream video che chiamiamo capture, un IplImage (struttura atta a contenere tutte le informazioni dell’immagine come dimensioni, canali, profondità pixel etc.) su cui salveremo di volta in volta un frame dello stream ed infine una variabile key in cui salviamo il tasto premuto dalla tastiera

 C |  copy code |? 
1
2
CvCapture   *capture;
3
int         key;
4
IplImage *frame;
5

passo 3. main function

Come tutti i programmi definiamo la funzione di partenza, ovvero il main all’interno del quale, apriamo lo stream video per mezzo della funzione cvCaptureFromCAM e lo associamo alla variabile capture. Se al computer è collegata una sola webcam all’argomento della funzione basta passare -1, in questo modo la porta a cui è collegata verrà automaticamente trovata. In caso di errore, ovvero non viene riconosciuta la webcam, il programma non viene avviato. In caso contrario, il passo successivo consiste nel creare una finestra che si autoadatta, chiamata “video”.

 C |  copy code |? 
1
2
int main( int argc, char** argv )
3
{
4
 
5
    capture = cvCaptureFromCAM( 0 );
6
    if( !capture ) return 1;
7
    cvNamedWindow( "video", CV_WINDOW_AUTOSIZE );
8

passo 4. while

creiamo un ciclo while, che fino a quando non viene premuta la lettera ‘q’, cattura un frame dallo stream video, lo salva nella variabile frame e lo visualizza nella finestra “video”

 C |  copy code |? 
1
2
   while( key != 'q' ) 
3
    {
4
    frame = cvQueryFrame( capture );
5
      if( !frame ) break;
6
         key = cvWaitKey( 1 );
7
         cvShowImage( "video", frame );
8
    }
9

passo 5. release risorse

l’ultimo passo consiste nel rilascio delle risorse (stream video, finestra e frame ) e della chiusura del main.

 C |  copy code |? 
1
2
    cvDestroyWindow( "video" );
3
    cvReleaseCapture( &capture );
4
    cvReleaseImage( &frame);
5
    return 0;
6
}

codice completo

 C |  copy code |? 
01
02
#include <stdio.h>
03
#include "cv.h"
04
#include "highgui.h"
05
 
06
 
07
CvCapture   *capture;
08
int         key;
09
IplImage *frame;
10
 
11
int main( int argc, char** argv )
12
{
13
 
14
    capture = cvCaptureFromCAM( 0 );
15
    if( !capture ) return 1;
16
    cvNamedWindow( "video", CV_WINDOW_AUTOSIZE );
17
 
18
    while( key != 'q' ) 
19
    {
20
    frame = cvQueryFrame( capture );
21
      if( !frame ) break;
22
         key = cvWaitKey( 1 );
23
         cvShowImage( "video", frame );
24
    }
25
 
26
    cvDestroyWindow( "video" );
27
    cvReleaseCapture( &capture );
28
    cvReleaseImage( &frame);
29
    return 0;
30
}
31

COMPILAZIONE ED ESECUZIONE

Per la compilazione apriamo il terminale e posizioniamoci nella cartella in cui si trova il file appena creato, supponiamo si chiamo prova.cpp a questo punto digitiamo:

 C |  copy code |? 
1
2
g++ `pkg-config --cflags opencv` prova.cpp -o prova `pkg-config --libs opencv` 
3

Il compilatore restituirà un file chiamato prova che può essere eseguito sempre rimanendo nella stessa cartella con il comando:

 C |  copy code |? 
1
2
 ./prova

Bisogna considerare che una volta acquisito, il frame può essere elaborato a piacimento grazie alle moltissime funzioni messe a disposizione dalla libreria di OpenCv (da un’occhiata alla Reference), nel prossimo post verrà mostrato l’effetto soglia regolabile per mezzo dei canali HSV dell’immagine.

Vuoi saperne di più? questo link potrebbe interessarti

fra_celi

fra_celi

Salve, mi chiamo Francesco, e sono attualmente tirocinante presso l`NTNU di Trondheim. Sono appassionato alla tecnologia in generale e soprattutto tutto ciò che riguarda automazione, elettronica, informatica.

More Posts

Tags:
By fra_celi | maggio 2nd, 2012 | SHOW COMMENT(1)
  • http://www.facebook.com/kobrabyte Vincenzo Cicogna

    Bella fra ;)