HALCON Reference Manual 10.0.2
Table of Contents / Identification / Data Code ClassesClassesClasses | | | Operators

find_data_code_2dfind_data_code_2dfind_data_code_2dFindDataCode2dFindDataCode2d (Operator)

Name

find_data_code_2dfind_data_code_2dfind_data_code_2dFindDataCode2dFindDataCode2d — Detect and read 2D data code symbols in an image or train the 2D data code model.

Signature

find_data_code_2d(Image : SymbolXLDs : DataCodeHandle, GenParamNames, GenParamValues : ResultHandles, DecodedDataStrings)

Herror find_data_code_2d(const Hobject Image, Hobject* SymbolXLDs, const Hlong DataCodeHandle, const char* GenParamNames, const Hlong GenParamValues, Hlong* ResultHandles, char* DecodedDataStrings)

Herror T_find_data_code_2d(const Hobject Image, Hobject* SymbolXLDs, const Htuple DataCodeHandle, const Htuple GenParamNames, const Htuple GenParamValues, Htuple* ResultHandles, Htuple* DecodedDataStrings)

Herror find_data_code_2d(Hobject Image, Hobject* SymbolXLDs, const HTuple& DataCodeHandle, const HTuple& GenParamNames, const HTuple& GenParamValues, Hlong* ResultHandles, char* DecodedDataStrings)

Herror find_data_code_2d(Hobject Image, Hobject* SymbolXLDs, const HTuple& DataCodeHandle, const HTuple& GenParamNames, const HTuple& GenParamValues, HTuple* ResultHandles, HTuple* DecodedDataStrings)

HXLDContArray HImage::FindDataCode2d(const HDataCode2D& DataCodeHandle, const HTuple& GenParamNames, const HTuple& GenParamValues, HTuple* ResultHandles, HTuple* DecodedDataStrings) const

HXLDContArray HDataCode2D::FindDataCode2d(const HImage& Image, const HTuple& GenParamNames, const HTuple& GenParamValues, HTuple* ResultHandles, HTuple* DecodedDataStrings) const

void HOperatorSetX.FindDataCode2d(
[in] IHUntypedObjectX* Image, [out] IHUntypedObjectX*SymbolXLDs, [in] VARIANT DataCodeHandle, [in] VARIANT GenParamNames, [in] VARIANT GenParamValues, [out] VARIANT* ResultHandles, [out] VARIANT* DecodedDataStrings)

IHXLDContX* HDataCode2DX.FindDataCode2d(
[in] IHImageX* Image, [in] VARIANT GenParamNames, [in] VARIANT GenParamValues, [out] VARIANT* ResultHandles, [out] VARIANT* DecodedDataStrings)

IHXLDContX* HImageX.FindDataCode2d(
[in] IHDataCode2DX* DataCodeHandle, [in] VARIANT GenParamNames, [in] VARIANT GenParamValues, [out] VARIANT* ResultHandles, [out] VARIANT* DecodedDataStrings)

static void HOperatorSet.FindDataCode2d(HObject image, out HObject symbolXLDs, HTuple dataCodeHandle, HTuple genParamNames, HTuple genParamValues, out HTuple resultHandles, out HTuple decodedDataStrings)

HXLDCont HDataCode2D.FindDataCode2d(HImage image, HTuple genParamNames, HTuple genParamValues, out HTuple resultHandles, out HTuple decodedDataStrings)

HXLDCont HDataCode2D.FindDataCode2d(HImage image, string genParamNames, int genParamValues, out int resultHandles, out string decodedDataStrings)

HXLDCont HImage.FindDataCode2d(HDataCode2D dataCodeHandle, HTuple genParamNames, HTuple genParamValues, out HTuple resultHandles, out HTuple decodedDataStrings)

HXLDCont HImage.FindDataCode2d(HDataCode2D dataCodeHandle, string genParamNames, int genParamValues, out int resultHandles, out string decodedDataStrings)

Description

