create_ncc_modelT_create_ncc_modelCreateNccModelCreateNccModelcreate_ncc_model创建归一化互相关模型(算子)
名称
create_ncc_modelT_create_ncc_modelCreateNccModelCreateNccModelcreate_ncc_model — 准备一个 NCC 模型进行匹配。
签名
void CreateNccModel(const HObject& Template, const HTuple& NumLevels, const HTuple& AngleStart, const HTuple& AngleExtent, const HTuple& AngleStep, const HTuple& Metric, HTuple* ModelID)
void HNCCModel::HNCCModel(const HImage& Template, const HTuple& NumLevels, double AngleStart, double AngleExtent, const HTuple& AngleStep, const HString& Metric)
void HNCCModel::HNCCModel(const HImage& Template, Hlong NumLevels, double AngleStart, double AngleExtent, double AngleStep, const HString& Metric)
void HNCCModel::HNCCModel(const HImage& Template, Hlong NumLevels, double AngleStart, double AngleExtent, double AngleStep, const char* Metric)
void HNCCModel::HNCCModel(const HImage& Template, Hlong NumLevels, double AngleStart, double AngleExtent, double AngleStep, const wchar_t* Metric)
(
Windows only)
void HNCCModel::CreateNccModel(const HImage& Template, const HTuple& NumLevels, double AngleStart, double AngleExtent, const HTuple& AngleStep, const HString& Metric)
void HNCCModel::CreateNccModel(const HImage& Template, Hlong NumLevels, double AngleStart, double AngleExtent, double AngleStep, const HString& Metric)
void HNCCModel::CreateNccModel(const HImage& Template, Hlong NumLevels, double AngleStart, double AngleExtent, double AngleStep, const char* Metric)
void HNCCModel::CreateNccModel(const HImage& Template, Hlong NumLevels, double AngleStart, double AngleExtent, double AngleStep, const wchar_t* Metric)
(
Windows only)
HNCCModel HImage::CreateNccModel(const HTuple& NumLevels, double AngleStart, double AngleExtent, const HTuple& AngleStep, const HString& Metric) const
HNCCModel HImage::CreateNccModel(Hlong NumLevels, double AngleStart, double AngleExtent, double AngleStep, const HString& Metric) const
HNCCModel HImage::CreateNccModel(Hlong NumLevels, double AngleStart, double AngleExtent, double AngleStep, const char* Metric) const
HNCCModel HImage::CreateNccModel(Hlong NumLevels, double AngleStart, double AngleExtent, double AngleStep, const wchar_t* Metric) const
(
Windows only)
static void HOperatorSet.CreateNccModel(HObject template, HTuple numLevels, HTuple angleStart, HTuple angleExtent, HTuple angleStep, HTuple metric, out HTuple modelID)
public HNCCModel(HImage template, HTuple numLevels, double angleStart, double angleExtent, HTuple angleStep, string metric)
public HNCCModel(HImage template, int numLevels, double angleStart, double angleExtent, double angleStep, string metric)
void HNCCModel.CreateNccModel(HImage template, HTuple numLevels, double angleStart, double angleExtent, HTuple angleStep, string metric)
void HNCCModel.CreateNccModel(HImage template, int numLevels, double angleStart, double angleExtent, double angleStep, string metric)
HNCCModel HImage.CreateNccModel(HTuple numLevels, double angleStart, double angleExtent, HTuple angleStep, string metric)
HNCCModel HImage.CreateNccModel(int numLevels, double angleStart, double angleExtent, double angleStep, string metric)
描述
算子 create_ncc_modelcreate_ncc_modelCreateNccModelCreateNccModelCreateNccModelcreate_ncc_model 准备一个模板,该模板通过图像 TemplateTemplateTemplateTemplatetemplatetemplate 传递,作为用于通过归一化交叉相关(NCC)进行匹配的 NCC 模型。 模型的 ROI 作为 TemplateTemplateTemplateTemplatetemplatetemplate 的域传递。
该模型通过在多个图像金字塔层级上进行多角度旋转生成,并存储在内存中。输出参数 ModelIDModelIDModelIDModelIDmodelIDmodel_id 是该模型的句柄,用于后续调用 find_ncc_modelfind_ncc_modelFindNccModelFindNccModelFindNccModelfind_ncc_model。
金字塔层数由参数 NumLevelsNumLevelsNumLevelsNumLevelsnumLevelsnum_levels 决定。该参数应尽可能取大值,因为这样能显著缩短对象搜索所需时间。另一方面,NumLevelsNumLevelsNumLevelsNumLevelsnumLevelsnum_levels 的选择必须确保模型仍可识别,且最高金字塔层包含足够数量的点(至少八个)。这可通过 gen_gauss_pyramidgen_gauss_pyramidGenGaussPyramidGenGaussPyramidGenGaussPyramidgen_gauss_pyramid 输出图像的域进行验证。若生成的模型点不足,系统将内部减少金字塔层数,直至在最高金字塔层找到足够的模型点。若此函数将导致模型无金字塔层(即最低金字塔层的模型点数已过少)create_ncc_modelcreate_ncc_modelCreateNccModelCreateNccModelCreateNccModelcreate_ncc_model 返回一条错误消息。若 NumLevelsNumLevelsNumLevelsNumLevelsnumLevelsnum_levels 设为为 'auto'"auto""auto""auto""auto""auto" 或
0,create_ncc_modelcreate_ncc_modelCreateNccModelCreateNccModelCreateNccModelcreate_ncc_model 将自动确定金字塔层数。可通过 get_ncc_model_paramsget_ncc_model_paramsGetNccModelParamsGetNccModelParamsGetNccModelParamsget_ncc_model_params 查询自动计算的金字塔层数。在极少数情况下,create_ncc_modelcreate_ncc_modelCreateNccModelCreateNccModelCreateNccModelcreate_ncc_model 可能确定的金字塔层数过大或过小。若金字塔层数选择过多,模型可能无法在图像中被识别,或需在 find_ncc_modelfind_ncc_modelFindNccModelFindNccModelFindNccModelfind_ncc_model 中将 MinScoreMinScoreMinScoreMinScoreminScoremin_score 参数设为极低值才能找到模型。若金字塔层数选择过少,find_ncc_modelfind_ncc_modelFindNccModelFindNccModelFindNccModelfind_ncc_model 查找模型所需时间可能增加。此时应通过检查 gen_gauss_pyramidgen_gauss_pyramidGenGaussPyramidGenGaussPyramidGenGaussPyramidgen_gauss_pyramid 的输出结果来确定金字塔层数。此时应使用 ModeModeModeModemodemode = 'constant'"constant""constant""constant""constant""constant" 且
ScaleScaleScaleScalescalescale = 0.5 的设置。
参数 AngleStartAngleStartAngleStartAngleStartangleStartangle_start 和 AngleExtentAngleExtentAngleExtentAngleExtentangleExtentangle_extent
决定了模型在图像中可能出现的旋转范围。请注意,find_ncc_modelfind_ncc_modelFindNccModelFindNccModelFindNccModelfind_ncc_model 仅能在该角度范围内检测到模型。AngleStepAngleStepAngleStepAngleStepangleStepangle_step 参数则决定了选定角度范围内的步进长度。因此,如果
find_ncc_modelfind_ncc_modelFindNccModelFindNccModelFindNccModelfind_ncc_model 未指定亚像素精度,则该参数指定 find_ncc_modelfind_ncc_modelFindNccModelFindNccModelFindNccModelfind_ncc_model 中角度可达到的精度。AngleStepAngleStepAngleStepAngleStepangleStepangle_step 应根据对象尺寸选择。较小的模型在图像中不具备多种不同的离散旋转,因此对于较小的模型,应选择较大的 AngleStepAngleStepAngleStepAngleStepangleStepangle_step。若 AngleExtentAngleExtentAngleExtentAngleExtentangleExtentangle_extent 并非
AngleStepAngleStepAngleStepAngleStepangleStepangle_step 的整数倍,则AngleStepAngleStepAngleStepAngleStepangleStepangle_step 将相应调整。为确保抽样范围能独立于给定 AngleStartAngleStartAngleStartAngleStartangleStartangle_start 涵盖所有可能的旋转角度,将按以下方式调整旋转角度的取值范围:若不存在正整数 n 使得 AngleStartAngleStartAngleStartAngleStartangleStartangle_start 加上 n 倍
AngleStepAngleStepAngleStepAngleStepangleStepangle_step 恰为 0.0,则 AngleStartAngleStartAngleStartAngleStartangleStartangle_start 最多减去 AngleStepAngleStepAngleStepAngleStepangleStepangle_step,AngleExtentAngleExtentAngleExtentAngleExtentangleExtentangle_extent 增加
AngleStepAngleStepAngleStepAngleStepangleStepangle_step。
模型会针对选定的角度范围预先生成并存储在内存中。存储模型所需的内存大小与角度步长数量及模型中的点数成正比。因此,若 AngleStepAngleStepAngleStepAngleStepangleStepangle_step 设置过小或 AngleExtentAngleExtentAngleExtentAngleExtentangleExtentangle_extent
设定过大,可能导致模型无法再容纳于(虚拟)内存中。此时需扩大 AngleStepAngleStepAngleStepAngleStepangleStepangle_step 或缩小 AngleExtentAngleExtentAngleExtentAngleExtentangleExtentangle_extent。无论如何,模型完全容纳于主内存是理想状态,因为这可避免操作系统进行分页操作,从而大幅缩短查找对象的时间。由于 find_ncc_modelfind_ncc_modelFindNccModelFindNccModelFindNccModelfind_ncc_model 能够以亚像素级精度确定角度,对于直径小于约 200 像素的模型,可选择
AngleStepAngleStepAngleStepAngleStepangleStepangle_step >= 1。若选择
AngleStepAngleStepAngleStepAngleStepangleStepangle_step =
'auto'"auto""auto""auto""auto""auto" 或
0,create_ncc_modelcreate_ncc_modelCreateNccModelCreateNccModelCreateNccModelcreate_ncc_model 将根据模型尺寸自动确定合适的角度步长。通过
get_ncc_model_paramsget_ncc_model_paramsGetNccModelParamsGetNccModelParamsGetNccModelParamsget_ncc_model_params 可查询自动计算的角度步长值。
参数 MetricMetricMetricMetricmetricmetric 决定了模型在图像中被识别的条件。若 MetricMetricMetricMetricmetricmetric =
'use_polarity'"use_polarity""use_polarity""use_polarity""use_polarity""use_polarity",则图像中的对象与模型必须具有相同的对比度。例如,如果模型是暗背景上的亮色对象,则只有当该对象也比背景更亮时才能被识别。若 MetricMetricMetricMetricmetricmetric =
'ignore_global_polarity'"ignore_global_polarity""ignore_global_polarity""ignore_global_polarity""ignore_global_polarity""ignore_global_polarity",即使图像整体对比度发生反转,仍可识别出对象。因此在上例中,即使对象比背景更暗,仍会被识别。此情况下 find_ncc_modelfind_ncc_modelFindNccModelFindNccModelFindNccModelfind_ncc_model 的运行时间将略有增加。
模型图像
TemplateTemplateTemplateTemplatetemplatetemplate 的域(区域)重心被用作模型的原点(参考点)。可通过
set_ncc_model_originset_ncc_model_originSetNccModelOriginSetNccModelOriginSetNccModelOriginset_ncc_model_origin 设置不同的原点。
执行信息
- 多线程类型:可重入(与非独占算子并行运行)。
- 多线程作用域:全局(可从任何线程调用)。
- 未采用并行化处理。
此算子返回一个句柄。请注意,即使该句柄被用作特定算子的输入参数,这些算子仍可能改变此句柄类型的实例状态。
参数
TemplateTemplateTemplateTemplatetemplatetemplate (输入对象) singlechannelimage → objectHImageHObjectHImageHobject (byte / uint2)
输入图像,其域将用于创建模型。
NumLevelsNumLevelsNumLevelsNumLevelsnumLevelsnum_levels (输入控制) integer → HTupleUnion[int, str]HTupleHtuple (integer / string) (int / long / string) (Hlong / HString) (Hlong / char*)
金字塔层数的最大值。
默认值:
'auto'
"auto"
"auto"
"auto"
"auto"
"auto"
值列表:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'auto'"auto""auto""auto""auto""auto"
AngleStartAngleStartAngleStartAngleStartangleStartangle_start (输入控制) angle.rad → HTuplefloatHTupleHtuple (real) (double) (double) (double)
模式的最小旋转角度(弧度)。
默认值:
-0.39
建议值:
-3.14, -1.57, -0.79, -0.39, -0.20, 0.0
AngleExtentAngleExtentAngleExtentAngleExtentangleExtentangle_extent (输入控制) angle.rad → HTuplefloatHTupleHtuple (real) (double) (double) (double)
旋转角度的范围。
默认值:
0.79
建议值:
6.29, 3.14, 1.57, 0.79, 0.39
限制:
AngleExtent >= 0
AngleStepAngleStepAngleStepAngleStepangleStepangle_step (输入控制) angle.rad → HTupleUnion[float, str]HTupleHtuple (real / string) (double / string) (double / HString) (double / char*)
角度的步长(分辨率)。
默认值:
'auto'
"auto"
"auto"
"auto"
"auto"
"auto"
建议值:
'auto'"auto""auto""auto""auto""auto", 0.0, 0.0175, 0.0349, 0.0524, 0.0698, 0.0873
限制:
AngleStep >= 0 && AngleStep <= pi / 16
MetricMetricMetricMetricmetricmetric (输入控制) string → HTuplestrHTupleHtuple (string) (string) (HString) (char*)
匹配指标。
默认值:
'use_polarity'
"use_polarity"
"use_polarity"
"use_polarity"
"use_polarity"
"use_polarity"
值列表:
'ignore_global_polarity'"ignore_global_polarity""ignore_global_polarity""ignore_global_polarity""ignore_global_polarity""ignore_global_polarity", 'use_polarity'"use_polarity""use_polarity""use_polarity""use_polarity""use_polarity"
ModelIDModelIDModelIDModelIDmodelIDmodel_id (输出控制) ncc_model → HNCCModel, HTupleHHandleHTupleHtuple (handle) (IntPtr) (HHandle) (handle)
模型的句柄。
结果
如果参数有效,算子 create_ncc_modelcreate_ncc_modelCreateNccModelCreateNccModelCreateNccModelcreate_ncc_model 返回值 2 (H_MSG_TRUE)。如果参数 NumLevelsNumLevelsNumLevelsNumLevelsnumLevelsnum_levels 的选择导致模型包含的点过少,则会引发错误 8506。
可能的前趋
draw_regiondraw_regionDrawRegionDrawRegionDrawRegiondraw_region,
reduce_domainreduce_domainReduceDomainReduceDomainReduceDomainreduce_domain,
thresholdthresholdThresholdThresholdThresholdthreshold
可能的后继
find_ncc_modelfind_ncc_modelFindNccModelFindNccModelFindNccModelfind_ncc_model,
get_ncc_model_paramsget_ncc_model_paramsGetNccModelParamsGetNccModelParamsGetNccModelParamsget_ncc_model_params,
clear_ncc_modelclear_ncc_modelClearNccModelClearNccModelClearNccModelclear_ncc_model,
write_ncc_modelwrite_ncc_modelWriteNccModelWriteNccModelWriteNccModelwrite_ncc_model,
set_ncc_model_originset_ncc_model_originSetNccModelOriginSetNccModelOriginSetNccModelOriginset_ncc_model_origin,
set_ncc_model_paramset_ncc_model_paramSetNccModelParamSetNccModelParamSetNccModelParamset_ncc_model_param,
find_ncc_modelsfind_ncc_modelsFindNccModelsFindNccModelsFindNccModelsfind_ncc_models
替代
create_generic_shape_modelcreate_generic_shape_modelCreateGenericShapeModelCreateGenericShapeModelCreateGenericShapeModelcreate_generic_shape_model
模块
匹配