nareshmlx/opencv-pr huggingface dataset:
**File:** modules/imgproc/test/test_drawing.cpp
**Change Type:** modified
**Context:** PR #23931: Fixed possible out-of-bound access in circles drawing

**Code Changes:**
```diff
@@ -913,4 +913,12 @@ INSTANTIATE_TEST_CASE_P(
     )
 );
 
+TEST(Drawing, circle_overflow)
+{
+    applyTestTag(CV_TEST_TAG_VERYLONG);
+    cv::Mat1b matrix = cv::Mat1b::zeros(600, 600);
+    cv::Scalar kBlue = cv::Scalar(0, 0, 255);
+    cv::circle(matrix, cv::Point(275, -2147483318), 2147483647, kBlue, 1, 8, 0);
```

Review comment:
Enabled test with `CV_TEST_TAG_VERYLONG` option.
**File:** modules/imgcodecs/src/grfmt_avif.cpp
**Change Type:** modified
**Context:** PR #23943: Fix checkSignature not thread safe for AVIF.
**Review Line:** 156

**Code Changes:**
```diff
+  avifDecoderSetIOMemory(decoder,
                          reinterpret_cast<const uint8_t *>(signature.c_str()),
                          signature.size());
-  decoder_->io->sizeHint = 1e9;
-  const avifResult status = avifDecoderParse(decoder_);
+  decoder->io->sizeHint = 1e9;
+  const avifResult status = avifDecoderParse(decoder);
+  avifDecoderDestroy(decoder);
   return (status == AVIF_RESULT_OK || status == AVIF_RESULT_TRUNCATED_DATA);
 }
 
```

Review comment:
it's ~1gb. It's too large for signature check. Could we limit it to signature size or something small like 1k?
**File:** modules/imgcodecs/src/grfmt_avif.cpp
**Change Type:** modified
**Context:** PR #23943: Fix checkSignature not thread safe for AVIF.
**Review Line:** 156

**Code Changes:**
```diff
+  avifDecoderSetIOMemory(decoder,
                          reinterpret_cast<const uint8_t *>(signature.c_str()),
                          signature.size());
-  decoder_->io->sizeHint = 1e9;
-  const avifResult status = avifDecoderParse(decoder_);
+  decoder->io->sizeHint = 1e9;
+  const avifResult status = avifDecoderParse(decoder);
+  avifDecoderDestroy(decoder);
   return (status == AVIF_RESULT_OK || status == AVIF_RESULT_TRUNCATED_DATA);
 }
 
```

Review comment:
The sizeHint is just part of the internal logic. AVIF is a format that does not have a signature, and you could have valid AVIF's that would require to parse a lot before being sure. Still, with 500 bytes, as defined at https://github.com/opencv/opencv/blob/fdc0c12b7fff00e1b41f75e11401073eee23b7e7/modules/imgcodecs/src/grfmt_avif.cpp#L136 , you should be able to detect most AVIFs as built with common tools.
**File:** modules/imgcodecs/src/grfmt_avif.cpp
**Change Type:** modified
**Context:** PR #23943: Fix checkSignature not thread safe for AVIF.
**Review Line:** 156

**Code Changes:**
```diff
+  avifDecoderSetIOMemory(decoder,
                          reinterpret_cast<const uint8_t *>(signature.c_str()),
                          signature.size());
-  decoder_->io->sizeHint = 1e9;
-  const avifResult status = avifDecoderParse(decoder_);
+  decoder->io->sizeHint = 1e9;
+  const avifResult status = avifDecoderParse(decoder);
+  avifDecoderDestroy(decoder);
   return (status == AVIF_RESULT_OK || status == AVIF_RESULT_TRUNCATED_DATA);
 }
 
```

Review comment:
Ok, let's reduce hint then, or may be do not use it.
**File:** modules/imgcodecs/src/grfmt_avif.cpp
**Change Type:** modified
**Context:** PR #23943: Fix checkSignature not thread safe for AVIF.
**Review Line:** 156

**Code Changes:**
```diff
+  avifDecoderSetIOMemory(decoder,
                          reinterpret_cast<const uint8_t *>(signature.c_str()),
                          signature.size());
-  decoder_->io->sizeHint = 1e9;
-  const avifResult status = avifDecoderParse(decoder_);
+  decoder->io->sizeHint = 1e9;
+  const avifResult status = avifDecoderParse(decoder);
+  avifDecoderDestroy(decoder);
   return (status == AVIF_RESULT_OK || status == AVIF_RESULT_TRUNCATED_DATA);
 }
 
```