The operator find_data_code_2dfind_data_code_2dfind_data_code_2dFindDataCode2dFindDataCode2d detects 2D data code symbols in the input image (ImageImageImageImageimage) and reads the data that is coded in the symbol. Before calling find_data_code_2dfind_data_code_2dfind_data_code_2dFindDataCode2dFindDataCode2d, a model of a class of 2D data codes that matches the symbols in the images must be created with create_data_code_2d_modelcreate_data_code_2d_modelcreate_data_code_2d_modelCreateDataCode2dModelCreateDataCode2dModel or read_data_code_2d_modelread_data_code_2d_modelread_data_code_2d_modelReadDataCode2dModelReadDataCode2dModel. The handle returned by these operators is passed to find_data_code_2dfind_data_code_2dfind_data_code_2dFindDataCode2dFindDataCode2d in DataCodeHandleDataCodeHandleDataCodeHandleDataCodeHandledataCodeHandle. To look for more than one symbol in an image, the generic parameter 'stop_after_result_num'"stop_after_result_num""stop_after_result_num""stop_after_result_num""stop_after_result_num" can be passed to GenParamNamesGenParamNamesGenParamNamesGenParamNamesgenParamNames together with the number of requested symbols as GenParamValuesGenParamValuesGenParamValuesGenParamValuesgenParamValues.

As a result the operator returns for every successfully decoded symbol the surrounding XLD contour (SymbolXLDsSymbolXLDsSymbolXLDsSymbolXLDssymbolXLDs), a result handle, which refers to a candidate structure that stores additional information about the symbol as well as the search and decoding process (ResultHandlesResultHandlesResultHandlesResultHandlesresultHandles), and the string that is encoded in the symbol (DecodedDataStringsDecodedDataStringsDecodedDataStringsDecodedDataStringsdecodedDataStrings). If the string is longer than 1024 characters it is shortened to 1020 characters followed by '...'. In this case, accessing the complete string is only possible with the operator get_data_code_2d_resultsget_data_code_2d_resultsget_data_code_2d_resultsGetDataCode2dResultsGetDataCode2dResults. Passing the candidate handle from ResultHandlesResultHandlesResultHandlesResultHandlesresultHandles together with the generic parameter 'decoded_data'"decoded_data""decoded_data""decoded_data""decoded_data" get_data_code_2d_resultsget_data_code_2d_resultsget_data_code_2d_resultsGetDataCode2dResultsGetDataCode2dResults returns a tuple with the ASCII code of all characters of the string.

Adjusting the model

If there is a symbol in the image that cannot be read, it should be verified, whether the properties of the symbol fit the model parameters. Special attention should be paid to the correct polarity ('polarity'"polarity""polarity""polarity""polarity", light-on-dark or dark-on-light), the symbol size ('symbol_size'"symbol_size""symbol_size""symbol_size""symbol_size" for ECC 200, 'version'"version""version""version""version" for QR Code, 'symbol_rows'"symbol_rows""symbol_rows""symbol_rows""symbol_rows" and 'symbol_cols'"symbol_cols""symbol_cols""symbol_cols""symbol_cols" for PDF417), the module size ('module_size'"module_size""module_size""module_size""module_size" for ECC 200 and QR Code, 'module_width'"module_width""module_width""module_width""module_width" and 'module_aspect'"module_aspect""module_aspect""module_aspect""module_aspect" for PDF417), the possibility of a mirroring of the symbol ('mirrored'"mirrored""mirrored""mirrored""mirrored"), and the specified minimum contrast ('contrast_min'"contrast_min""contrast_min""contrast_min""contrast_min"). Further relevant parameters are the gap between neighboring foreground modules and, for ECC 200, the maximum slant of the L-shaped finder pattern ('slant_max'"slant_max""slant_max""slant_max""slant_max"). The current settings for these parameters are returned by the operator get_data_code_2d_paramget_data_code_2d_paramget_data_code_2d_paramGetDataCode2dParamGetDataCode2dParam. If necessary, the appropriate model parameters can be adjusted with set_data_code_2d_paramset_data_code_2d_paramset_data_code_2d_paramSetDataCode2dParamSetDataCode2dParam.

