find_ncc_models — Find the best matches of multiple NCC models.
find_ncc_models finds the best
NumMatches instances of the NCC models that are passed in
ModelIDs in the input
models must have been created previously by calling
In contrast to
find_ncc_model, multiple models can
be searched in the same image in one call.
semantics of all input parameters have changed to some extent.
All input parameters must either contain one element, in which case the
parameter is used for all models, or they must contain the same number of
ModelIDs, in which case each parameter element
refers to the corresponding element in
NumLevels may also contain either two or twice the number
of elements as
ModelIDs). More details can be found below
in the sections containing information for the respective parameters.
Note that a call to
find_ncc_models with multiple
MaxOverlap has the same effect as multiple independent
find_ncc_model with the respective parameters.
However, a single call to
find_ncc_models is considerably
The domain of the image
Image determines the search space
for the reference point of the model, i.e., for the center of
gravity of the domain (region) of the image that was used to create
the NCC model with
create_ncc_model. A different origin
set_ncc_model_origin is not taken into account.
The model has to lie completely within the image. This
means that the model will not be found if it extends beyond the
borders of the image, even if it would achieve a score greater than
MinScore (see below).
can contain a single image object or an image object array
containing multiple image objects. If
Image contains a
single image object, its domain is used as the region of interest
for all models in
multiple image objects, each domain is used as the region of
interest for the corresponding model in
ModelIDs. In this
case, the images have to be identical except for their domains,
Image cannot be constructed in an
arbitrary manner using
concat_obj, but must be created from
the same image using
add_channels or equivalent calls. If
this is not the case, an error message is returned.
determine the range of rotations for which the model is searched.
If necessary, the range of rotations is clipped to the range given
when the model was created with
Furthermore, it should be noted that in some cases instances with a rotation that is slightly outside the specified range of rotations are found. This may happen if the specified range of rotations is smaller than the range given when the model was created.
MinScore determines what score a potential
match must at least have to be regarded as an instance of the model
in the image. The larger
MinScore is chosen, the faster
the search is. If the model can be expected never to be occluded in
MinScore may be set as high as 0.8 or even 0.9.
If the matches are not tracked to the lowest pyramid level (see
NumLevels), it might happen that instances with a score
MinScore are found.
The maximum number of instances to be found can be determined with
NumMatches. If more than
with a score greater than
MinScore are found in the image,
only the best
NumMatches instances are returned. If fewer
NumMatches are found, only that number is returned,
i.e., the parameter
MinScore takes precedence over
NumMatches. If all model instances exceeding
MinScore in the image should be found,
must be set to 0.
contains one element,
find_ncc_models returns the best
NumMatches instances of the model irrespective of the type
of the model. If, for example, two models are passed in
NumMatches = 2 is selected, it can
happen that two instances of the first model and no instances of the
second model, one instance of the first model and one instance of
the second model, or no instances of the first model and two
instances of the second model are returned. If, on the other hand,
NumMatches contains multiple values, the number of
instances returned of the different models corresponds to the number
specified in the respective entry in
NumMatches. If, for
NumMatches = [1,1] is selected, one instance of
the first model and one instance of the second model is returned.
If the model exhibits symmetries it may happen that multiple
instances with similar positions but different rotations are found
in the image. The parameter
MaxOverlap determines by what
fraction (i.e., a number between 0 and 1) two instances may at most
overlap in order to consider them as different instances, and hence
to be returned separately. If two instances overlap each other by
MaxOverlap, only the best instance is returned.
The calculation of the overlap is based on the smallest enclosing
rectangle of arbitrary orientation (see
of the found instances. If
MaxOverlap=0, the found
instances may not overlap at all, while for
all instances are returned.
If a single value is passed in
MaxOverlap, the overlap is computed for all found instances
of the different models, irrespective of the model type, i.e.,
instances of the same or of different models that overlap too much
are eliminated. If, on the other hand, multiple values are passed
MaxOverlap, the overlap is only computed for found
instances of the model that have the same model type, i.e., only
instances of the same model that overlap too much are eliminated.
In this mode, models of different types may overlap completely.
SubPixel determines whether the instances
should be extracted with subpixel accuracy. If
set to 'false' the model's pose is only determined with pixel
accuracy and the angle resolution that was specified with
SubPixel is set to
'true', the position as well as the rotation are determined with
subpixel accuracy. In this mode, the model's pose is interpolated from
the score function.
The number of pyramid levels used during the search is determined
NumLevels. If necessary, the number of levels is
clipped to the range given when the NCC model was created with
NumLevels is set to
0, the number of pyramid levels specified in
create_ncc_model is used.
In certain cases, the number of pyramid levels that was determined
automatically with, for example,
create_ncc_model may be too high.
The consequence may be that some matches that may have a high final score
are rejected on the highest pyramid level and thus are not found. Instead
MinScore to a very low value to find all matches, it
may be better to query the value of
get_ncc_model_params and then use a slightly lower value in
find_ncc_models. This approach is often better regarding the speed
and robustness of the matching.
can contain a second value that determines the lowest pyramid level
to which the found matches are tracked. Hence, a value of
NumLevels means that the matching starts
at the fourth pyramid level and tracks the matches to the second
lowest pyramid level (the lowest pyramid level is denoted by a value
of 1). This mechanism can be used to decrease the runtime of the
matching. It should be noted, however, that in general the accuracy
of the extracted pose parameters is lower in this mode than in the
normal mode, in which the matches are tracked to the lowest pyramid
level. If the lowest pyramid level to use is chosen too large, it may
happen that the desired accuracy cannot be achieved, or that wrong instances
of the model are found because the model is not specific enough on the
higher pyramid levels to facilitate a reliable selection of the
correct instance of the model. In this case, the lowest pyramid
level to use must be set to a smaller value.
If the lowest pyramid
level is specified separately for each model,
must contain twice the number of elements as
this case, the number of pyramid levels and the lowest pyramid level
must be specified interleaved in
NumLevels. If, for
example, two models are specified in
ModelIDs, the number
of pyramid levels is 5 for the first model and 4 for the second
model, and the lowest pyramid level is 2 for the first model and 1
for the second model,
NumLevels = [5,2,4,1] must
be selected. If exactly two models are specified in
ModelIDs, a special case occurs. If in this case the
lowest pyramid level is to be specified, the number of pyramid
levels and the lowest pyramid level must be specified explicitly for
both models, even if they are identical, because specifying two
NumLevels is interpreted as the explicit
specification of the number of pyramid levels for the two models.
The position and rotation of the found instances of the model is
Column are the coordinates of
the origin of the NCC model in the search image. By default, the
origin is the center of gravity of the domain (region) of the image
that was used to create the NCC model with
create_ncc_model. A different origin can be set with
Note that the coordinates
Column do not
exactly correspond to the position of the model in the search
image. Thus, you cannot directly use them. Instead, the values are
optimized for creating the transformation matrix with which you can
use the results of the matching for various tasks, e.g., to align
ROIs for other processing steps. The example given for
find_ncc_model shows how to create this matrix and use it
to display the model at the found position in the search image and
to calculate the exact coordinates.
Note also that for visualizing the model at the found position, also the procedure dev_display_ncc_matching_results can be used.
Additionally, the score of each found instance is returned in
The type of the found instances of the models is returned in
Model. The elements of
Model are indices into the
ModelIDs, i.e., they can contain values from 0 to
ModelIDs|-1. Hence, a value of 0 in an element of
Model corresponds to an instance of the first model in
Using the operator
set_ncc_model_param you can specify a
find_ncc_models. If the NCC models
ModelIDs hold different values for 'timeout',
find_ncc_models uses the smallest one.
find_ncc_models reaches this 'timeout', it terminates
without results and returns the error code 9400 (H_ERR_TIMEOUT).
To display the results found by correlation-based matching, we highly
recommend the usage of the procedure
For an explanation of the different 2D coordinate systems used in HALCON, see the introduction of chapter Transformations / 2D Transformations.
Note that the internally used memory increases with the number of used threads.
→object (byte* / uint2*) *allowed for compute devices
Input image in which the model should be found.
Handle of the models.
Smallest rotation of the models.
Default value: -0.39
Suggested values: -3.14, -1.57, -0.79, -0.39, -0.20, 0.0
Extent of the rotation angles.
Default value: 0.79
Suggested values: 6.29, 3.14, 1.57, 0.79, 0.39, 0.0
AngleExtent >= 0
Minimum score of the instances of the models to be found.
Default value: 0.8
Suggested values: 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0
Typical range of values:
Minimum increment: 0.01
Recommended increment: 0.05
Number of instances of the models to be found (or 0 for all matches).
Default value: 1
Suggested values: 0, 1, 2, 3, 4, 5, 10, 20
Maximum overlap of the instances of the models to be found.
Default value: 0.5
Suggested values: 0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0
Typical range of values:
Minimum increment: 0.01
Recommended increment: 0.05
Subpixel accuracy if not equal to 'none'.
Default value: 'true'
List of values: 'false', 'true'
Number of pyramid levels used in the matching
(and lowest pyramid level to use if
NumLevels| = 2).
Default value: 0
List of values: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
Row coordinate of the found instances of the models.
Column coordinate of the found instances of the models.
Rotation angle of the found instances of the models.
Score of the found instances of the models.
Index of the found instances of the models.
read_image (Image, 'pcb_focus/pcb_focus_telecentric_061') gen_rectangle1 (ROI_0, 236, 241, 313, 321) gen_circle (ROI_1, 281, 653, 41) reduce_domain (Image, ROI_0, ImageReduced1) reduce_domain (Image, ROI_1, ImageReduced2) create_ncc_model (ImageReduced1, 'auto', rad(-45), rad(90), 'auto', \ 'use_polarity', ModelID1) create_ncc_model (ImageReduced2, 'auto', rad(-45), rad(90), 'auto', \ 'use_polarity', ModelID2) ModelIDs:=[ModelID1, ModelID2] find_ncc_models (Image, ModelIDs, rad(-45), rad(90), 0.7, [1,1], 0.5, \ 'true', 0, Row, Column, Angle, Score, Model) dev_display_ncc_matching_results (ModelIDs, 'red', Row, Column, \ Angle, Model)
If the parameter values are correct, the operator
find_ncc_models returns the value 2 (H_MSG_TRUE). If the input is
empty (no input images are available) the behavior can be set via
set_system('no_object_result',<Result>). If necessary, an
exception is raised.