可使用查询对象来标识查询的特性、特性值和特性权重。 创建查询对象并向其添加特性。然后指定每个特性的数据源。数据源提供特性的值。例如,数据源可能是文件中的图象。若平均颜色是相关的特性, 则图象的平均颜色与查询对象相关联。若将多个特性添加至查询对象中,可对其中一个或多个特性指定权重。
Image Extender 提供了三个使用查询对象的 API(QbQuerySearch、QbQueryStringSearch 和 QbQueryNameSearch)和两个使用查询对象的 UDF(QbScoreFromName 和 QbScoreTBFromName)。在发出查询时, 使用适当的 API 或 UDF,并指定查询对象作为输入参数。(有关详情,参见按图象内容发出查询。)
作为响应,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 从查询对象中除去特性。
在下例中,将使用 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 来删除查询对象。