Review comment:
We can set it to 0 and less checks are done: https://github.com/AOMediaCodec/libavif/blob/d70b3baa791ba5b010b931e3970aabba299a7e36/include/avif/avif.h#L780 We actually should do that as otherwise we need to try reading the whole file.
**File:** modules/imgcodecs/src/grfmt_avif.cpp
**Change Type:** modified
**Context:** PR #23943: Fix checkSignature not thread safe for AVIF.
**Review Line:** 156

**Code Changes:**
```diff
+  avifDecoderSetIOMemory(decoder,
                          reinterpret_cast<const uint8_t *>(signature.c_str()),
                          signature.size());
-  decoder_->io->sizeHint = 1e9;
-  const avifResult status = avifDecoderParse(decoder_);
+  decoder->io->sizeHint = 1e9;
+  const avifResult status = avifDecoderParse(decoder);
+  avifDecoderDestroy(decoder);
   return (status == AVIF_RESULT_OK || status == AVIF_RESULT_TRUNCATED_DATA);
 }
 
```

Review comment:
Ok, let's use non-zero hint then as it was before. It affects security and reduce probability of overflow.
**File:** modules/gapi/include/opencv2/gapi/infer/onnx.hpp
**Change Type:** modified
**Context:** PR #24024: G-API: Support OpenVINO Execution Provider for ONNXRT Backend
**Review Line:** 40

**Code Changes:**
```diff
+/**
+ * @brief This structure provides functions
+ * that fill inference options for ONNX OpenVINO Execution Provider.
+ * Please follow https://onnxruntime.ai/docs/execution-providers/OpenVINO-ExecutionProvider.html#summary-of-options
+ */
+struct GAPI_EXPORTS_W_SIMPLE OpenVINO {
+    // NB: Used from python.
+    /// @private -- Exclude this constructor from OpenCV documentation
+    GAPI_WRAP
+    OpenVINO() = default;
+
```

Review comment:
requires doxygen string
**File:** modules/gapi/include/opencv2/gapi/infer/onnx.hpp
**Change Type:** modified
**Context:** PR #24024: G-API: Support OpenVINO Execution Provider for ONNXRT Backend
**Review Line:** 44

**Code Changes:**
```diff
+ */
+struct GAPI_EXPORTS_W_SIMPLE OpenVINO {
+    // NB: Used from python.
+    /// @private -- Exclude this constructor from OpenCV documentation
+    GAPI_WRAP
+    OpenVINO() = default;
+
+    /** @brief Class constructor.
+
+    Constructs OpenVINO parameters based on device information.
+
```

Review comment:
Only needed for python, worth to comment
**File:** modules/gapi/include/opencv2/gapi/infer/onnx.hpp
**Change Type:** modified
**Context:** PR #24024: G-API: Support OpenVINO Execution Provider for ONNXRT Backend
**Review Line:** 67

**Code Changes:**
```diff
+
+    @param type Device type ("CPU_FP32", "GPU_FP16", etc)
+    @return reference to this parameter structure.
+    */
+    GAPI_WRAP
+    OpenVINO& cfgDeviceType(const std::string &type) {
+        device_type = cv::util::make_optional(type);
+        return *this;
+    }
+
+    /** @brief Specifies OpenVINO Execution Provider cache dir.
```

Review comment:
add doxygen strings for all methods
**File:** modules/gapi/src/backends/onnx/gonnxbackend.cpp
**Change Type:** modified
**Context:** PR #24024: G-API: Support OpenVINO Execution Provider for ONNXRT Backend
**Review Line:** 150

**Code Changes:**
```diff
 
+static void appendExecutionProvider(Ort::SessionOptions          *session_options,
+                                    const cv::gapi::onnx::ep::EP &execution_provider) {
+    namespace ep = cv::gapi::onnx::ep;
+    switch (execution_provider.index()) {
+        case ep::EP::index_of<ep::OpenVINO>(): {
+             GAPI_LOG_INFO(NULL, "OpenVINO Execution Provider is selected.");
+             const auto &ovep = cv::util::get<ep::OpenVINO>(execution_provider);
+             OrtOpenVINOProviderOptions options;
+             options.device_id = ovep.device_id.c_str();
+             options.cache_dir = ovep.cache_dir.c_str();
```

