Extensions Image, Audio et Vidéo Administration et programmation

Extraction d'une prise de vue ou d'une image

L'extension Vidéo permet d'extraire une prise de vue ou une image à partir d'un objet vidéo. Pour cela, vous devez préalablement ouvrir l'objet vidéo pour la détection de prises de vue. L'extension Vidéo utilise un index pour accéder aux images et aux prises de vue. Vous devez donc préalablement créer un index pour la séquence vidéo pour pouvoir effectuer une extraction.

Une fois que la séquence vidéo est ouverte et l'index créé, vous pouvez extraire la prise de vue ou l'image suivante de la vidéo ou une image particulière en indiquant son numéro. L'extension Vidéo prend en charge les séquences vidéo au format MPEG-1. Si vous envisagez d'utiliser l'image extraite avec un programme exigeant le format RGB, il est possible d'effectuer une conversion de format à l'aide d'une API de l'extension Vidéo.

Ouverture d'une séquence vidéo pour la détection de prises de vue

Utilisez l'API DBvOpenFile pour ouvrir une séquence vidéo stockée dans un fichier. Le fichier doit être accessible à partir du poste client. Utilisez l'API DBvOpenHandle pour ouvrir une séquence vidéo stockée dans une table de base de données. L'application doit préalablement se connecter à la base de données. En outre, l'extension Vidéo copie la séquence vidéo dans un fichier temporaire. Ce fichier est créé dans le répertoire désigné par la variable d'environnement client DB2VIDEOTEMP. L'ouverture d'une séquence vidéo initialise la fonction de détection de prises de vue. L'extension Vidéo définit un pointeur orienté sur le début de la séquence (image 0).

Lorsque vous utilisez l'une de ces API, vous devez pointer sur une zone contenant le pointeur indiquant la structure de données vidéo (DBvIOType). L'extension Vidéo alloue cette structure en réponse à l'appel de l'API et l'utilise pour stocker des informations relatives à la séquence vidéo. Cette structure désigne également la structure de données d'image (DBvFrameData) contenant la composition en pixels de l'image en cours. Pour obtenir une description de ces structures, reportez-vous à la section Structure des données de détection de prises de vue. Pour l'API DBvOpenFile, vous devez aussi indiquer le nom du fichier vidéo. En ce qui concerne l'API DBvOpenHandle, vous devez préciser le descripteur vidéo.

Par exemple, les instructions suivantes permettent d'ouvrir un objet vidéo stocké dans un fichier en vue de la détection de prises de vue :

DBvIOType    *videoptr;
 
rc=DBvOpenFile (
       &videoptr,                         /* pointeur sur la structure vidéo */
       "/Employés/vidéo/rdurand.mpg");  /* fichier vidéo */

Les instructions suivantes permettent d'ouvrir un objet vidéo stocké dans une table de base de données en vue de la détection de prises de vue :

EXEC SQL BEGIN DECLARE SECTION;
char Vid_hdl[251];
  EXEC SQL END DECLARE SECTION;
 
DBvIOType    *videoptr;
 
EXEC SQL SELECT VIDEO INTO :Vid_hdl
       FROM EMPLOYEE
WHERE NAME="Anne Dupont";
 
rc=DBvOpenHandle(
       &videoptr,                         /* pointeur sur la structure vidéo */
       vid_hdl);                          /* descripteur vidéo */

Indexation d'un objet vidéo

L'extension Vidéo utilise un index pour accéder aux images et aux prises de vue d'une séquence vidéo. Cet index doit être créé préalablement et permet d'extraire les images ou les prises de vue (le format MPEG ne fournit pas d'index pour les images et les prises de vue). L'index met les numéros d'images en correspondance avec les flux de bits composant une séquence vidéo MPEG-1.

Vous pouvez créer un index pour une séquence vidéo à l'aide de l'API DBvCreateIndexFromVideo API ou DBvCreateIndex. Cependant, si vous avez ouvert la séquence vidéo pour détecter les prises de vue en utilisant l'API DBvOpenFile ou DBvOpenHandle, il n'est pas nécessaire de créer explicitement un index ; l'extension Vidéo en crée automatiquement un (pour savoir comment ouvrir une séquence vidéo, reportez-vous à la section Ouverture d'une séquence vidéo pour la détection de prises de vue).

Lorsqu'un index est créé (explicitement ou automatiquement), l'extension Vidéo DB2 tente de stocker l'index dans le même chemin que le fichier vidéo. Il commence par tenter de stocker le fichier index en tant que fname.ext.idx, fname étant le nom du fichier vidéo et ext son extension. Si cette tentative échoue, l'extension Vidéo tente de stocker le fichier en tant que fname.idx dans le même répertoire que celui du fichier vidéo. Si cette tentative échoue, il tente de stocker le fichier index dans le répertoire local, d'abord en tant que fname.ext.idx, puis en tant que fname.idx.

