IBM Books

Image Extender、Audio Extender 和 Video Extender 管理和程序设计

使用查询对象

可使用查询对象来标识查询的特性、特性值和特性权重。 创建查询对象并向其添加特性。然后指定每个特性的数据源。数据源提供特性的值。例如,数据源可能是文件中的图象。若平均颜色是相关的特性, 则图象的平均颜色与查询对象相关联。若将多个特性添加至查询对象中,可对其中一个或多个特性指定权重。

Image Extender 提供了三个使用查询对象的 API(QbQuerySearch、QbQueryStringSearch 和 QbQueryNameSearch)和两个使用查询对象的 UDF(QbScoreFromName 和 QbScoreTBFromName)。在发出查询时, 使用适当的 API 或 UDF,并指定查询对象作为输入参数。(有关详情,参见按图象内容发出查询。)

创建查询对象

使用 QbQueryCreate API 来创建查询对象。

作为响应,Image Extender 将返回查询对象的句柄。句柄具有 QBIC 特有的数据类型 QbQueryHandle, 该类型是在 QBIC 的包含(首标)文件 dmbqbapi.h 中定义的。

使用 API 时,需要指向查询对象句柄。还需要在对查询对象执行其他操作(如添加特性)的 API 中指定该句柄。

例如,以下 API 调用创建查询对象:

QbQueryHandle  qHandle;
 
rc=QbQueryCreate(
              &qHandle);                          /* query object handle */

将特性添加至查询对象

通过将特性添加至查询对象来标识要让 Image Extender 查询的图象特性。

使用 QbQueryAddFeature API 来将特性添加至查询对象。 在使用 API 时,指定查询对象句柄。同时还命名特性。仅可在该 API 中指定一个特性。必须对要添加至查询对象的每个特性分别发出 API 调用。

在下例中,使用 QbQueryAddFeature API 来将平均颜色特性添加至查询对象:

char           featureName[qbiMaxFeatureName];
QbQueryHandle  qHandle;
 
rc=QbQueryAddFeature(
                qHandle,                        /* query object handle */
                "QbColorFeatureClass");           /* feature name */

指定查询对象中特性的数据源

使用 QbQuerySetFeatureData API 来指定

查询对象中特性的数据源。数据源可以是:

另外,可明确地指定平均颜色或直方图特性的数据。例如, 可指定平均颜色的红色、绿色和蓝色值。

使用 API 时:

使用数据源结构

使用了各种结构来提供查询对象的数据源信息。这些结构是:

QbImageSource: QbImageSource 结构标识查询对象中特性的源的类型。该结构是在 QBIC 的包含(首标)文件 dmbqbapi.h 中定义的,如下所示:

typedef struct{
          SQLINTEGER    type;
          union {
          char       imageHandle[MMDB_BASE_HANDLE_LEN+1];
                QbImageFile       clientFile;
                QbImageBuffer     buffer;
                QbSampleSource    reserved;
                QbColor           averageColor;
                QbHistogramColor  histogramColor[qbiHistogramCount];
          };
} QbImageSource;

QbImageSource 结构中的类型字段指示源的类型。可按如下方式设置字段中的值:
含义
qbiSource_ImageHandle 源位于用户表列中
qbiSource_ClientFile 源在客户机工作站文件中
qbiSource_Buffer 源在客户机工作站缓冲区中
qbiSource_ServerFile 源在服务器文件中
qbiSource_AverageColor 源是平均颜色说明
qbiSource_HistogramColor 源是直方图颜色说明

这些设置仅对适当的特性有效。例如,qbiSource_AverageColor 仅对平均颜色特性有效。

如果将类型字段设置为 qbiSource_ServerFile,则将 clientFile 用于服务器上的文件的名称和类型。

根据源类型,Image Extender 还检查您指定的其他信息。如下表中所示。

表 9. Image Extender 在 QbImageSource 中检查什么内容
Image Extender 检查什么内容 在何处指定
用户表 图象句柄 QbImageSource 的图象句柄字段
文件
文件名
文件格式

QbImageSource 的客户机文件字段
缓冲区 文件名 QbImageBuffer (参见下面的 QbImageBuffer 以了解关于使用此结构的详情)
平均颜色说明 红色、绿色和蓝色颜色值 QbColor 结构 (参见下面的 QBColor 以获取关于使用此结构的细节)
直方图颜色说明 颜色值和百分比 QbHistogramColor 结构 (参见下面的 QbHistogramColor 以获取关于使用此结构的细节)