Review comment:
maybe some log info which exactly EP is selected would be usefule
**File:** modules/gapi/src/backends/onnx/gonnxbackend.cpp
**Change Type:** modified
**Context:** PR #24024: G-API: Support OpenVINO Execution Provider for ONNXRT Backend

**Code Changes:**
```diff
@@ -143,6 +143,41 @@ class ONNXCompiled {
     void run();
 };
 
+static void appendExecutionProvider(Ort::SessionOptions          *session_options,
+                                    const cv::gapi::onnx::ep::EP &execution_provider) {
+    namespace ep = cv::gapi::onnx::ep;
+    switch (execution_provider.index()) {
+        case ep::EP::index_of<ep::OpenVINO>(): {
+             GAPI_LOG_INFO(NULL, "OpenVINO Execution Provider is selected.");
```

Review comment:
This thing might throw, make sense to wrap it and show the understandable error message...
**File:** modules/gapi/src/backends/onnx/gonnxbackend.cpp
**Change Type:** modified
**Context:** PR #24024: G-API: Support OpenVINO Execution Provider for ONNXRT Backend
**Review Line:** 159

**Code Changes:**
```diff
+             options.device_id = ovep.device_id.c_str();
+             options.cache_dir = ovep.cache_dir.c_str();
+             options.enable_opencl_throttling = ovep.enable_opencl_throttling;
+             options.enable_dynamic_shapes = ovep.enable_dynamic_shapes;
+             // NB: If are not specified, will be taken from onnxruntime build.
+             if (ovep.device_type) {
+                options.device_type = ovep.device_type->c_str();
+             }
+             if (ovep.num_of_threads) {
+                options.num_of_threads = *ovep.num_of_threads;
+             }
```

Review comment:
Put some explanation why some of the parameters is `optional`
**File:** modules/gapi/src/backends/onnx/gonnxbackend.cpp
**Change Type:** modified
**Context:** PR #24024: G-API: Support OpenVINO Execution Provider for ONNXRT Backend
**Review Line:** 169

**Code Changes:**
```diff
+             }
+             try {
+                session_options->AppendExecutionProvider_OpenVINO(options);
+             } catch (const std::exception &e) {
+                 std::stringstream ss;
+                 ss << "ONNX Backend: Failed to enable OpenVINO Execution Provider: "
+                    << e.what() << "\nMake sure that onnxruntime has"
+                                   " been compiled with OpenVINO support.";
+                 cv::util::throw_error(std::runtime_error(ss.str()));
+             }
+             break;
```

Review comment:
Usually throw when `onnxruntime_providers_openvino` can't be found.
**File:** modules/gapi/src/backends/onnx/gonnxbackend.cpp
**Change Type:** modified
**Context:** PR #24024: G-API: Support OpenVINO Execution Provider for ONNXRT Backend
**Review Line:** 146

**Code Changes:**
```diff
@@ -143,6 +143,41 @@ class ONNXCompiled {
     void run();
 };
 
+static void appendExecutionProvider(Ort::SessionOptions          *session_options,
+                                    const cv::gapi::onnx::ep::EP &execution_provider) {
+    namespace ep = cv::gapi::onnx::ep;
+    switch (execution_provider.index()) {
+        case ep::EP::index_of<ep::OpenVINO>(): {
+             GAPI_LOG_INFO(NULL, "OpenVINO Execution Provider is selected.");
```

Review comment:
y append, not just add?
**File:** modules/gapi/src/backends/onnx/gonnxbackend.cpp
**Change Type:** modified
**Context:** PR #24024: G-API: Support OpenVINO Execution Provider for ONNXRT Backend
**Review Line:** 151

**Code Changes:**
```diff
+static void appendExecutionProvider(Ort::SessionOptions          *session_options,
+                                    const cv::gapi::onnx::ep::EP &execution_provider) {
+    namespace ep = cv::gapi::onnx::ep;
+    switch (execution_provider.index()) {
+        case ep::EP::index_of<ep::OpenVINO>(): {
+             GAPI_LOG_INFO(NULL, "OpenVINO Execution Provider is selected.");
+             const auto &ovep = cv::util::get<ep::OpenVINO>(execution_provider);
+             OrtOpenVINOProviderOptions options;
+             options.device_id = ovep.device_id.c_str();
+             options.cache_dir = ovep.cache_dir.c_str();
+             options.enable_opencl_throttling = ovep.enable_opencl_throttling;
```