A l'ouverture du fichier, l'extension Vidéo cherche le fichier index dans l'ordre suivant :

  1. Priorité de la version en écriture sur une version en lecture seulement.
  2. Priorité d'un fichier index situé dans le même chemin que celui du fichier vidéo sur un fichier index situé dans le répertoire en cours.
  3. Priorité d'un index dont le nom estfname.ext.idx sur un index dont le nom est fname.idx (fname correspond au nom du fichier vidéo et ext à son l'extension).

Par exemple, si un index est créé pour un fichier vidéo dont le nom est myvideo.mpg, l'extension Vidéo recherche en premier lieu un index en écriture dont le nom est myvideo.mpg.idx dans le même chemin que celui du fichier vidéo.

Lorsque vous utilisez l'API DBvCreateIndexFromVideo, précisez la structure de données DBvIOType. L'extension Vidéo stocke le nom du fichier d'index dans la structure. Pour une description de cette structure, reportez-vous à la section Structure des données de détection de prises de vue. Par exemple, les instructions suivantes permettent de créer un index pour une séquence vidéo qui a été ouverte auparavant pour une détection de prises de vue :

DBvIOType    *video;
 
rc=DBvCreateIndexFromVideo(
       video);                  /* pointeur sur la structure vidéo */
 

Lorsque vous utilisez l'API DBvCreateIndex, précisez le nom du fichier vidéo. L'extension Vidéo stocke l'index dans un fichier (sous le même répertoire que la séquence vidéo). Par exemple, les instructions suivantes permettent de créer un index pour un fichier vidéo (ce dernier n'a pas été précédemment ouvert pour une détection de prises de vue) :

rc=DBvCreateIndex(
       "/Employés/vidéo/rdurand.mpg");  /* fichier vidéo */

Il est également possible de déterminer s'il existe un index pour une séquence vidéo. Utilisez pour cela l'API DBvIsIndex. L'API définit une variable d'état par 0 s'il n'existe pas d'index, et par 1 s'il en existe un. Par exemple, les instructions suivantes permettent de déterminer s'il existe un index pour une séquence vidéo :

      short *status
 
rc=DBvIsIndex(
       "/Employés/vidéo/rdurand.mpg"    /* fichier vidéo */
       &status);                         /* indicateur d'état */

Sauvegarde de l'index vidéo : Sauvegardez le fichier d'index vidéo au cas où vous auriez besoin de le récupérer. Ce fichier se trouve sous le même répertoire que l'extension Vidéo.

Extraction d'une image

Vous pouvez extraire l'image en cours d'une séquence vidéo ou définir l'image en cours par un numéro d'image spécifique. Utilisez l'API DBvGetFrame pour extraire l'image en cours d'une séquence vidéo. Pour définir l'image en cours par un numéro d'image spécifique, utilisez l'API DBvSetFrameNumber.

Lorsque vous utilisez l'API DBvGetFrame, précisez la structure vidéo. Par exemple, les instructions suivantes permettent d'extraire l'image en cours d'une séquence vidéo :

DBvIOType    *video;
 
rc=DBvGetFrame(
       video);                  /* pointeur sur la structure vidéo */

Lorsque vous utilisez l'API DBvSetFrameNumber, précisez la structure vidéo et le numéro de l'image que vous voulez définir comme image en cours. Par exemple, les instructions suivantes permettent de définir le numéro 85 pour l'image en cours, puis d'extraire cette dernière :

DBvIOType    *video;
 
rc=DBvSetFrameNumber(
       video,              /* pointeur sur la structure vidéo */
       85);                     /* numéro de l'image */ 
 
rc=DBvGetFrame(
       video);                  /* pointeur sur la structure vidéo */

En sortie, l'API DBvSetFrameNumber réinitialise la zone currentFrame de la structure DBvIOType. L'API DBvGetFrame place le contenu en pixels de l'image dans la structure DBvFrameData. Pour obtenir une description de ces structures, reportez-vous à la section Structure des données de détection de prises de vue.

Extraction d'une prise de vue

Pour extraire la prise de vue suivante d'une séquence vidéo, utilisez l'API DBvDetectShot. Lorsque vous utilisez cette API, vous devez pointer sur les structures de données suivantes :

Vous devez également pointer sur une image à laquelle doit commencer la recherche. L'extension Vidéo commence la recherche de la prise de vue suivante à partir de ce point de la séquence vidéo.

