Extensions Image, Audio et Vidéo Administration et programmation

Modèle de programme de recherche QBIC

La La figure suivante est un extrait d'un programme codé en C qui crée et exécute une requête QBIC. Ce programme effectue une recherche d'images par couleur moyenne. Il invite l'utilisateur à entrer le nom d'une couleur ou d'un fichier image. L'utilisateur peut également exploiter une image renvoyée par une requête comme échantillon graphique pour une recherche ultérieure. Le programme utilise alors la couleur nommée ou la couleur de l'image comme couleur moyenne pour effectuer une recherche dans une colonne d'images.

Vous trouverez le programme complet dans le fichier QBICDEMO.C du sous-répertoire SAMPLES. Il peut être utilisé pour rechercher des images par couleur d'histogramme, positionnelle, ou moyenne. Pour exécuter le programme complet, vous devez d'abord exécuter les modèles de programme ENABLE, POPULATE et QBCATDMO (qui se trouvent également dans le sous-répertoire SAMPLES). Pour plus d'informations sur les modèles de programmes, reportez-vous à l'Annexe B, Modèles de programmes et fichiers de support.

Notez les points suivants sur la dans le programme d'essai :

(1)Inclusion du fichier en-tête dmbqbapi.

(2)Invite d'entrée des informations sur la base de données.

(3)Connexion à la base de données.

(4)Création d'un objet de requête.

(5)Ajout d'une caractéristique à l'objet de requête.

(6)Invite d'entrée relative au type d'entrée (nom de couleur, fichier image ou image précédemment extraite).

(7)Indication de la source de données pour la caractéristique. La source de données est une spécification explicite de la couleur moyenne.

(8)Lancement de la requête. L'extension Image effectue la recherche dans la totalité de la colonne d'images. Elle indique également le nombre maximal d'images à renvoyer (10).

(9)Affichage de l'image suivante du jeu d'images renvoyées. Pour plus d'informations sur l'affichage des images, reportez-vous à la section Affichage d'un objet image ou vidéo en grandeur réelle.

(10)Suppression de l'objet de requête.

Le sous-répertoire SAMPLES comprend un autre programme montrant comment créer et utiliser une requête QBIC. Ce programme, QbicQry.java, permet à l'utilisateur de préciser graphiquement les critères de recherche pour une requête QBIC. Par exemple, il propose une palette de couleurs permettant de sélectionner la couleur moyenne et convertit l'option choisie en chaîne de requête.

Figure 21. Modèle de programme de recherche QBIC

#include <sql.h>
#include <sqlcli.h>
#include <sqlcli1.h>
#include <dmbqbqpi.h> (1)
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <color.h>
#include <ctype.h>
 
#define MaxQueryReturns  10
 
#define   MaxDatabaseNameLength  SQL_SH_IDENT
#define   MaxUserIdLength        SQL_SH_IDENT
#define   MaxPasswordLength      SQL_SH_IDENT
#define   MaxTableNameLength     SQL_LG_IDENT
#define   MaxColumnNameLength    SQL_LG_IDENT
 
static  char       databaseName[MaxDatabaseNameLength+1];
static  char       userid[MaxUserIdLength+1];
static  char       password[MaxPasswordLength+1];
 
static  char       tableName[MaxTableNameLength+1];
static  char       columnName[MaxColumnNameLength+1];
 
static  char       line[4000];
 
static  QbResult   results[MaxQueryReturns];
static  long       currentImage   = -1;
static  long       imageCount  = 0;
 
static  char*      tableAndColumn;
 
static  QbQueryHandle	averageHandle = 0;
static  QbQueryHandle	histogramHandle = 0;
static  QbQueryHandle	drawHandle = 0;
static  QbQueryHandle	lastHandle = 0;
 
static SQLHENV henv;
static SQLHDBC hdbc;
static SQLHSTMT hstmt;
static SQLRETURN rc;
 
static  char*    listQueries =
	"SELECT NAME,DESCRIPTION FROM MMDBSYS.QBICQUERIES ORDER BY NAME";
 
static  char*    menu[] = {
/*
 12345678901234567890123456789012345678901234567890123456789012345678901234567890 */
"",
"+-----------------------------------------------------------------------------+",
"| AVERAGE COLOR colorname                                                     |",
"| AVERAGE FILE filename format                                                |",
"| AVERAGE LAST                                                                |",
"| Press Enter to display the next image in the series                         |",
"+-----------------------------------------------------------------------------+",
"",
0
};
 
static  char*       help[] = {
"",
"AVERAGE     Execute an average color query",
"  COLOR       Specifies the color to query for",
"  FILE        Specifies the file to compute the average color from",
"  LAST        Specifies the last displayed image be used to compute the color",
"  NEXT        Displays the next image from the current query or nothing if",
"                all of the image have been displayed."
"",
">>pause<<",
0
};
/******************************************************************************/
/* doNext()                                                                   */
/******************************************************************************/
static void doNext(void)
{
	int ret;
   if (currentImage < imageCount)
      currentImage++;
   if (currentImage < imageCount)
      ret = DBiBrowse("/usr/local/bin/xv %s", MMDB_PLAY_HANDLE,
            results[currentImage].imageHandle, MMDB_PLAY_NO_WAIT); (9)
}
 