Review comment:
Maybe it makes sense to display for which network (if it is not mentioned in the log earlier).
**File:** modules/gapi/src/backends/onnx/gonnxbackend.cpp
**Change Type:** modified
**Context:** PR #24024: G-API: Support OpenVINO Execution Provider for ONNXRT Backend
**Review Line:** 177

**Code Changes:**
```diff
+                 cv::util::throw_error(std::runtime_error(ss.str()));
+             }
+             break;
+        }
+        default:
+            break;
+    }
+}
+
 } // namespace onnx
 } // namespace gimpl
```

Review comment:
Any message for this case?
**File:** modules/gapi/src/backends/onnx/gonnxbackend.cpp
**Change Type:** modified
**Context:** PR #24024: G-API: Support OpenVINO Execution Provider for ONNXRT Backend
**Review Line:** 146

**Code Changes:**
```diff
@@ -143,6 +143,41 @@ class ONNXCompiled {
     void run();
 };
 
+static void appendExecutionProvider(Ort::SessionOptions          *session_options,
+                                    const cv::gapi::onnx::ep::EP &execution_provider) {
+    namespace ep = cv::gapi::onnx::ep;
+    switch (execution_provider.index()) {
+        case ep::EP::index_of<ep::OpenVINO>(): {
+             GAPI_LOG_INFO(NULL, "OpenVINO Execution Provider is selected.");
```

Review comment:
hmm, you actually make a good point, what if it's possible to use multiple execution providers at the same time... In that case I'd probably need to hold the list of them.
**File:** modules/gapi/src/backends/onnx/gonnxbackend.cpp
**Change Type:** modified
**Context:** PR #24024: G-API: Support OpenVINO Execution Provider for ONNXRT Backend
**Review Line:** 151

**Code Changes:**
```diff
+static void appendExecutionProvider(Ort::SessionOptions          *session_options,
+                                    const cv::gapi::onnx::ep::EP &execution_provider) {
+    namespace ep = cv::gapi::onnx::ep;
+    switch (execution_provider.index()) {
+        case ep::EP::index_of<ep::OpenVINO>(): {
+             GAPI_LOG_INFO(NULL, "OpenVINO Execution Provider is selected.");
+             const auto &ovep = cv::util::get<ep::OpenVINO>(execution_provider);
+             OrtOpenVINOProviderOptions options;
+             options.device_id = ovep.device_id.c_str();
+             options.cache_dir = ovep.cache_dir.c_str();
+             options.enable_opencl_throttling = ovep.enable_opencl_throttling;
```

Review comment:
As an option, yes
**File:** modules/gapi/src/backends/onnx/gonnxbackend.cpp
**Change Type:** modified
**Context:** PR #24024: G-API: Support OpenVINO Execution Provider for ONNXRT Backend
**Review Line:** 177

**Code Changes:**
```diff
+                 cv::util::throw_error(std::runtime_error(ss.str()));
+             }
+             break;
+        }
+        default:
+            break;
+    }
+}
+
 } // namespace onnx
 } // namespace gimpl
```

Review comment:
I think some sort of log would be useful
**File:** modules/gapi/src/backends/onnx/gonnxbackend.cpp
**Change Type:** modified
**Context:** PR #24024: G-API: Support OpenVINO Execution Provider for ONNXRT Backend
**Review Line:** 146

**Code Changes:**
```diff
@@ -143,6 +143,41 @@ class ONNXCompiled {
     void run();
 };
 
+static void appendExecutionProvider(Ort::SessionOptions          *session_options,
+                                    const cv::gapi::onnx::ep::EP &execution_provider) {
+    namespace ep = cv::gapi::onnx::ep;
+    switch (execution_provider.index()) {
+        case ep::EP::index_of<ep::OpenVINO>(): {
+             GAPI_LOG_INFO(NULL, "OpenVINO Execution Provider is selected.");
```

Review comment:
Looks so https://onnxruntime.ai/docs/execution-providers/#use-execution-providers
**File:** modules/dnn/src/layers/max_unpooling_layer.cpp
**Change Type:** modified
**Context:** PR #23999: Use OpenCV logging instead of std::cerr
**Review Line:** 123

**Code Changes:**
```diff
@@ -14,6 +14,7 @@ Implementation of Batch Normalization layer.
 #include "../op_cuda.hpp"
 #include "../op_halide.hpp"
 #include <opencv2/dnn/shape_utils.hpp>
+#include <opencv2/core/utils/logger.hpp>
 
 #ifdef HAVE_CUDA
 #include "../cuda4dnn/primitives/max_unpooling.hpp"
@@ -110,17 +111,12 @@ class MaxUnpoolLayerImpl CV_FINAL : public MaxUnpoolLayer
                     int index = idxptr[i_wh];
                     if (!(0 <= index && index < outPlaneTotal))
                     {
-                        std::cerr
-                            << "i_n=" << i_n << std::endl
-                            << "i_c=" << i_c << std::endl
```

