<a id="easyqrcode-using"></a>

# Using EasyQRCode

This document details all the capabilities of **EasyQRCode** beyond calling [`EQRCodeReader::Read()`](../../../doxygen_cpp/classeVision_1_1EQRCodeReader.html#aca78237d6203febd6221ed2e05cdc19b) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeReader.html#af3a09d6c336baba0d2d1f078f37c6877) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeReader.html#a98fbd0bb085de6d6d609875e6cc82ae4) on an image.

#### NOTE
The method [`EQRCodeReader::Read`](../../../doxygen_cpp/classeVision_1_1EQRCodeReader.html#aca78237d6203febd6221ed2e05cdc19b) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeReader.html#af3a09d6c336baba0d2d1f078f37c6877) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeReader.html#a98fbd0bb085de6d6d609875e6cc82ae4) supports multithreading.

The multithreading splits the load between the detection methods (such as [`EQRDetectionMethod_AdaptiveThreshold`](../../../doxygen_cpp/namespaceeVision.html#a78f2124b731a0e98bc520861ff4901ad) [<sub>.NET</sub>](../../../doxygen_cs/namespaceeVision.html#ad31bc3bac850e108aa95e3400a561338) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRDetectionMethod.html) and [`EQRDetectionMethod_Gradient`](../../../doxygen_cpp/namespaceeVision.html#a78f2124b731a0e98bc520861ff4901ad) [<sub>.NET</sub>](../../../doxygen_cs/namespaceeVision.html#ad31bc3bac850e108aa95e3400a561338) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRDetectionMethod.html)) and decodes multiple candidates in parallel. This is useful when there are several codes in the image.

<a id="easyqrcode-contents"></a>

## Contents of the `EQRCode` Object

* The QR code reader uses the [gravity center](../../../doxygen_cpp/structeVision_1_1EQuadrangle.html#ac890cce55e2118ea796c7d3ca8d037c6) [<sub>.NET</sub>](../../../doxygen_cs/structeVision_1_1EQuadrangle.html#a017a2d1837239011e7043da07cb37989) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQuadrangle.html#ad02a4c58f190f24371ff6656d251395d) of the [QR code geometries](../../../doxygen_cpp/classeVision_1_1EQRCodeGeometry.html) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeGeometry.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeGeometry.html) to sort the QR code candidates in line then columns order starting from the top left corner of the image.
* The QR code reader decodes the QR candidates and returns a vector of [EQRCode](../../../doxygen_cpp/classeVision_1_1EQRCode.html) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCode.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCode.html), each one containing:
  * The [model](../../../doxygen_cpp/classeVision_1_1EQRCode.html#a013adadafde4725d8e3ca48f55100107) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCode.html#ac65504db997a492ce1aaf568976d5f3e) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCode.html#a05378c1a74ac3276476fe31db1086fc1), [version](../../../doxygen_cpp/classeVision_1_1EQRCode.html#aa390bada368c382630f4a025528e3f43) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCode.html#af619ce3414c0170a80c6d4024324c8c9) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCode.html#a10972931091f1e2d80de38f4f5f05175) and [level](../../../doxygen_cpp/classeVision_1_1EQRCode.html#aee491036497f53564750eab83761ba47) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCode.html#a1b800dccc9b36c2f0eb348243ea0ac15) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCode.html#a22b30d9681f1a946c5ecc85b2c07d403) of the QR code.
  * A [geometry](../../../doxygen_cpp/classeVision_1_1EQRCode.html#a9d5dacceefa4ff5eabd822875b926967) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCode.html#aab26ab755d0011da415c47f05e42844b) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCode.html#aa760b771fa6dc587d6997ecec3c9aa62) object, containing the information related to the position of the QR code, see [below]().
  * The [decoded string](../../../doxygen_cpp/classeVision_1_1EQRCodeDecodedStreamPart.html#ae6e296c78bdf7de5ace45a09a60c98c9) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeDecodedStreamPart.html#a883e0093b4a843a4fb4f913fed3cb9e5) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeDecodedStreamPart.html#acbdc71faba64b9ec16540f5aa3bf42b9) and [decoded data](../../../doxygen_cpp/classeVision_1_1EQRCodeDecodedStreamPart.html#aae915754d9bff372de4e06a4f0c0b73e) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeDecodedStreamPart.html#ad5f15a6827d44b9208ebacf25a5e7855) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeDecodedStreamPart.html#a79a5dbac0b5ee649137a01d404d898f8) of the QR code. See more details [here]().
  * Whether the qrcode is [GS1](../../../doxygen_cpp/classeVision_1_1EQRCode.html#afb92fdf5ebd789a1c1f6e69dcdecd53e) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCode.html#ad38544cef8e7b298b8aa11e6c5d5387b) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCode.html#af48fd625e2a43af20e7b1c0fcfa41433).
  * The [`ISO 15415`](../../../doxygen_cpp/classeVision_1_1EQRCode.html#acae67c756e3c1f6f72737adad6d5aa95) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCode.html#af7003a436b10689b496fbd22937f0084) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCode.html#ae27dee216e9481f95275547a71ce2a8b) or [`ISO 29158`](../../../doxygen_cpp/classeVision_1_1EQRCode.html#a109b7c4c3afe5144d47ad9043a9fff34) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCode.html#aa76791c5ad247cf71389568323520bde) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCode.html#ac898b6e09f202184c88ed93daee7509f) grading results of the QR code (if [`EQRCodeReader::SetComputeGrading`](../../../doxygen_cpp/classeVision_1_1EQRCodeReader.html#add8deda02d69778ae7cd2080499d0fc6) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeReader.html#a684e74bd9cf06a88da5023a1505c8100) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeReader.html#afcd3122bb9bc94aa6506f635f6f22508) is `true`).
  * Methods to draw the QR code [`position`](../../../doxygen_cpp/classeVision_1_1EQRCode.html#af9269665e88a3c1578971d5a35022c30) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCode.html#a700b531fc4cf0743ad7b78d06c1380d5) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCode.html#a3bd18be5df16fb76b74bc5cde30a4b8a), [`grid`](../../../doxygen_cpp/classeVision_1_1EQRCode.html#a973aed205e43b890817fc1699a6c5a56) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCode.html#afae96bc9ae9c4621f8fce39b22daf102) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCode.html#a2ff659cd75c932709ba56b6bdd1237b6), [`errors`](../../../doxygen_cpp/classeVision_1_1EQRCode.html#afe67de4fe4ae6189983f0b448a832697) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCode.html#a5f9e494ec061612dc3953fa59d809c81) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCode.html#a3d768c3243b5dfca94265906a56ccc9c) and [`decoded string`](../../../doxygen_cpp/classeVision_1_1EQRCode.html#a59f864c5da48b31421f5a8dc9902de0d) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCode.html#aeb2f3665fe34e24376239f18875440fc) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCode.html#a083d0e25d7069171649f35e89490e6c8) on the source image.
  * The amount of [unused error correction](../../../doxygen_cpp/classeVision_1_1EQRCode.html#acb5c5c1b59c91453a6e928bdf21b561e) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCode.html#a7147d9be63afb39f467f26ac4c8988fc) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCode.html#a0f2e8a847a795af20886bb83210bbc93).
    * Close to 1, very few errors were corrected when decoding the data and the decoding is highly reliable.
    * Close to 0, many errors were corrected when decoding the data and the decoding is reliable, but the QR code quality is poor.
    * -1, error correction failed and the decoding was not performed.

<a id="easyqrcode-geometry"></a>

### QR Code Geometry

A [QR code geometry](../../../doxygen_cpp/classeVision_1_1EQRCode.html#a9d5dacceefa4ff5eabd822875b926967) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCode.html#aab26ab755d0011da415c47f05e42844b) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCode.html#aa760b771fa6dc587d6997ecec3c9aa62) is a set of points:

* It contains the coordinates of the [corners](../../../doxygen_cpp/structeVision_1_1EQuadrangle.html#a653ccce0faa38cb9ed42ad1ec013a7ef) [<sub>.NET</sub>](../../../doxygen_cs/structeVision_1_1EQuadrangle.html#adf2f97fbcafd412e977ce0cce5cd56c9) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQuadrangle.html#a3d7d724e60ffdefb31f22d76db046124) of the QR code as an [`EQuadrangle`](../../../doxygen_cpp/structeVision_1_1EQuadrangle.html) [<sub>.NET</sub>](../../../doxygen_cs/structeVision_1_1EQuadrangle.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQuadrangle.html). The corners are ordered as following: bottom left, top left, top right, bottom right.
* It contains the coordinates of the [finder pattern centers](../../../doxygen_cpp/classeVision_1_1EQRCodeGeometry.html#a29e25f0e0035489ba7ac8672cb29559e) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeGeometry.html#a7c75beaaee21213f6563bbdfae8e9c2c) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeGeometry.html#a697a174a3681ccb56e623a0148e82b6b) (bottom left, top left, top right).
* For a Micro QR code symbol, the coordinates for a single [finder pattern center](../../../doxygen_cpp/classeVision_1_1EQRCodeGeometry.html#a29e25f0e0035489ba7ac8672cb29559e) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeGeometry.html#a7c75beaaee21213f6563bbdfae8e9c2c) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeGeometry.html#a697a174a3681ccb56e623a0148e82b6b) are returned.

**EasyQRCode** uses a float coordinate system and the origin (0.0, 0.0) is the top left corner of the top left pixel of the image.

![image](assets/images/easyqrcode/qr-geometry.webp)

<a id="easyqrcode-retrieve-and-interpret"></a>

## Retrieve and Interpret the Read Data

<a id="easyqrcode-retrieve"></a>

### Retrieving the Decoded Data

To retrieve the decoded data, you can (in growing complexity order):

<a id="easyqrcode-retrieve-1"></a>

#### Method 1

Use the method [`EQRCode::GetDecodedString`](../../../doxygen_cpp/classeVision_1_1EQRCode.html#ae23a514a154d06ea9d9d12af88e10c49) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCode.html#a6f7a215ffa51a73b191db6882c081b55) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCode.html#aff5a05f073cfdab7850290355b4bbb0b) of an object [`EQRCode`](../../../doxygen_cpp/classeVision_1_1EQRCode.html) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCode.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCode.html).

1. Call this method to get an UTF-8 formatted string that contains the concatenated data of the QR code.
2. Optionally, give an [`EByteInterpretationMode`](../../../doxygen_cpp/namespaceeVision.html#a4ad20fca8039cfcce726a7c98d18fce0) [<sub>.NET</sub>](../../../doxygen_cs/namespaceeVision.html#abc46e442042be4d8d8a29dfd7879a7df) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EByteInterpretationMode.html) as argument.
3. For the `GS1` QR codes:
   * Use [`EQRCode::GetDecodedString`](../../../doxygen_cpp/classeVision_1_1EQRCode.html#ae23a514a154d06ea9d9d12af88e10c49) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCode.html#a6f7a215ffa51a73b191db6882c081b55) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCode.html#aff5a05f073cfdab7850290355b4bbb0b) to get the machine-readable code (for ex.:` ]Q31118011215190101`).
   * Use [`EGs1Translator::GetHumanReadableCode`](../../../doxygen_cpp/classeVision_1_1EGs1Translator.html#a7d8dacd41b6196defa88758d5986c6a4) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EGs1Translator.html#a6026434928b11f93ff0c3875d4bab1da) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EGs1Translator.html#a1a39a3262b14b78cb3675ec4fd57630b) to get the human-readable version (for ex.: `(11)180112(15)190101`).

<a id="easyqrcode-retrieve-2"></a>

#### Method 2

Use the method [`EQRCodeDecodedStreamPart::GetDecodedString`](../../../doxygen_cpp/classeVision_1_1EQRCodeDecodedStreamPart.html#ae6e296c78bdf7de5ace45a09a60c98c9) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeDecodedStreamPart.html#a883e0093b4a843a4fb4f913fed3cb9e5) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeDecodedStreamPart.html#acbdc71faba64b9ec16540f5aa3bf42b9) of the objects [`EQRCodeDecodedStreamPart`](../../../doxygen_cpp/classeVision_1_1EQRCodeDecodedStreamPart.html) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeDecodedStreamPart.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeDecodedStreamPart.html).

1. Call this method on a part to get an UTF-8 formatted string that contains the data of this part.
2. Optionally, give an [`EByteInterpretationMode`](../../../doxygen_cpp/namespaceeVision.html#a4ad20fca8039cfcce726a7c98d18fce0) [<sub>.NET</sub>](../../../doxygen_cs/namespaceeVision.html#abc46e442042be4d8d8a29dfd7879a7df) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EByteInterpretationMode.html) as argument.
3. Concatenate the decoded string of each part.

<a id="easyqrcode-retrieve-3"></a>

#### Method 3

Use the method [`EQRCodeDecodedStreamPart::GetDecodedData`](../../../doxygen_cpp/classeVision_1_1EQRCodeDecodedStreamPart.html#aae915754d9bff372de4e06a4f0c0b73e) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeDecodedStreamPart.html#ad5f15a6827d44b9208ebacf25a5e7855) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeDecodedStreamPart.html#a79a5dbac0b5ee649137a01d404d898f8) of the objects [`EQRCodeDecodedStreamPart`](../../../doxygen_cpp/classeVision_1_1EQRCodeDecodedStreamPart.html) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeDecodedStreamPart.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeDecodedStreamPart.html).

1. Call this method on a part to get a vector of bytes that contains the data of this part.
2. Interpret the data according to the [coding mode](../../../doxygen_cpp/classeVision_1_1EQRCodeDecodedStream.html#a0b5cbed53a9410edb3dcc2f94a221c67) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeDecodedStream.html#ae2124158ebada5535c68a09511507191) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeDecodedStream.html#addd858ebb848ca70cd81735129f34b76) of the QR code and the [encoding](../../../doxygen_cpp/classeVision_1_1EQRCodeDecodedStreamPart.html#aa1cff49681167b7d7bccdda1a70f4042) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeDecodedStreamPart.html#ac42360bb9409889add3d46678aee4d7c) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeDecodedStreamPart.html#a4a25d4deeadd291aa5038163f0079dbf) of each part.
3. Concatenate the interpreted data of each part.

<a id="easyqrcode-interpret"></a>

### Interpret the Read Data

The QR code data can be encoded in either alphanumeric, numeric or byte modes. If a QR code contains bytes, the interpretation mode of these bytes can be embedded in the QR code through the ECI protocol or you must specify or know it.

<a id="easyqrcode-interpretation"></a>

#### The Interpretation Mode

Use the dedicated [`EByteInterpretationMode`](../../../doxygen_cpp/namespaceeVision.html#a4ad20fca8039cfcce726a7c98d18fce0) [<sub>.NET</sub>](../../../doxygen_cs/namespaceeVision.html#abc46e442042be4d8d8a29dfd7879a7df) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EByteInterpretationMode.html) for this purpose:

* [`EByteInterpretationMode_Hexadecimal`](../../../doxygen_cpp/namespaceeVision.html#a4ad20fca8039cfcce726a7c98d18fce0) [<sub>.NET</sub>](../../../doxygen_cs/namespaceeVision.html#abc46e442042be4d8d8a29dfd7879a7df) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EByteInterpretationMode.html)
  * Converts all bytes to their hexadecimal values (2 characters per byte).
  * The escape character `0xEFBFBD` surrounds the converted byte parts.
  * This mode overrides the ECI table indicator if it is present.
* [`EByteInterpretationMode_UTF8`](../../../doxygen_cpp/namespaceeVision.html#a4ad20fca8039cfcce726a7c98d18fce0) [<sub>.NET</sub>](../../../doxygen_cs/namespaceeVision.html#abc46e442042be4d8d8a29dfd7879a7df) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EByteInterpretationMode.html)
  * Converts all bytes to UTF-8 if possible.
  * The method [`EQRCode::GetDecodedStream`](../../../doxygen_cpp/classeVision_1_1EQRCode.html#ac43f1f93c3b66f6cd3f40718f7a9f6c6) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCode.html#a01b234d54bb1be91310910620b3c2ebb) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCode.html#a5d30242a31406866ef59859a1eca6033) throws an [`EException`](../../../doxygen_cpp/classeVision_1_1EException.html) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EException.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EException.html) if the data are not UTF-8 compatible.
* [`EByteInterpretationMode_Auto`](../../../doxygen_cpp/namespaceeVision.html#a4ad20fca8039cfcce726a7c98d18fce0) [<sub>.NET</sub>](../../../doxygen_cs/namespaceeVision.html#abc46e442042be4d8d8a29dfd7879a7df) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EByteInterpretationMode.html)
  * Converts all bytes in the best possible way following the ECI protocol.

<a id="easyqrcode-decoded"></a>

#### The Decoded Data

The [decoded string](../../../doxygen_cpp/classeVision_1_1EQRCodeDecodedStreamPart.html#ae6e296c78bdf7de5ace45a09a60c98c9) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeDecodedStreamPart.html#a883e0093b4a843a4fb4f913fed3cb9e5) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeDecodedStreamPart.html#acbdc71faba64b9ec16540f5aa3bf42b9) returns the concatenated data of the QR code in UTF-8 format:

* If bytes are present in the QR code data without ECI, specify the [`EByteInterpretationMode`](../../../doxygen_cpp/namespaceeVision.html#a4ad20fca8039cfcce726a7c98d18fce0) [<sub>.NET</sub>](../../../doxygen_cs/namespaceeVision.html#abc46e442042be4d8d8a29dfd7879a7df) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EByteInterpretationMode.html) when you call the method [`EQRCode::GetDecodedStream`](../../../doxygen_cpp/classeVision_1_1EQRCode.html#ac43f1f93c3b66f6cd3f40718f7a9f6c6) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCode.html#a01b234d54bb1be91310910620b3c2ebb) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCode.html#a5d30242a31406866ef59859a1eca6033).
* If bytes are present in the QR code data with ECI encoding, use the corresponding byte interpretation table (currently, only table ECI 26: UTF-8 is available).
* The [hexadecimal byte interpretation mode](../../../doxygen_cpp/namespaceeVision.html#a4ad20fca8039cfcce726a7c98d18fce0) [<sub>.NET</sub>](../../../doxygen_cs/namespaceeVision.html#abc46e442042be4d8d8a29dfd7879a7df) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EByteInterpretationMode.html) does not throw an exception and returns all bytes parts present in the data in their hexadecimal form (2 characters per byte) surrounded by the `0xEFBFBD` escape character.

The [decoded stream](../../../doxygen_cpp/classeVision_1_1EQRCodeDecodedStream.html) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeDecodedStream.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeDecodedStream.html) class consists of:

* A coding mode (`basic`, `ECI`, `FNC1/GS1` or `FNC1/AIM`).
* An application indicator (if the coding mode is `FNC1/AIM`, otherwise `0`).

The [decoded data](../../../doxygen_cpp/classeVision_1_1EQRCodeDecodedStreamPart.html#aae915754d9bff372de4e06a4f0c0b73e) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeDecodedStreamPart.html#ad5f15a6827d44b9208ebacf25a5e7855) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeDecodedStreamPart.html#a79a5dbac0b5ee649137a01d404d898f8):

* Is accessible from each part of the decoded stream.
* Is interpreted according to its encoding (numeric, alphanumeric, byte or Kanji) and the [ECI table indicator](../../../doxygen_cpp/classeVision_1_1EQRCodeDecodedStreamPart.html#a19f7a7cfc75e664eccc8a62cf465ff59) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeDecodedStreamPart.html#a8596de880d463b257543a86fe1a5b9e4) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeDecodedStreamPart.html#a84c7d78bb14a4e59af353dd569d01222) (if the coding mode is `ECI`, otherwise `-1`).
* Can be the raw bit stream (the bit data after unmasking and error correction, but before decoding as a vector of bytes).
* Can be the corresponding [decoded string](../../../doxygen_cpp/classeVision_1_1EQRCodeDecodedStreamPart.html#ae6e296c78bdf7de5ace45a09a60c98c9) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeDecodedStreamPart.html#a883e0093b4a843a4fb4f913fed3cb9e5) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeDecodedStreamPart.html#acbdc71faba64b9ec16540f5aa3bf42b9) (specify a [byte interpretation mode](../../../doxygen_cpp/namespaceeVision.html#a4ad20fca8039cfcce726a7c98d18fce0) [<sub>.NET</sub>](../../../doxygen_cs/namespaceeVision.html#abc46e442042be4d8d8a29dfd7879a7df) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EByteInterpretationMode.html) if the encoding is byte without ECI coding mode or if the ECI table is not supported).

#### SEE ALSO
See the code snippet [Retrieving the Decoded Data (Advanced)](../../../resources/code_snippets/text_and_code_reading/easyqrcode/retrievingthedecodeddataadvanced.html.md).

<a id="easyqrcode-print-quality"></a>

## Compute the Code Print Quality

* When [`EQRCodeReader::SetComputeGrading`](../../../doxygen_cpp/classeVision_1_1EQRCodeReader.html#add8deda02d69778ae7cd2080499d0fc6) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeReader.html#a684e74bd9cf06a88da5023a1505c8100) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeReader.html#afcd3122bb9bc94aa6506f635f6f22508) is set to `true`:
  * **EasyQRCode** computes the print quality indicators as defined by **ISO 15415** and **ISO/IEC TR 29158** (formerly known as **AIM DPM-1-2006**) during the [`EQRCodeReader::Read`](../../../doxygen_cpp/classeVision_1_1EQRCodeReader.html#aca78237d6203febd6221ed2e05cdc19b) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeReader.html#af3a09d6c336baba0d2d1f078f37c6877) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeReader.html#a98fbd0bb085de6d6d609875e6cc82ae4) operation.
  * Use the methods [`EQRCode::GetIso15415GradingParameters`](../../../doxygen_cpp/classeVision_1_1EQRCode.html#acae67c756e3c1f6f72737adad6d5aa95) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCode.html#af7003a436b10689b496fbd22937f0084) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCode.html#ae27dee216e9481f95275547a71ce2a8b) and [`EQRCode::GetIso29158GradingParameters`](../../../doxygen_cpp/classeVision_1_1EQRCode.html#a109b7c4c3afe5144d47ad9043a9fff34) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCode.html#aa76791c5ad247cf71389568323520bde) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCode.html#ac898b6e09f202184c88ed93daee7509f) to retrieve the grades.

  #### NOTE
  The print quality is not yet available for Micro QR code models.
* Grade computing:
  * For more accurate results, the modules should be at least 10 pixels in width.
  * **EasyQRCode** requires a 1-module quiet zone for grading.
  * **EasyQRCode** evaluates the [Fixed Pattern Damage](../../../doxygen_cpp/structeVision_1_1EQRCodeIso15415GradingParameters.html) [<sub>.NET</sub>](../../../doxygen_cs/structeVision_1_1EQRCodeIso15415GradingParameters.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeIso15415GradingParameters.html) with a 4-module quiet zone around the finder patterns.
    * If this condition is not met, the `Fixed Pattern Parameter Grade` is returned as `-1`.
    * This result affects the overall symbol grade.
  * The [Version Additional Parameter](../../../doxygen_cpp/structeVision_1_1EQRCodeIso15415GradingParameters.html) [<sub>.NET</sub>](../../../doxygen_cs/structeVision_1_1EQRCodeIso15415GradingParameters.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeIso15415GradingParameters.html) is returned as `-1` when it is not applicable.
    * In this case, this result is ignored in the overall symbol grade.
  * The implementation follows closely the standard but the grades also depend on the decoding algorithm.
    * The results may slightly differ according to the **eVision** version.

#### NOTE
Our implementation of **ISO 29158**, a complement to **ISO 15415**, includes only those parameters that are unique or redefined in **ISO 29158**.

For parameters common to both standards, please refer to the corresponding **ISO 15415** struct fields.

#### SEE ALSO
For more information on the code grading, see [Code Grading](../code_grading/index.html.md).

<a id="easyqrcode-grid-read"></a>

## Read QR Codes Placed on a Grid

![image](assets/images/easyqrcode/grid.webp)

If the codes in the images are arranged in a regular grid-like fashion:

* Use the dedicated method [`EQRCodeReader::Read`](../../../doxygen_cpp/classeVision_1_1EQRCodeReader.html#aca78237d6203febd6221ed2e05cdc19b) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeReader.html#af3a09d6c336baba0d2d1f078f37c6877) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeReader.html#a98fbd0bb085de6d6d609875e6cc82ae4) overloads that take an [`EGrid`](../../../doxygen_cpp/classeVision_1_1EGrid.html) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EGrid.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EGrid.html) object to improve the reliability and the speed of the reading.
* Use the methods [`EGrid::SetEnableCell`](../../../doxygen_cpp/classeVision_1_1EGrid.html#aba771f188948f660da2c0194a9b58a3f) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EGrid.html#a1fd0da028d375583b1e88dcce0773be4) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EGrid.html#a8b512a41cd91f259e36ecbb171d78865), [`EGrid::SetEnableRow`](../../../doxygen_cpp/classeVision_1_1EGrid.html#a3844f5b8b179aeaf4a2126498caf2f76) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EGrid.html#a773b4e6991849b0ecc1ba54fd3cbcacc) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EGrid.html#a39048b6eb0c0ffd668612f477c310d76), [`EGrid::SetEnableColumn`](../../../doxygen_cpp/classeVision_1_1EGrid.html#a38b2cd477e372de59eb97368b9e99bb8) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EGrid.html#a58a6e9901b3fda53ee457f02a590f049) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EGrid.html#a7f3a7e831554b929a05d5aeb4a78f1ee) or [`EGrid::SetEnableAll`](../../../doxygen_cpp/classeVision_1_1EGrid.html#a94d5c95f83523c96f7f3ce4183117803) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EGrid.html#af176f6ab91c3a5b439526df7442d0ed6) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EGrid.html#a6ab6b2c8a001ead2c95b6c6662ac61dc) to disable the processing of cells that you know do not contain any code.
* Use the method [`EQRCodeGrid::GetResults`](../../../doxygen_cpp/classeVision_1_1EQRCodeGrid.html#a03b6d2ce73f77d3b46169e867af9821a) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeGrid.html#af040b1a24f236de38a76422643e09084) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeGrid.html#a57071f61d36481127764be2115991233) to retrieve the codes read in each cell of the defined grid.

#### SEE ALSO
For an example, see [Reading a Grid of QR Codes](../../../resources/code_snippets/text_and_code_reading/easyqrcode/readingagridofqrcodes.html.md).

<a id="easyqrcode-reading-parameters"></a>

## Reading Parameters

<a id="easyqrcode-max-nb"></a>

### Maximum Number of Expected Codes

* Use the parameter [`EQRCodeReader::SetMaxNumCodes`](../../../doxygen_cpp/classeVision_1_1EQRCodeReader.html#aec2fcbca42f5913a6066826bdc6d28b8) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeReader.html#ad60fa65ae5c9a51432ad3db0cfc5f6a1) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeReader.html#a7e60db86f1fd0238a0cabd56d00aaa2d) to set the maximum number of codes that **EasyQRCode** returns.

<a id="easyqrcode-searched-models"></a>

### Searched Models and Versions

#### NOTE
By default, **EasyQRCode** searches for QR codes of model 1 and 2 and all versions.

* You can shorten the process by specifying the QR code model(s) and a range of versions (from 1 to 40) to search for.
* By default, **EasyQRCode** does not search for Micro QR code symbols.

* Use the parameter [`EQRCodeReader::SetSearchedModels`](../../../doxygen_cpp/classeVision_1_1EQRCodeReader.html#ae09c2e8d388eb9be5cdde695f74719f2) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeReader.html#aa75a161ddb9f814d22f7f52cde466b94) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeReader.html#a4e05fae3820c5cf3a6bee9e8ccfd66a7) to select the QR code models that **EasyQRCode** searches and returns. The available models are:
  * Model 1
  * Model 2 or 2005
  * Micro QR code
* Use the parameters [`EQRCodeReader::SetMinimumVersion`](../../../doxygen_cpp/classeVision_1_1EQRCodeReader.html#ac12e9fe50b1299050ce24218a07aec3d) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeReader.html#a8be59948cb90b8dc56d807f997600455) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeReader.html#a5538ba6123a7564baf56d142212492ad) and [`EQRCodeReader::SetMaximumVersion`](../../../doxygen_cpp/classeVision_1_1EQRCodeReader.html#a29fac78129a66e3f9d6fd7891bdc8fc7) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeReader.html#ad5d6036a678390274740533485ca9354) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeReader.html#a57d9fcbdd1d3e89e11677e925984d43a) to set the range of versions that **EasyQRCode** uses to find patterns.

<a id="easyqrcode-compute-grading"></a>

### Compute Grading

* Use the parameter [`EQRCodeReader::SetComputeGrading`](../../../doxygen_cpp/classeVision_1_1EQRCodeReader.html#add8deda02d69778ae7cd2080499d0fc6) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeReader.html#a684e74bd9cf06a88da5023a1505c8100) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeReader.html#afcd3122bb9bc94aa6506f635f6f22508) to compute the QR code grading together with the code reading.

  #### SEE ALSO
  See [Compute the Code Print Quality]() for more details on the code grading and the display of the results.

<a id="easyqrcode-show-unreliable"></a>

### Show Unreliable Codes

* An “unreliable code” is an object that **EasyQRCode** detects as a code but that it cannot read or decode.
* By default, these unreliable codes are filtered out.
* Use the parameter [`EQRCodeReader::SetFilterOutUnreliablyDecodedQRCodes`](../../../doxygen_cpp/classeVision_1_1EQRCodeReader.html#a6630cf503ab81b5eac08170c58561e5e) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeReader.html#a18e9a14914f104678487169c006eb06f) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeReader.html#a4c67ff85c5da46c81ee74817a8b03751) to return and display the unreliable QR codes.

<a id="easyqrcode-timeout"></a>

### Timeout

If you have a defined time constraint:

* Use [`EQRCodeReader::SetTimeOut`](../../../doxygen_cpp/classeVision_1_1EQRCodeReader.html#a016d703f47b2b9a90c92058dff24b4f6) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeReader.html#a3d70cd32932e95c8fc12b72b0e9342d1) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeReader.html#addb575617d133bd54a44ede0a82a1c76) to define a timeout for the [`EQRCodeReader`](../../../doxygen_cpp/classeVision_1_1EQRCodeReader.html) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeReader.html) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeReader.html) object. This timeout limits the amount of time available to the [`EQRCodeReader::Read`](../../../doxygen_cpp/classeVision_1_1EQRCodeReader.html#aca78237d6203febd6221ed2e05cdc19b) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeReader.html#af3a09d6c336baba0d2d1f078f37c6877) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeReader.html#a98fbd0bb085de6d6d609875e6cc82ae4) method and forces it to return early if needed.

<a id="easyqrcode-advanced-parameters"></a>

### Advanced Parameters

<a id="easyqrcode-detection-method"></a>

#### Detection Method

* **EasyQRCode** can detect finder patterns using different methods:
  * [`EQRDetectionMethod_AdaptiveThreshold`](../../../doxygen_cpp/namespaceeVision.html#a78f2124b731a0e98bc520861ff4901ada1e18c465e59878a0a060930744afdd86) [<sub>.NET</sub>](../../../doxygen_cs/namespaceeVision.html#ad31bc3bac850e108aa95e3400a561338) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRDetectionMethod.html#a6e6b3afb9b9526d017ece11cf8121f79): based on adaptive thresholding of the image.
  * [`EQRDetectionMethod_Gradient`](../../../doxygen_cpp/namespaceeVision.html#a78f2124b731a0e98bc520861ff4901adab936922ee3f411ece9a88b9faa61448b) [<sub>.NET</sub>](../../../doxygen_cs/namespaceeVision.html#ad31bc3bac850e108aa95e3400a561338) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRDetectionMethod.html#a622e6353c1b9988a582bc8ebcbc7cf99): based on gradients in the image.
  * Legacy gradient-based detection algorithms (developed for **eVision** 1.2.2):
    * [`EQRDetectionMethod_PerspectiveLegacy`](../../../doxygen_cpp/namespaceeVision.html#a78f2124b731a0e98bc520861ff4901adac819167efcf0499f8d62f68939013001) [<sub>.NET</sub>](../../../doxygen_cs/namespaceeVision.html#ad31bc3bac850e108aa95e3400a561338) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRDetectionMethod.html#a882ebfbaa4494cc75bed9301d9641023): improved perspective mode.
    * [`EQRDetectionMethod_GradientLegacy`](../../../doxygen_cpp/namespaceeVision.html#a78f2124b731a0e98bc520861ff4901ada2eff4acb26644bec20b811b440558d7e) [<sub>.NET</sub>](../../../doxygen_cs/namespaceeVision.html#ad31bc3bac850e108aa95e3400a561338) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRDetectionMethod.html#a3c653fd0ef13d03c4c28825abb86c0b9): basic perspective mode.
* Use the parameter [`EQRCodeReader::SetDetectionMethod`](../../../doxygen_cpp/classeVision_1_1EQRCodeReader.html#a6dcf1b8e0bd6b691d4478693559971b3) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeReader.html#a9fbf1e52b1addf092607eabed2688100) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeReader.html#a294fff7823dae08365b39552782e3689) to select the detection method(s) that **EasyQRCode** uses to find patterns.

<a id="easyqrcode-min-isotropy"></a>

#### Minimum Isotropy

* The isotropy of a QR code represents its rectangular deformation. It is the short side divided by the long side, whether the rectangle is vertical or horizontal.
  * A perfectly square QR code has an isotropy of 1.
  * **EasyQRCode** can detect rectangle QR codes with an isotropy down to 0.5.
  * You can adjust the minimum isotropy between 0 to 1 (the default is 0.75).

![](assets/images/easyqrcode/studio2/reading_param_isotropy_illu_1.webp)![](assets/images/easyqrcode/studio2/reading_param_isotropy_illu_05h.webp)![](assets/images/easyqrcode/studio2/reading_param_isotropy_illu_05v.webp)
* Use the parameter [`EQRCodeReader::SetMinimumIsotropy`](../../../doxygen_cpp/classeVision_1_1EQRCodeReader.html#acbed3210652434926dd2f34eeb468ce2) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeReader.html#a8b817019b68ccc121a729afeebeea7f6) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeReader.html#aca3fe6cc905869f42f6eafa79512b089) to set the minimum isotropy of detected codes.

<a id="easyqrcode-min-score"></a>

#### Minimum Score

* **EasyQRCode** searches for the QR code finder pattern:
  ![image](assets/images/easyqrcode/studio2/illu_finder_pattern.webp)
  * A perfect match returns a pattern finder score of 1.
  * Less accurate matches return lower scores.
  * You can adjust the minimum score between 0 to 1 (the default is 0.7).
* Use the parameter [`EQRCodeReader::SetMinimumScore`](../../../doxygen_cpp/classeVision_1_1EQRCodeReader.html#a317cb34f2d853be1eaf58990e7ee3702) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeReader.html#a5c1103a13984b54188c43a3e3908644f) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeReader.html#a3ead45fd0824e3c61696dd08ad172757) to set the minimum score for an instance to be accepted and returned.

<a id="easyqrcode-cell-polarity-confidence-threshold"></a>

#### Cell Polarity Confidence Threshold

* The cell polarity confidence reflects the confidence in the cell digitization result, on a scale from 0 to 1. When the cell confidence is under the threshold, an additional processing is attempted to improve its polarity detection:
  * Increasing the threshold can improve the reading of overprinted or underprinted QR codes.
  * A high threshold can affect the speed and increase the probability of false positive changes.
  * You can adjust the threshold between 0 to 1 (the default is 0.2).
* Use the parameter [`EQRCodeReader::SetCellPolarityConfidenceThreshold`](../../../doxygen_cpp/classeVision_1_1EQRCodeReader.html#a1b38be3f4c2d85dbade91fd405c5ecae) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeReader.html#a2912942a1f46bbfcca20ff8c4d9b7058) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeReader.html#a9e1c0a72e82e396ba1b522df2e5b83b3) to set the minimum cell polarity confidence threshold.

<a id="easyqrcode-scan-precision"></a>

#### Scan Precision

* Use the parameter [`EQRCodeReader::SetScanPrecision`](../../../doxygen_cpp/classeVision_1_1EQRCodeReader.html#a959ff8e2ebb05750f835a769c7226033) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeReader.html#a578cb594e876fb5b000a074404c9f605) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeReader.html#a1cd35004b8677ff9ef304e4013822175) to select the precision used to scan the search field:
  * `Fine`: recommended for small QR codes
  * `Coarse`: recommended for large images with medium to large QR codes
  * `Automatic`: the QR code reader determines the scan precision automatically

<a id="easyqrcode-foreground-detection-threshold"></a>

#### Foreground Detection Threshold

* The foreground detection threshold is the minimum number of grayscale-values that a pixel should deviate from its local background to be considered as part of the foreground. A small threshold value may help to locate codes in low contrast images. (The default value is `10`.)
* Use the parameter [`EQRCodeReader::SetForegroundDetectionThreshold`](../../../doxygen_cpp/classeVision_1_1EQRCodeReader.html#adb9d6b56cc77d85f875edf90de1a7546) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeReader.html#a3e15e30b26518076b6b453b27c8ef05c) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeReader.html#a01d037d7d69fd849f0385b3168a4ac70) to set the minimum foreground detection threshold.
* The default parameter for this value usually works well. It is thus unlikely that you have to modify it.

<a id="easyqrcode-adaptive-threshold-half-kernel-size"></a>

#### Adaptive Threshold Half Kernel Size

* The [`EQRDetectionMethod_AdaptiveThreshold`](../../../doxygen_cpp/namespaceeVision.html#a78f2124b731a0e98bc520861ff4901ada1e18c465e59878a0a060930744afdd86) [<sub>.NET</sub>](../../../doxygen_cs/namespaceeVision.html#ad31bc3bac850e108aa95e3400a561338) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRDetectionMethod.html#a6e6b3afb9b9526d017ece11cf8121f79) detection method is based on thresholding pixels with respect to the average of their neighborhood.
* Use the parameter [`EQRCodeReader::SetAdaptiveThresholdHalfKernelSize`](../../../doxygen_cpp/classeVision_1_1EQRCodeReader.html#adf820ccd18a3dc281737f3acff4b7428) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeReader.html#a9f7c696d4008ba092dbb11492424156d) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeReader.html#a9799940c335bf582564d42dd1627c0ff) to set the half of the size of that neighborhood. Its default value is `50` (i.e. a `101 x 101` square neighborhood).
* This default value of `50` usually works well. If that’s not the case, try to set this to a value in the range of `2` to `4` times the module size.

#### NOTE
Before **eVision** 26.10, that parameter was computed from the image size. Set [`EQRCodeReader::SetComputeAdaptiveThresholdHalfKernelSizeFromImage`](../../../doxygen_cpp/classeVision_1_1EQRCodeReader.html#a596a7938f95da53131826cc025096a34) [<sub>.NET</sub>](../../../doxygen_cs/classeVision_1_1EQRCodeReader.html#a4dd9dd6d8fbbac67514b0c13872ce33a) [<sub>Python</sub>](../../../doxygen_python/classeVision_1_1EQRCodeReader.html#a765176298cbb81da12c634b69dd822f5) to `true` to get the previous behavior.