/******************************************************************************/
/* doAverage()                                                                */
/******************************************************************************/
static void doAverage(void)
{
   QbQueryHandle qohandle = 0; QbImageSource is; char* type;
   char* arg1; char* arg2;
 
   type = nextWord(0);
   if (abbrev(type, "color", 1)) {
 is.type = qbiSource_AverageColor;
      arg1 = nextWord(0);
      if (arg1 == 0) {
         printf("AVERAGE COLOR command requires a colorname argument.\n");
      return;
      }
      if (getColor(arg1, &is.averageColor) == 0) {
         printf("The colorname entered was not recognized.\n");
      return;
      }
   }
   else if (abbrev(type, "file", 1)) {
      is.type = qbiSource_ClientFile;
      arg1 = nextWord(0);
      if (arg1 == 0) {
         printf("AVERAGE FILE command requires a filename argument.\n");
      return;
      }
      arg2 = nextWord(0);
      if (arg2 == 0) {
         printf("AVERAGE FILE command requires a file format argument.\n");
      return;
      }
      strcpy(is.clientFile.fileName, arg1);
      strcpy(is.clientFile.format, arg2);
   }
   else if (abbrev(type, "last", 1)) {
      is.type = qbiSource_ImageHandle;
      if (0 <= currentImage &&; currentImage < imageCount)
         strcpy(is.imageHandle, results[currentImage]imageHandle);
     else {
         printf("No last image for AVERAGE LAST command\n");
      return;
      }
   }
        else {
      printf("AVERAGE command only supports COLOR, FILE, and LAST types.\n");
      return;
   }
		
   _QbQuerySetFeatureData(averageHandle, "QbColorFeatureClass", &is); (7)
   _QbQuerySearch(averageHandle, tableAndColumn, "IMAGE",
         MaxQueryReturns, 0, 0, &imageCount, results); (8)
   lastHandle = averageHandle;
   	
   currentImage = -1;
}
/******************************************************************************/
/* commandLoop()                                                              */
/******************************************************************************/
void commandLoop(void)
{
   int	done = 0;
 
   while (!done) { (6)
      displayText(menu);
      printf("%d", currentImage + 1);
      if (0 <= currentImage &&; currentImage < imageCount)
            printf("  %8.6f", results[currentImage].score);
      printf("> ");
   gets(line);
      done = processCommand(line);
   }
}
 
/******************************************************************************/
/* main()                                                                     */
/******************************************************************************/
void main(void)
{
   char*		inst;
   int		i;
 
   printf("\n\n");
   printf("Please enter: database_name [user_id] [password] "\n"); (2)
   gets(line);
   if (copyWord(line, databaseName, sizeof(databaseName)) == 0)
      exit(0);
   copyWord(0, userid, sizeof(userid));
   copyWord(0, password, sizeof(password));
   printf("\n");
		
   if (SQLAllocEnv(&henv) != SQL_SUCCESS)
      sqlError(SQL_NULL_HSTMT);
   if (SQLAllocConnect(henv, &hdbc) != SQL_SUCCESS)
      sqlError(SQL_NULL_HSTMT);
   if (SQLConnect(hdbc, (3)
                  (SQLCHAR*)databaseName,
                  SQL_NTS,
                  (SQLCHAR*)userid,
                  SQL_NTS,
                  (SQLCHAR*)password,
                  SQL_NTS) != SQL_SUCCESS)
      sqlError(SQL_NULL_HSTMT);
 
   printf("Initializing . . .\n");
 
   inst = getenv("DB2INSTANCE");
   if (inst != 0 &&; strcmp(inst, "keeseyt") == 0)
      tableAndColumn = "KEESEY.TEST";
   else
      tableAndColumn = "QBICDEMO.TEST";
 
   _QbQueryCreate(&averageHandle); (4)
   _QbQueryAddFeature(averageHandle, "QbColorFeatureClass");
   _QbQueryCreate(&histogramHandle);
   _QbQueryAddFeature(histogramHandle, "QbColorHistogramFeatureClass");
   _QbQueryCreate(&drawHandle);
   _QbQueryAddFeature(drawHandle, "QbDrawFeatureClass"); (5)
 
   commandLoop();
	
   _QbQueryDelete(drawHandle);
   _QbQueryDelete(histogramHandle); (10)
   _QbQueryDelete(averageHandle);
 
   if (SQLDisconnect(hdbc) != SQL_SUCCESS)
      sqlError(SQL_NULL_HSTMT);
   if (SQLFreeConnect(hdbc) != SQL_SUCCESS)
      sqlError(SQL_NULL_HSTMT);
   if (SQLFreeEnv(henv) != SQL_SUCCESS)
      sqlError(SQL_NULL_HSTMT);
}

 


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