Review comment:
This one is useful from time to time. So if you could find a way for multiline `CV_LOG` that would be nice.
**File:** modules/dnn/src/layers/max_unpooling_layer.cpp
**Change Type:** modified
**Context:** PR #23999: Use OpenCV logging instead of std::cerr

**Code Changes:**
```diff
@@ -14,6 +14,7 @@ Implementation of Batch Normalization layer.
 #include "../op_cuda.hpp"
 #include "../op_halide.hpp"
 #include <opencv2/dnn/shape_utils.hpp>
+#include <opencv2/core/utils/logger.hpp>
 
 #ifdef HAVE_CUDA
 #include "../cuda4dnn/primitives/max_unpooling.hpp"
@@ -110,17 +111,12 @@ class MaxUnpoolLayerImpl CV_FINAL : public MaxUnpoolLayer
                     int index = idxptr[i_wh];
```

Review comment:
Debug logger messages are completely turned off in release builds by default (in compile time - no way to enable them in runtime). It is detail message for the error below.
**File:** modules/dnn/src/layers/max_unpooling_layer.cpp
**Change Type:** modified
**Context:** PR #23999: Use OpenCV logging instead of std::cerr

**Code Changes:**
```diff
@@ -14,6 +14,7 @@ Implementation of Batch Normalization layer.
 #include "../op_cuda.hpp"
 #include "../op_halide.hpp"
 #include <opencv2/dnn/shape_utils.hpp>
+#include <opencv2/core/utils/logger.hpp>
 
 #ifdef HAVE_CUDA
 #include "../cuda4dnn/primitives/max_unpooling.hpp"
@@ -110,17 +111,12 @@ class MaxUnpoolLayerImpl CV_FINAL : public MaxUnpoolLayer
                     int index = idxptr[i_wh];
```

Review comment:
You are right! Replaced with CV_LOG_ERROR.
**File:** modules/python/src2/typing_stubs_generation/generation.py
**Change Type:** modified
**Context:** PR #24023: Python typing magic constants
**Review Line:** 322

**Code Changes:**
```diff
     export_name = extra_export_prefix + constant_node.export_name
     write_constant_to_stream(export_name)
     if generate_uppercase_version:
+        # Handle Python "magic" constants like __version__
+        if re.match(r"^__.*__$", export_name) is not None:
+            return export_name,
+
         uppercase_name = re.sub(r"([a-z])([A-Z])", r"\1_\2", export_name).upper()
         if export_name != uppercase_name:
             write_constant_to_stream(uppercase_name)
```

Review comment:
`,` is redundant
**File:** modules/python/src2/typing_stubs_generation/generation.py
**Change Type:** modified
**Context:** PR #24023: Python typing magic constants
**Review Line:** 322

**Code Changes:**
```diff
     export_name = extra_export_prefix + constant_node.export_name
     write_constant_to_stream(export_name)
     if generate_uppercase_version:
+        # Handle Python "magic" constants like __version__
+        if re.match(r"^__.*__$", export_name) is not None:
+            return export_name,
+
         uppercase_name = re.sub(r"([a-z])([A-Z])", r"\1_\2", export_name).upper()
         if export_name != uppercase_name:
             write_constant_to_stream(uppercase_name)
```

Review comment:
Removing trailing `,` violates return type `Tuple[str, ...]`, leading to an extra branch when return value is used: ```python generated_constants_entries.extend( _generate_constant_stub(entry, output_stream, indent, entries_extra_prefix) ) ```
**File:** samples/_winpack_run_python_sample.cmd
**Change Type:** modified
**Context:** PR #23988: Drop Python2 support
**Review Line:** 75

**Code Changes:**
```diff
   GOTO :PYTHON_FOUND
 )
-IF exist C:\Python27\python.exe (
-  SET PYTHON=C:\Python27\python.exe
+IF exist C:\Python36\python.exe (
+  SET PYTHON=C:\Python36\python.exe
   GOTO :PYTHON_FOUND
 )
 
```