It is recommended to adjust the model as well as possible to the symbols in the images also for run-time reasons. In general, the run-time of find_data_code_2dfind_data_code_2dfind_data_code_2dFindDataCode2dFindDataCode2d is higher for a more general model than for a more specific model. One should take into account that a general model leads to a high run-time especially if no valid data code can be found.

Train the model

Besides setting the model parameters manually with set_data_code_2d_paramset_data_code_2d_paramset_data_code_2d_paramSetDataCode2dParamSetDataCode2dParam, the model can also be trained with find_data_code_2dfind_data_code_2dfind_data_code_2dFindDataCode2dFindDataCode2d based on one or several sample images. For this the generic parameter 'train'"train""train""train""train" must be passed in GenParamNamesGenParamNamesGenParamNamesGenParamNamesgenParamNames. The corresponding value passed in GenParamValuesGenParamValuesGenParamValuesGenParamValuesgenParamValues determines the model parameters that should be learned. The following values are possible:

It is possible to train several of these parameters in one call of find_data_code_2dfind_data_code_2dfind_data_code_2dFindDataCode2dFindDataCode2d by passing the generic parameter 'train'"train""train""train""train" in a tuple more than once in conjunction with the appropriate parameters: e.g., GenParamNamesGenParamNamesGenParamNamesGenParamNamesgenParamNames = ['train','train']["train","train"]["train","train"]["train","train"]["train","train"] and GenParamValuesGenParamValuesGenParamValuesGenParamValuesgenParamValues = ['polarity','module_size']["polarity","module_size"]["polarity","module_size"]["polarity","module_size"]["polarity","module_size"]. Furthermore, in conjunction with 'train'"train""train""train""train" = 'all'"all""all""all""all" it is possible to exclude single parameters from training explicitly again by passing 'train'"train""train""train""train" more than once. The names of the parameters to exclude, however, must be prefixed by '~'"~""~""~""~": GenParamNamesGenParamNamesGenParamNamesGenParamNamesgenParamNames = ['train','train']["train","train"]["train","train"]["train","train"]["train","train"] and GenParamValuesGenParamValuesGenParamValuesGenParamValuesgenParamValues = ['all','~contrast']["all","~contrast"]["all","~contrast"]["all","~contrast"]["all","~contrast"], e.g., trains all parameters except the minimum contrast.

For training the model, the following aspects should be considered:

Functionality of the symbol search

Depending on the current settings of the 2D data code model (see set_data_code_2d_paramset_data_code_2d_paramset_data_code_2d_paramSetDataCode2dParamSetDataCode2dParam), the operator find_data_code_2dfind_data_code_2dfind_data_code_2dFindDataCode2dFindDataCode2d performs several passes for searching the data code symbols. The search starts at the highest pyramid level, where - according to the maximum module size defined in the data code model - the modules can be separated. In addition, in every pyramid level the preprocessing can vary depending on the presets for the module gap. If the data code model enables dark symbols on a light background as well as light symbols on a dark background, within the current pyramid level the dark symbols are searched first. Then the passes for searching light symbols follow. A pass consists of two phases: The search phase is used to look for the finder patterns and to generate a symbol candidate for every detected finder pattern, and the evaluation phase, where in a lower pyramid level all candidates are investigated and - if possible - read.

The operator call is either terminated due to a timeout (see set_data_code_2d_paramset_data_code_2d_paramset_data_code_2d_paramSetDataCode2dParamSetDataCode2dParam) or after that pass in which the requested number of 2D data code symbols was successfully decoded. The required number of symbols can be specified with the generic parameter GenParamNamesGenParamNamesGenParamNamesGenParamNamesgenParamNames = 'stop_after_result_num'"stop_after_result_num""stop_after_result_num""stop_after_result_num""stop_after_result_num". The appropriate value is passed in GenParamValuesGenParamValuesGenParamValuesGenParamValuesgenParamValues; the default is 1.