En sortie de l'API, l'extension Vidéo définit un indicateur shotDetected et pointe sur la première image de la prise de vue suivante, ainsi que sur ses données. Lorsque l'indicateur shotDetected est égal à 1, une prise de vue a été détectée. Dans ce cas, l'extension Vidéo :

Lorsque l'indicateur shotDetected est égal à 0, aucune prise de vue n'a été détectée. Dans ce cas, l'extension Vidéo renvoie un code indiquant que la fin de la séquence vidéo a été atteinte.

Pour obtenir une description de ces structures, reportez-vous à la section Structure des données de détection de prises de vue.

Par exemple, les instructions suivantes permettent de rechercher la prise de vue suivante d'une séquence vidéo :

auto width=100.DBvIOType    *video;
long start_frame = 1;
char shotDetected = 0;
DBvShotControl    shotCtrl;
DBvShotType    shot;
 
shotCtrl>method=DETECT_CORRHIST
shotCtrl>normalCorrValue=60;
shotCtrl>sceneCutSkipXY=1;
shotCtrl>CorrHistThresh=10;
shotCtrl>DissThresh=10;
shotCtrl>DissCacheSize=4;
shotCtrl>DissNumCaches=7;
shotCtrl>minShotSize=0;
 
rc=DBvDetectShot(
       video,              /* pointeur sur la structure vidéo */
       start_frame,        /* première image pour la recherche */
       &shotDetected,      /* indicateur de détection de prises de vue */
                           /* 1 = détecté, 0 = non détecté */
       shotCtrl,           /* pointeur sur structure de contrôle de prise de vue */
       &shot);             /* pointeur sur la structure de type de prise de vue */

Conversion du format d'une image extraite

Le contenu d'une image MPEG-1 est au format YUV. Ce format comprend des informations sur le plan des pixels de luminance, des pixels Cr et des pixels Cb d'une image.

Pour modifier une image vidéo, il peut être utile de convertir l'image du format YUV au format RGB. L'extension Vidéo fournit l'API DBvFrameDatato24BitRGB qui permet de convertir une image extraite MPEG-1 du format YUV au format RGB 24 bits. Pour utiliser l'API, vous devez tout d'abord allouer une mémoire tampon cible.

Lorsque vous émettez l'API, vous devez pointer sur la mémoire tampon cible et les données d'image à convertir. Vous devez aussi indiquer la hauteur et la largeur de l'image. Toutes ces données peuvent être extraites de la structure DBvIOType correspondante. Par exemple, les instructions suivantes permettent de convertir une image MPEG-1 au format RGB 24 bits :

char RGB[18000];
DBvIOType    *video;
DBvFrameData   fd;
 
rc=DBvGetNextFrame(
       video);                  /* pointeur sur la structure vidéo */
 
fd=video.fd
dx=video.dx
dy=video.dy
 
rc=DBvFrameDataTo24BitRGB (
       RGB,                      /* pointeur sur la mémoire tampon cible */
       &fd,                      /* pointeur sur les données d'image */
       dx,                       /* largeur de l'image */
       dy);                      /* hauteur de l'image */

Fermeture d'un fichier vidéo

L'API DBvClose permet de fermer un fichier vidéo qui a été ouvert pour une détection de prises de vue. Lorsque vous utilisez cette API, vous devez définir un pointeur sur la structure vidéo du fichier.

Par exemple, les instructions suivantes permettent de fermer un fichier vidéo ouvert pour une détection de prises de vue :

DBvIOType    *video;
 
rc=DBvClose (video);

Affichage d'une image extraite

Le contenu d'une image MPEG-1 extraite est au format YUV que la plupart des programmes d'affichage d'images ne peuvent pas afficher. Vous devez donc le convertir dans un format pouvant être affiché, tel que le format BMP. Par exemple, pour afficher une image MPEG-1, vous pouvez procéder de la manière suivante :

  1. Utilisez l'API DBvFrameDatato24BitRGB pour convertir une image MPEG-1 extraite du format YUV au format RGB 24 bits. Pour plus d'informations sur l'utilisation de l'API DBvFrameDatato24BitRGB, reportez-vous à la section Conversion du format d'une image extraite.
  2. Ajoutez un en-tête approprié à l'image convertie. Par exemple, le format BMP nécessite un en-tête comprenant des informations telles que la largeur et la hauteur de l'image.
  3. Copiez le contenu de l'image (avec son en-tête) dans un fichier.
  4. Utilisez ensuite l'API DBiBrowse pour afficher le contenu du fichier. Pour plus d'informations, reportez-vous à la section Utilisation des API d'affichage ou de lecture.


[ Début de page | Page précédente | Page suivante | Table des matières | Index ]