Review comment:
Looks like this is dead code (not called at all): - see line 42 - these lines should be dropped in 3.4/4.x (and they will be removed from 5.x after regular merge)
**File:** modules/highgui/src/window_cocoa.mm
**Change Type:** modified
**Context:** PR #23394: add scrollWheel to Cocoa
**Review Line:** 902

**Code Changes:**
```diff
     mp.y *= (imageSize.height / std::max(viewSize.height, 1.));
     mp.x *= (imageSize.width / std::max(viewSize.width, 1.));
 
-    if( mp.x >= 0 && mp.y >= 0 && mp.x < imageSize.width && mp.y < imageSize.height )
-        mouseCallback(type, mp.x, mp.y, flags, mouseParam);
+    if( [event type] == NSEventTypeScrollWheel ) {
+      if( event.hasPreciseScrollingDeltas ) {
+        mp.x = int(event.scrollingDeltaX);
+        mp.y = int(event.scrollingDeltaY);
+      } else {
+        mp.x = int(event.scrollingDeltaX / 0.100006);
```

Review comment:
macOS 10.9 was released 10 yes from now (October 22, 2013), last security update was 7 years ago... Do we actually want to keep such compatibility?
**File:** modules/highgui/src/window_cocoa.mm
**Change Type:** modified
**Context:** PR #23394: add scrollWheel to Cocoa
**Review Line:** 902

**Code Changes:**
```diff
     mp.y *= (imageSize.height / std::max(viewSize.height, 1.));
     mp.x *= (imageSize.width / std::max(viewSize.width, 1.));
 
-    if( mp.x >= 0 && mp.y >= 0 && mp.x < imageSize.width && mp.y < imageSize.height )
-        mouseCallback(type, mp.x, mp.y, flags, mouseParam);
+    if( [event type] == NSEventTypeScrollWheel ) {
+      if( event.hasPreciseScrollingDeltas ) {
+        mp.x = int(event.scrollingDeltaX);
+        mp.y = int(event.scrollingDeltaY);
+      } else {
+        mp.x = int(event.scrollingDeltaX / 0.100006);
```

Review comment:
OpenCV-Python builds use osx 10.16. It's minimal version provided by Github Actions in cloud.
**File:** modules/highgui/src/window_cocoa.mm
**Change Type:** modified
**Context:** PR #23394: add scrollWheel to Cocoa
**Review Line:** 902

**Code Changes:**
```diff
     mp.y *= (imageSize.height / std::max(viewSize.height, 1.));
     mp.x *= (imageSize.width / std::max(viewSize.width, 1.));
 
-    if( mp.x >= 0 && mp.y >= 0 && mp.x < imageSize.width && mp.y < imageSize.height )
-        mouseCallback(type, mp.x, mp.y, flags, mouseParam);
+    if( [event type] == NSEventTypeScrollWheel ) {
+      if( event.hasPreciseScrollingDeltas ) {
+        mp.x = int(event.scrollingDeltaX);
+        mp.y = int(event.scrollingDeltaY);
+      } else {
+        mp.x = int(event.scrollingDeltaX / 0.100006);
```

Review comment:
I suppose in conda-forge it can be fixed increasing macOS SDK version to 10.12 https://github.com/conda-forge/opencv-feedstock/pull/371
**File:** doc/tutorials/introduction/env_reference/env_reference.markdown
**Change Type:** added
**Context:** PR #23968: doc: added environment vars reference - Collected most environment variables used to a single document.
**Review Line:** 148

**Code Changes:**
```diff
+
+### OpenCL
+
+**Note:** OpenCL device specification format is `<Platform>:<CPU|GPU|ACCELERATOR|nothing=GPU/CPU>:<deviceName>`, e.g. `AMD:GPU:`
+
+| name | type | default | description |
+|------|------|---------|-------------|
+| OPENCV_OPENCL_RUNTIME | filepath or `disabled` | | path to OpenCL runtime library (e.g. `OpenCL.dll`, `libOpenCL.so`) |
+| ⭐ OPENCV_OPENCL_DEVICE | string or `disabled` | | choose specific OpenCL device. See specification format in the note above. See more details in the Links section. |
+| OPENCV_OPENCL_RAISE_ERROR | bool | false | raise exception if something fails during OpenCL kernel preparation and execution (Release builds only) |
+| OPENCV_OPENCL_ABORT_ON_BUILD_ERROR | bool | false | abort if OpenCL kernel compilation failed |
```

Review comment:
Table formatting is broken: https://pullrequest.opencv.org/buildbot/export/pr/23968/docs/d6/dea/tutorial_env_reference.html