QbImageBuffer:当数据源在缓冲区中时, 使用 QbImageBuffer 结构来指定图象的格式、长度和内容。该结构是在 QBIC 的包含(首标)文件 dmbqbapi.h 中定义的,如下所示:

typedef struct{
          char          format[qbiImageFormatLength+1];
          SQLINTEGER    length;
          char*         image;
} QbImageBuffer;

QbColor:当数据源是平均颜色说明时,使用 QbColor 结构来指定平均颜色的红色、绿色和蓝色值。该结构是在 QBIC 的包含(首标)文件 dmbqbapi.h 中定义的,如下所示:

typedef struct{
          SQLUSMALLINT    red;          /*0 off - 65535 (fully on) */
          SQLUSMALLINT    green;        /*0 off - 65535 (fully on) */
          SQLUSMALLINT    blue;         /*0 off - 65535 (fully on) */
} QbColor;

在 QbColor 中设置一些值以指示将作为平均值计算中因子的红色、 绿色和蓝色象素的数量。这些值的范围是 0 至 65535。值 0 表示忽略该项。

QbHistogramColor:使用 QbHistogramColor 结构来指定直方图颜色说明中的每种颜色组成部分。对直方图颜色的完整说明包含在 QbHistogramColor 结构的一个数组中。每个结构都包含颜色值和百分比。颜色值由红色、绿色和蓝色象素值组成。百分比指定在目标图象中需要多少百分比的这种颜色。

该结构是在 QBIC 的包含(首标)文件 dmbqbapi.h 中定义的,如下所示:

typedef struct{
          QbColor         color;
          SQLUSMALLINT    percentage;   /*0 - 100 */
} QbHistogramColor;

在 QbColor 中设置一些值以指示颜色的红色、绿色和蓝色象素量。这些值的范围是 0 至 65535。设置百分比以指示在目标图象中需要多少百分比的指定颜色。值的范围是 1 至 100。直方图颜色中颜色组成部分的百分比之和必须小于或等于 100。

示例

下例中的 API 在查询对象中指定直方图颜色特性的数据源。数据源是客户机工作站中的文件。

char           featureName[qbiMaxFeatureName];
QbQueryHandle  qHandle;
QbImageSource        imgSource;
 
imgSource.type=qbiSource_ClientFile;
strcpy(imgSource.clientFile.fileName,"/tmp/image.gif");
strcpy(imgSource.clientFile.format,"GIF");
 
rc=QbQuerySetFeatureData(
                qHandle,                        /* query object handle */
                "QbColorHistogramFeatureClass",        /* feature name */
                &imgSource);                          /* feature data source */

在下例中,数据源是红色的平均颜色说明:

char           featureName[qbiMaxFeatureName];
QbColor              avgColor;
QbImageSource        imgSource;
 
imgSource.type=qbSource_AverageColor;
avgColor.red=255;
avgColor.green=0;
avgColor.blue=0;
strcpy(featureName,"QbColorFeatureClass");
 
rc=QbQuerySetFeatureData(
                qHandle,                        /* query object handle */
                featureName,                         /* feature name */
                &imgSource);                          /* feature data source */

在查询对象中设置特性的权重

若已将多个特性添加至查询对象, 则可在查询中指定对一个或多个特性给出的权重。使用 QbQuerySetFeatureWeight API 来指定特性的权重。特性权重指示,当 Image Extender 计算类似性得分并返回“按图象内容查询” 的结果时,它对特性的重视程度。对特性指定的权重越高,对查询对象中该特性也越重视。

虽然每次发出 QbQuerySetFeatureWeight API 时仅可对一个特性指定权重, 但可以在查询对象中指定一个或多个特性的权重。若不在查询对象中对特性指定权重,则 Image Extender 将使用特性的缺省权重。若 查询对象中只有一个特性,则对该特性指定权重并无意义。(该特性将总是具有查询对象中的全部权重。)

使用 API 时:

在下例中,查询对象包含平均颜色特性和至少一个其他特性。使用 QbQuerySetFeatureWeight API 在查询对象中指定平均颜色特性的权重:

char           featureName[qbiMaxFeatureName];
double               weight;
QbQueryObjectHandle  qoHandle;
 
strcpy(featureName,"QbColorFeatureClass");
weight=5.00;
 
rc=QbQuerySetFeatureWeight(
                qoHandle,                            /* query object handle */
                featureName,                         /* feature name */
                &weight);                            /* feature weight */

保存和重用查询字符串

除非保存查询对象,否则它们是瞬时的。它们仅在 单个数据库连接期间存在。您可以保存来自一个查询的查询字符串以便在程序中再次使用它, 即使当前数据库连接已卸下,也可以使用它。另外,也可以跨程序调用使用它。

Image Extender 提供了 QbQueryGetString API,它从一个查询对象返回查询字符串。之后,您可以使用该 查询字符串作为 QbQueryStringSearch API 的输入,或作为其他按内容查询中的 QbScoreFromStr 和 QbScoreTBFromStr UDF 的输入(参见按图象内容发出查询)。

查询字符串是在您使用下列各项构建查询时构建的:

在构建查询之后,您可以调用 QbQueryGetString 来获得该字符串。您可以在 该程序内的调用中使用此查询字符串,也可以将其保存至文件,以便在应用程序的 后续调用和其他数据库连接中使用。在完成使用 QbQueryGetString 所返回的查询 字符串之后,必须显式地释放空间。

在下例中,将使用 QbQueryGetString 来从查询对象中检索查询字符串:

SQLRETURN rc;
char* qryString;
QbQueryHandle  qHandle;
 
.....           /* Here you create and use the query */
 
rc = QbQueryGetString(qHandle, &qryString);
if ( rc == 0) {
   ...         /* Use the query string as input here  */
   free((void *)qryString);
   qryString=(char *)0;
}
 
限制:当使用客户机文件来指定特性的数据源时, 查询字符串并不反映特性数据。

检索关于查询对象的信息

可确定有哪些特性(若有的话)已添加至查询对象。还可确定特性的当前权重。
使用此 API 检索
QbQueryGetFeatureCount 查询对象中特性的数目
QbQueryListFeatures 查询对象中特性的名称

在发出 QbQueryGetFeatureCount API 时,指定查询对象句柄。还需要指向计数器。 Image Extender 在计数器中返回特性数。

在下例中,使用 QbQueryGetFeatureCount API 来确定查询对象中的特性数:

SQLINTEGER     count;
QbQueryHandle  qHandle;
 
rc=QbQueryGetFeatureCount(
                qHandle,                        /* query object handle */
                &count);                             /* feature count */

在发出 QbQueryListFeatures API 调用时,需要分配缓冲区来存放返回的特性名。还需要指定目录句柄,以及存放返回的特性名的缓冲区的大小。

在下例中,将使用 QbQueryListFeatures API 来检索查询对象中每个特性的名称:

SQLINTEGER     retCount,bufSize;
char*          featureName;
QbQueryHandle  qHandle;
 
bufSize=qbiMaxFeatureName;
featureName=(char*)malloc(bufSize);
 
rc=QbQueryListFeatures(
                qHandle,                        /* query object handle */
                bufSize                             /* size of buffer */
                &retCount,                          /* feature count */
                featureName);                       /* buffer for feature names */

从查询对象中除去特性

使用 QbQueryRemoveFeature API 从查询对象中除去特性。

在使用此 API 时, 指定查询对象句柄并命名特性。

在下例中,将使用 QbQueryRemoveFeature API 从查询对象中除去直方图颜色特性:

char           featureName[qbiMaxFeatureName];
QbQueryHandle  qHandle;
 
strcpy(featureName,"QbColorHistogramFeatureClass");
 
rc=QbQueryRemoveFeature(
                qHandle,                        /* query object handle */
                featureName);                        /* feature name */

删除查询对象

使用 QbQueryDelete API 来删除未命名的查询对象。

Image Extender 从当前连接的数据库中删除查询。

当使用 QbQueryDelete API 时,指定查询对象句柄。

在下例中,将使用 QbQueryDelete API 来删除查询对象:

QbQueryHandle  qHandle;
 
rc=QbQueryDelete(
            qHandle);                            /* query object handle */

如果已使用了有名查询,则使用 QbQueryNameDelete API 来删除查询对象。


[ 页的顶部 | 上一页 | 下一页 | 目录 | 索引 ]