While searching for more than one symbol in the image, it may happen that not all symbols are detected in the same pass. In this case find_data_code_2dfind_data_code_2dfind_data_code_2dFindDataCode2dFindDataCode2d automatically continues the search until all symbols are found or until the last pass was performed. Otherwise, if the input image contains several symbols but not all have to be read, it is possible (especially if the symbols look similar) that more than the requested number of symbols are returned as a result.

Query results of the symbol search

With the result handles and the operators get_data_code_2d_resultsget_data_code_2d_resultsget_data_code_2d_resultsGetDataCode2dResultsGetDataCode2dResults and get_data_code_2d_objectsget_data_code_2d_objectsget_data_code_2d_objectsGetDataCode2dObjectsGetDataCode2dObjects, additional data can be requested about the search process, e.g., the number of internal search passes or the number of investigated candidates, and - together with the ResultHandlesResultHandlesResultHandlesResultHandlesresultHandles - about the symbols, like the symbol and module size, the contrast, or the raw data coded in the symbol. In addition, these operators provide information about all investigated candidates that could not be read. In particular, this helps to determine if a candidate was actually generated at the symbol's position during the preprocessing and - by the value of a status variable - why the search or reading was aborted. Further information about the parameters can be found with the operators get_data_code_2d_resultsget_data_code_2d_resultsget_data_code_2d_resultsGetDataCode2dResultsGetDataCode2dResults and get_data_code_2d_objectsget_data_code_2d_objectsget_data_code_2d_objectsGetDataCode2dObjectsGetDataCode2dObjects.

Parallelization

Parameters

ImageImageImageImageimage (input_object)  image objectHImageHImageHImageXHobject (byte)

Input image.

SymbolXLDsSymbolXLDsSymbolXLDsSymbolXLDssymbolXLDs (output_object)  xld_cont(-array) objectHXLDContHXLDContHXLDContXHobject *

XLD contours that surround the successfully decoded data code symbols.

DataCodeHandleDataCodeHandleDataCodeHandleDataCodeHandledataCodeHandle (input_control)  datacode_2d HDataCode2D, HTupleHDataCode2D, HTupleHDataCode2DX, VARIANTHtuple (integer) (IntPtr) (Hlong) (Hlong) (Hlong)

Handle of the 2D data code model.

GenParamNamesGenParamNamesGenParamNamesGenParamNamesgenParamNames (input_control)  attribute.name(-array) HTupleHTupleVARIANTHtuple (string) (string) (char*) (BSTR) (char*)

Names of (optional) parameters for controlling the behavior of the operator.

Default value: []

List of values: 'train'"train""train""train""train", 'stop_after_result_num'"stop_after_result_num""stop_after_result_num""stop_after_result_num""stop_after_result_num"

GenParamValuesGenParamValuesGenParamValuesGenParamValuesgenParamValues (input_control)  attribute.value(-array) HTupleHTupleVARIANTHtuple (integer / real / string) (int / long / double / string) (Hlong / double / char*) (Hlong / double / BSTR) (Hlong / double / char*)

Values of the optional generic parameters.

Default value: []

Suggested values: 'all'"all""all""all""all", 'model_type'"model_type""model_type""model_type""model_type", 'symbol_size'"symbol_size""symbol_size""symbol_size""symbol_size", 'version'"version""version""version""version", 'module_size'"module_size""module_size""module_size""module_size", 'small_modules_robustness'"small_modules_robustness""small_modules_robustness""small_modules_robustness""small_modules_robustness", 'module_shape'"module_shape""module_shape""module_shape""module_shape", 'polarity'"polarity""polarity""polarity""polarity", 'mirrored'"mirrored""mirrored""mirrored""mirrored", 'contrast'"contrast""contrast""contrast""contrast", 'module_grid'"module_grid""module_grid""module_grid""module_grid", 'finder_pattern_tolerance'"finder_pattern_tolerance""finder_pattern_tolerance""finder_pattern_tolerance""finder_pattern_tolerance", 'image_proc'"image_proc""image_proc""image_proc""image_proc", 1, 2, 3

ResultHandlesResultHandlesResultHandlesResultHandlesresultHandles (output_control)  integer(-array) HTupleHTupleVARIANTHtuple (integer) (int / long) (Hlong) (Hlong) (Hlong)

Handles of all successfully decoded 2D data code symbols.

DecodedDataStringsDecodedDataStringsDecodedDataStringsDecodedDataStringsdecodedDataStrings (output_control)  string(-array) HTupleHTupleVARIANTHtuple (string) (string) (char*) (BSTR) (char*)

Decoded data strings of all detected 2D data code symbols in the image.

Example (HDevelop)

* Examples showing the use of find_data_code_2d.
* First, the operator is used to train the model, afterwards it is used to
* read the symbol in another image.

* Create a model for reading Data matrix ECC 200 codes
create_data_code_2d_model ('QR Code', [], [], DataCodeHandle)
* Read a training image
read_image (Image, 'datacode/ecc200/ecc200_cpu_008')
* Train the model with the symbol in the image
find_data_code_2d (Image, SymbolXLDs, DataCodeHandle, 'train', 'all', \
                   ResultHandles, DecodedDataStrings)
*
* End of training / begin of normal application
*

* Read an image
read_image (Image, 'datacode/ecc200/ecc200_cpu_010')
* Read the symbol in the image
find_data_code_2d (Image, SymbolXLDs, DataCodeHandle, [], [], \
                   ResultHandles, DecodedDataStrings)

* Display all symbols, the strings encoded in them, and the module size
dev_set_color ('green')
for i := 0 to |ResultHandles| - 1 by 1
    select_obj (SymbolXLDs, SymbolXLD, i+1)
    dev_display (SymbolXLD)
    get_contour_xld (SymbolXLD, Row, Col)
    set_tposition (WindowHandle, max(Row), min(Col))
    write_string (WindowHandle, DecodedDataStrings[i])
    get_data_code_2d_results (DataCodeHandle, ResultHandles[i], \
                              ['module_height','module_width'], ModuleSize)
    new_line (WindowHandle)
    write_string (WindowHandle, 'module size = ' + ModuleSize[0] + 'x' + \
                                 ModuleSize[1])
endfor

* Clear the model
clear_data_code_2d_model (DataCodeHandle)

Result

The operator find_data_code_2dfind_data_code_2dfind_data_code_2dFindDataCode2dFindDataCode2d returns the value 2 (H_MSG_TRUE) if the given parameters are correct. Otherwise, an exception will be raised.

Possible Predecessors

create_data_code_2d_modelcreate_data_code_2d_modelcreate_data_code_2d_modelCreateDataCode2dModelCreateDataCode2dModel, read_data_code_2d_modelread_data_code_2d_modelread_data_code_2d_modelReadDataCode2dModelReadDataCode2dModel, set_data_code_2d_paramset_data_code_2d_paramset_data_code_2d_paramSetDataCode2dParamSetDataCode2dParam

Possible Successors

get_data_code_2d_resultsget_data_code_2d_resultsget_data_code_2d_resultsGetDataCode2dResultsGetDataCode2dResults, get_data_code_2d_objectsget_data_code_2d_objectsget_data_code_2d_objectsGetDataCode2dObjectsGetDataCode2dObjects, write_data_code_2d_modelwrite_data_code_2d_modelwrite_data_code_2d_modelWriteDataCode2dModelWriteDataCode2dModel

See also

create_data_code_2d_modelcreate_data_code_2d_modelcreate_data_code_2d_modelCreateDataCode2dModelCreateDataCode2dModel, set_data_code_2d_paramset_data_code_2d_paramset_data_code_2d_paramSetDataCode2dParamSetDataCode2dParam, get_data_code_2d_resultsget_data_code_2d_resultsget_data_code_2d_resultsGetDataCode2dResultsGetDataCode2dResults, get_data_code_2d_objectsget_data_code_2d_objectsget_data_code_2d_objectsGetDataCode2dObjectsGetDataCode2dObjects

Module

Data Code


Table of Contents / Identification / Data Code ClassesClassesClasses | | | Operators
HALCON Reference Manual 10.0.2 Copyright © 1996-2011 MVTec Software GmbH