nareshmlx/opencv-pr huggingface dataset:
**File:** modules/dnn/src/onnx/onnx_importer.cpp
**Change Type:** modified
**Context:** PR #22531: Parsing quantized nodes does not rely on names

**Code Changes:**
```diff
@@ -52,6 +52,13 @@ extern bool DNN_DIAGNOSTICS_RUN;
 
 class ONNXLayerHandler;
 
+template <typename T>
+static T getScaleFromMat(Mat m)
+{
+    CV_Assert(m.total() == 1);
+    return m.at<T>(0);
+}
```

Review comment:
> So if we insert unsupported at the moment layer(Gather, for example) after integer node, it will set the depth to CV_8S and corrupt the memory at runtime? (reading int8 as float in this case). Yes, if we do this, it will corrupt. But this should not happen, Gather-like layer should output the same format as the input. So, if a Gather layer gets int8 input, it should be `GatherInt8`. And if the type of GatherInt8 layer is `Gather`, we can add the `Gather` to the list.
**File:** modules/dnn/src/onnx/onnx_importer.cpp
**Change Type:** modified
**Context:** PR #22531: Parsing quantized nodes does not rely on names

**Code Changes:**
```diff
@@ -52,6 +52,13 @@ extern bool DNN_DIAGNOSTICS_RUN;
 
 class ONNXLayerHandler;
 
+template <typename T>
+static T getScaleFromMat(Mat m)
+{
+    CV_Assert(m.total() == 1);
+    return m.at<T>(0);
+}
```

Review comment:
> What if we have a set of ONNX layers instead? e.g. in this set we would put QuantizeLinear, DequantizeLinear, QLinearConv, Transpose, Reshape, MaxPool, etc. And check that if we have integer inputs, the current layer should be in this set, otherwise we throw an error, what do you think? I also considered a list of ONNX operators. Functionally, there is no difference between the two lists in essence, one is the original version of ONNX and the other is the mapped version of OpenCV. Considering the future maintainability, indeed using the original version of ONNX operator names is better.
**File:** modules/dnn/src/onnx/onnx_importer.cpp
**Change Type:** modified
**Context:** PR #22531: Parsing quantized nodes does not rely on names
**Review Line:** 3707

**Code Changes:**
```diff
     dispatch["AveragePool"] = &ONNXImporter::parseAveragePool;
     dispatch["GlobalAveragePool"] = dispatch["GlobalMaxPool"] = &ONNXImporter::parseGlobalPool;
-    dispatch["ReduceMax"] = dispatch["ReduceMin"] = dispatch["ReduceMean"] = dispatch["ReduceSum"] = dispatch["ReduceMax"] =
-            dispatch["ReduceMin"] = dispatch["ReduceSumSquare"] = dispatch["ReduceProd"] = dispatch["ReduceL1"] =
+    dispatch["ReduceMax"] = dispatch["ReduceMin"] = dispatch["ReduceMean"] = dispatch["ReduceSum"] =
+            dispatch["ReduceSumSquare"] = dispatch["ReduceProd"] = dispatch["ReduceL1"] =
             dispatch["ReduceL2"] = dispatch["ReduceLogSum"] = dispatch["ReduceLogSumExp"] = &ONNXImporter::parseReduce;
     dispatch["Slice"] = &ONNXImporter::parseSlice;
     dispatch["Split"] = &ONNXImporter::parseSplit;
```

Review comment:
What is the reason behind this change?
**File:** modules/dnn/src/onnx/onnx_importer.cpp
**Change Type:** modified
**Context:** PR #22531: Parsing quantized nodes does not rely on names
**Review Line:** 3707

**Code Changes:**
```diff
     dispatch["AveragePool"] = &ONNXImporter::parseAveragePool;
     dispatch["GlobalAveragePool"] = dispatch["GlobalMaxPool"] = &ONNXImporter::parseGlobalPool;
-    dispatch["ReduceMax"] = dispatch["ReduceMin"] = dispatch["ReduceMean"] = dispatch["ReduceSum"] = dispatch["ReduceMax"] =
-            dispatch["ReduceMin"] = dispatch["ReduceSumSquare"] = dispatch["ReduceProd"] = dispatch["ReduceL1"] =
+    dispatch["ReduceMax"] = dispatch["ReduceMin"] = dispatch["ReduceMean"] = dispatch["ReduceSum"] =
+            dispatch["ReduceSumSquare"] = dispatch["ReduceProd"] = dispatch["ReduceL1"] =
             dispatch["ReduceL2"] = dispatch["ReduceLogSum"] = dispatch["ReduceLogSumExp"] = &ONNXImporter::parseReduce;
     dispatch["Slice"] = &ONNXImporter::parseSlice;
     dispatch["Split"] = &ONNXImporter::parseSplit;
```

Review comment:
Oh, right, my bad.
**File:** doc/tutorials/dnn/dnn_openvino/dnn_openvino.markdown
**Change Type:** added
**Context:** PR #22552: OpenCV for OpenVINO documentation

**Code Changes:**
```diff
@@ -0,0 +1,28 @@
+OpenCV usage with OpenVINO {#tutorial_dnn_openvino}
+=====================
+
+@prev_tutorial{tutorial_dnn_halide_scheduling}
+@next_tutorial{tutorial_dnn_android}
+
+|    |    |
+| -: | :- |
+| Original author | Aleksandr Voron |
```

Review comment:
> G-API module G-API module with enabled OpenVINO support
**File:** doc/tutorials/dnn/dnn_openvino/dnn_openvino.markdown
**Change Type:** added
**Context:** PR #22552: OpenCV for OpenVINO documentation

**Code Changes:**
```diff
@@ -0,0 +1,28 @@
+OpenCV usage with OpenVINO {#tutorial_dnn_openvino}
+=====================
+
+@prev_tutorial{tutorial_dnn_halide_scheduling}
+@next_tutorial{tutorial_dnn_android}
+
+|    |    |
+| -: | :- |
+| Original author | Aleksandr Voron |
```

Review comment:
If you need build with instruction set optimizations for modern hardware (default builds need to cover wide range of hardware)
**File:** doc/tutorials/dnn/dnn_openvino/dnn_openvino.markdown
**Change Type:** added
**Context:** PR #22552: OpenCV for OpenVINO documentation

**Code Changes:**
```diff
@@ -0,0 +1,28 @@
+OpenCV usage with OpenVINO {#tutorial_dnn_openvino}
+=====================
+
+@prev_tutorial{tutorial_dnn_halide_scheduling}
+@next_tutorial{tutorial_dnn_android}
+
+|    |    |
+| -: | :- |
+| Original author | Aleksandr Voron |
```

Review comment:
> computational inference?
**File:** doc/tutorials/dnn/dnn_openvino/dnn_openvino.markdown
**Change Type:** added
**Context:** PR #22552: OpenCV for OpenVINO documentation

**Code Changes:**
```diff
@@ -0,0 +1,28 @@
+OpenCV usage with OpenVINO {#tutorial_dnn_openvino}
+=====================
+
+@prev_tutorial{tutorial_dnn_halide_scheduling}
+@next_tutorial{tutorial_dnn_android}
+
+|    |    |
+| -: | :- |
+| Original author | Aleksandr Voron |
```

Review comment:
> OpenCV does not Generic OpenCV package may not (for all bullets)
**File:** doc/tutorials/dnn/dnn_openvino/dnn_openvino.markdown
**Change Type:** added
**Context:** PR #22552: OpenCV for OpenVINO documentation
**Review Line:** 11

**Code Changes:**
```diff
+
+|    |    |
+| -: | :- |
+| Original author | Aleksandr Voron |
+| Compatibility | OpenCV == 4.x |
+
+This tutorial provides OpenCV installation guidelines how to use OpenCV with OpenVINO.
+
+Since 2021.1.1 release OpenVINO does not provide pre-built OpenCV.
+The change does not affect you if you are using OpenVINO runtime directly or OpenVINO samples: it does not have a strong dependency to OpenCV.
+However, if you are using Open Model Zoo demos or OpenVINO runtime as OpenCV DNN backend you need to get the OpenCV build.
```

Review comment:
Tutorials are usually used for learning. Or as a getting started guides. If possible it makes sense to clarify which part of OpenCV is learned by this tutorial.
**File:** doc/tutorials/dnn/dnn_openvino/dnn_openvino.markdown
**Change Type:** added
**Context:** PR #22552: OpenCV for OpenVINO documentation

**Code Changes:**
```diff
@@ -0,0 +1,28 @@
+OpenCV usage with OpenVINO {#tutorial_dnn_openvino}
+=====================
+
+@prev_tutorial{tutorial_dnn_halide_scheduling}
+@next_tutorial{tutorial_dnn_android}
+
+|    |    |
+| -: | :- |
+| Original author | Aleksandr Voron |
```

Review comment:
Instead of adding it to all bullets I've changed the 20th line: `Generic pre-built OpenCV package may have several limitations` I believe it addresses your comment
**File:** doc/tutorials/dnn/dnn_openvino/dnn_openvino.markdown
**Change Type:** added
**Context:** PR #22552: OpenCV for OpenVINO documentation
**Review Line:** 11

**Code Changes:**
```diff
+
+|    |    |
+| -: | :- |
+| Original author | Aleksandr Voron |
+| Compatibility | OpenCV == 4.x |
+
+This tutorial provides OpenCV installation guidelines how to use OpenCV with OpenVINO.
+
+Since 2021.1.1 release OpenVINO does not provide pre-built OpenCV.
+The change does not affect you if you are using OpenVINO runtime directly or OpenVINO samples: it does not have a strong dependency to OpenCV.
+However, if you are using Open Model Zoo demos or OpenVINO runtime as OpenCV DNN backend you need to get the OpenCV build.
```

Review comment:
added the 12th line to explain it: `This tutorial provides OpenCV installation guidelines how to use OpenCV with OpenVINO.`
**File:** modules/gapi/src/backends/ie/giebackend.cpp
**Change Type:** modified
**Context:** PR #22588: G-API: Add synchronous execution for IE backend
**Review Line:** 894

**Code Changes:**
```diff
+        task.read_output_data(m_request, IE::StatusCode::OK);
+    } catch (...) {
+        m_notify();
+        throw;
     }
+    // NB: Notify pool that executor has finished.
+    m_notify();
 }
 
-void cv::gimpl::ie::RequestPool::execute(cv::gimpl::ie::RequestPool::Task&& t) {
-    size_t id = 0u;
```

Review comment:
It's not a pool anymore, isn't it?
**File:** modules/gapi/src/backends/ie/giebackend.cpp
**Change Type:** modified
**Context:** PR #22588: G-API: Add synchronous execution for IE backend
**Review Line:** 930

**Code Changes:**
```diff
+void AsyncInferExecutor::callback(IInferExecutor::Task task,
+                                  IE::InferRequest     request,
+                                  IE::StatusCode       code) noexcept {
+    task.read_output_data(request, code);
     request.SetCompletionCallback([](){});
+    // NB: Notify pool that executor has finished.
+    m_notify();
+}
+
+class cv::gimpl::ie::RequestPool {
+public:
```

Review comment:
It's not a pool anymore, isn't it?
**File:** modules/gapi/src/backends/ie/giebackend.cpp
**Change Type:** modified
**Context:** PR #22588: G-API: Add synchronous execution for IE backend
**Review Line:** 894

**Code Changes:**
```diff
+        task.read_output_data(m_request, IE::StatusCode::OK);
+    } catch (...) {
+        m_notify();
+        throw;
     }
+    // NB: Notify pool that executor has finished.
+    m_notify();
 }
 
-void cv::gimpl::ie::RequestPool::execute(cv::gimpl::ie::RequestPool::Task&& t) {
-    size_t id = 0u;
```

Review comment:
`RequestPool` still exists, and here `IInferExecutor` notifies pool that execution is over. Probably comment is confusing....
**File:** modules/gapi/src/backends/ie/giebackend.cpp
**Change Type:** modified
**Context:** PR #22588: G-API: Add synchronous execution for IE backend

**Code Changes:**
```diff
@@ -392,6 +392,12 @@ struct IEUnit {
                                     params.vpl_preproc_ctx.value());
             GAPI_LOG_INFO(nullptr, "VPP preproc created successfuly");
         }
+
+        if (params.mode == cv::gapi::ie::InferMode::Sync &&
+            params.nireq != 1u) {
+            throw std::logic_error(
+                    "Failed: cv::gapi::ie::InferMode::Sync works only with nireq equal to 1.");
+        }
```

Review comment:
What if we have different number of nireq each time - is it possible? Voting for the first option
**File:** modules/gapi/src/backends/ie/giebackend.cpp
**Change Type:** modified
**Context:** PR #22588: G-API: Add synchronous execution for IE backend

**Code Changes:**
```diff
@@ -392,6 +392,12 @@ struct IEUnit {
                                     params.vpl_preproc_ctx.value());
             GAPI_LOG_INFO(nullptr, "VPP preproc created successfuly");
         }
+
+        if (params.mode == cv::gapi::ie::InferMode::Sync &&
+            params.nireq != 1u) {
+            throw std::logic_error(
+                    "Failed: cv::gapi::ie::InferMode::Sync works only with nireq equal to 1.");
+        }
```

Review comment:
Updated, discussed locally
**File:** modules/gapi/src/backends/ie/giebackend.cpp
**Change Type:** modified
**Context:** PR #22588: G-API: Add synchronous execution for IE backend
**Review Line:** 862

**Code Changes:**
```diff
     // NB: The task is represented by:
-    // RunF      - function which is set blobs and run async inference.
-    // CallbackF - function which is obtain output blobs and post it to output.
+    // SetInputDataF - function which set input data.
+    // ReadOutputDataF - function which read output data.
     struct Task {
-        RunF run;
-        CallbackF callback;
+        SetInputDataF   set_input_data;
+        ReadOutputDataF read_output_data;
     };
```

Review comment:
If there's no body (the execution callback) in Task, is it still a Task?
**File:** modules/gapi/src/backends/ie/giebackend.cpp
**Change Type:** modified
**Context:** PR #22588: G-API: Add synchronous execution for IE backend
**Review Line:** 862

**Code Changes:**
```diff
     // NB: The task is represented by:
-    // RunF      - function which is set blobs and run async inference.
-    // CallbackF - function which is obtain output blobs and post it to output.
+    // SetInputDataF - function which set input data.
+    // ReadOutputDataF - function which read output data.
     struct Task {
-        RunF run;
-        CallbackF callback;
+        SetInputDataF   set_input_data;
+        ReadOutputDataF read_output_data;
     };
```

Review comment:
Actually the body is `set_input_data` and `read_output_data`. I guess it still be called `Task`
**File:** modules/photo/include/opencv2/photo/cuda.hpp
**Change Type:** modified
**Context:** PR #22562: Add bindings to CUDA photo denoising functions

**Code Changes:**
```diff
@@ -65,11 +65,20 @@ BORDER_REPLICATE , BORDER_CONSTANT , BORDER_REFLECT and BORDER_WRAP are supporte
    fastNlMeansDenoising
  */
 CV_EXPORTS void nonLocalMeans(InputArray src, OutputArray dst,
-                              float h,
-                              int search_window = 21,
-                              int block_size = 7,
-                              int borderMode = BORDER_DEFAULT,
-                              Stream& stream = Stream::Null());
+                            float h,
```

Review comment:
> GpuMat src const reference
**File:** modules/dnn/src/layers/fast_convolution/fast_convolution.cpp
**Change Type:** modified
**Context:** PR #22577: DNN: add enableWinograd API for Net

**Code Changes:**
```diff
@@ -23,7 +23,8 @@ Ptr<FastConv2d> initFastConv2d(
         const std::vector<size_t>& pads_begin,
         const std::vector<size_t>& pads_end,
         InputArray _weightsMat,
-        float* srcBias)
+        float* srcBias,
+        bool useWinograd)
 {
     Ptr<FastConv2d> conv = makePtr<FastConv2d>();
 
```

Review comment:
In the previous version, we set the maximum input size here. Because without this limitation, some tests like([ENet_accuracy](https://github.com/opencv/opencv/blob/4.x/modules/dnn/test/test_torch_importer.cpp#L440-L488)) would fail. With the new feature, we can remove this limitation.
**File:** modules/dnn/src/net_impl.cpp
**Change Type:** modified
**Context:** PR #22577: DNN: add enableWinograd API for Net

**Code Changes:**
```diff
@@ -55,6 +55,7 @@ Net::Impl::Impl()
     preferableBackend = (Backend)getParam_DNN_BACKEND_DEFAULT();
     preferableTarget = DNN_TARGET_CPU;
     hasDynamicShapes = false;
+    useWinograd = true;
 }
 
 
@@ -2038,6 +2039,37 @@ void Net::Impl::getMemoryConsumption(
     }
```

Review comment:
Sequence of `if` switches is anti-pattern. API for layers should be propagated instead. --- In the future we should separate: - "imported" DL network - we could work with parameters. - "execution" DL network - layers are instantiated for specified backend/device and optimization parameters. After that, parameters are locked. Otherwise we would got a mess.
**File:** modules/dnn/include/opencv2/dnn/all_layers.hpp
**Change Type:** modified
**Context:** PR #22577: DNN: add enableWinograd API for Net

**Code Changes:**
```diff
@@ -259,6 +259,7 @@ CV__DNN_INLINE_NS_BEGIN
         bool fusedActivation = false;
         bool fusedAdd = false;
         bool isConv2D = false; // Should be deleted after fastconv branch support Conv1D and Conv3D.
+        bool useWinograd = false; // Flag whether to use Winograd to speed up 3x3 convolution.
     };
 
     class CV_EXPORTS ConvolutionLayerInt8 : public BaseConvolutionLayer
@@ -270,6 +271,7 @@ CV__DNN_INLINE_NS_BEGIN
         // quantization type flag. The perChannel default is true, that means it contains the parameters
```

Review comment:
please rename the flag to `useWinograd`
**File:** modules/dnn/include/opencv2/dnn/dnn.hpp
**Change Type:** modified
**Context:** PR #22577: DNN: add enableWinograd API for Net

**Code Changes:**
```diff
@@ -837,6 +837,12 @@ CV__DNN_INLINE_NS_BEGIN
          */
         CV_WRAP void enableFusion(bool fusion);
 
+        /** @brief Enables or disables the Winograd compute branch. The Winograd compute branch can speed up
+         * 3x3 Convolution at a small loss of accuracy.
+        * @param useWinograd true to enable the Winograd compute branch. The default is true.
+        */
+        CV_WRAP void enableWinograd(bool useWinograd);
+
```

Review comment:
`enableWinograd`
**File:** modules/dnn/src/net.cpp
**Change Type:** modified
**Context:** PR #22577: DNN: add enableWinograd API for Net

**Code Changes:**
```diff
@@ -395,6 +395,13 @@ void Net::enableFusion(bool fusion)
     return impl->enableFusion(fusion);
 }
 
+void Net::enableWinograd(bool useWinograd)
+{
+    CV_TRACE_FUNCTION();
+    CV_Assert(impl);
+    return impl->enableWinograd(useWinograd);
+}
```

Review comment:
`enableWinograd`
**File:** modules/dnn/src/net_impl.cpp
**Change Type:** modified
**Context:** PR #22577: DNN: add enableWinograd API for Net

**Code Changes:**
```diff
@@ -55,6 +55,7 @@ Net::Impl::Impl()
     preferableBackend = (Backend)getParam_DNN_BACKEND_DEFAULT();
     preferableTarget = DNN_TARGET_CPU;
     hasDynamicShapes = false;
+    useWinograd = true;
 }
 
 
@@ -2038,6 +2039,37 @@ void Net::Impl::getMemoryConsumption(
     }
```

Review comment:
I changed the API to `enableWinograd`, and it will only work on the `Convolution` and `ConvolutionInt8` layer. And this issue should go away.
**File:** modules/dnn/src/layers/fast_convolution/fast_convolution.cpp
**Change Type:** modified
**Context:** PR #22577: DNN: add enableWinograd API for Net
**Review Line:** 195

**Code Changes:**
```diff
 #if CV_NEON
-    if (conv->ifWinograd63
-         && inputShape[2] > 12 && inputShape[3] > 12
-         && inputShape[2] < 120 && inputShape[3] < 120
-         )
+    if (conv->useWinograd63 && inputShape[2] > 12 && inputShape[3] > 12)
     {
         if (runWinograd63(input, fusedAddMat, output, conv, ntasks, minval, maxval, activ, ifMinMaxAct))
             return;
```

Review comment:
The condition has been changed. Is it intentional? What are expected performance changes?
**File:** modules/dnn/src/layers/fast_convolution/fast_convolution.cpp
**Change Type:** modified
**Context:** PR #22577: DNN: add enableWinograd API for Net
**Review Line:** 195

**Code Changes:**
```diff
 #if CV_NEON
-    if (conv->ifWinograd63
-         && inputShape[2] > 12 && inputShape[3] > 12
-         && inputShape[2] < 120 && inputShape[3] < 120
-         )
+    if (conv->useWinograd63 && inputShape[2] > 12 && inputShape[3] > 12)
     {
         if (runWinograd63(input, fusedAddMat, output, conv, ntasks, minval, maxval, activ, ifMinMaxAct))
             return;
```

Review comment:
In the previous version, we set the maximum input size here. Because without this limitation, some tests like([ENet_accuracy](https://github.com/opencv/opencv/blob/4.x/modules/dnn/test/test_torch_importer.cpp#L440-L488)) would fail. With the new feature, we can remove this limitation. It doesn't affect the inference speed.
**File:** cmake/OpenCVDetectCUDA.cmake
**Change Type:** modified
**Context:** PR #22880: Prevent cudacodec libs locations being reset when cmake is re-run

**Code Changes:**
```diff
@@ -10,6 +10,10 @@ endif()
 
 #set(OPENCV_CMAKE_CUDA_DEBUG 1)
 
+if(CUDA_TOOLKIT_ROOT_DIR)
+  set(CUDA_TOOLKIT_TARGET_DIR ${CUDA_TOOLKIT_ROOT_DIR})
+endif()
+
 if(((NOT CMAKE_VERSION VERSION_LESS "3.9.0")  # requires https://gitlab.kitware.com/cmake/cmake/merge_requests/663
       OR OPENCV_CUDA_FORCE_EXTERNAL_CMAKE_MODULE)
```

Review comment:
> calls to FindCUDA can reset Should we check for the empty value then?
**File:** modules/3d/misc/python/test/test_volume.py
**Change Type:** added
**Context:** PR #22925: Volume gets Python bindings and examples

**Code Changes:**
```diff
@@ -0,0 +1,123 @@
+import numpy as np
+import cv2 as cv
+
+from tests_common import NewOpenCVTests
+
+class volume_test(NewOpenCVTests):
+    def test_VolumeDefault(self):
+        depthPath = 'cv/rgbd/depth.png'
+        depth = self.get_sample(depthPath, cv.IMREAD_ANYDEPTH).astype(np.float32)
```

Review comment:
use np.eye: https://numpy.org/devdocs/reference/generated/numpy.eye.html
**File:** modules/3d/misc/python/test/test_volume.py
**Change Type:** added
**Context:** PR #22925: Volume gets Python bindings and examples

**Code Changes:**
```diff
@@ -0,0 +1,123 @@
+import numpy as np
+import cv2 as cv
+
+from tests_common import NewOpenCVTests
+
+class volume_test(NewOpenCVTests):
+    def test_VolumeDefault(self):
+        depthPath = 'cv/rgbd/depth.png'
+        depth = self.get_sample(depthPath, cv.IMREAD_ANYDEPTH).astype(np.float32)
```

Review comment:
Is there simple way to check, if volume was modified by the calls to be sure that proper method was called?
**File:** samples/python/volume.py
**Change Type:** added
**Context:** PR #22925: Volume gets Python bindings and examples

**Code Changes:**
```diff
@@ -0,0 +1,140 @@
+import numpy as np
+import cv2 as cv
+import argparse
+
+# Use source data from this site:
+# https://vision.in.tum.de/data/datasets/rgbd-dataset/download
+# For example if you use rgbd_dataset_freiburg1_xyz sequence, your prompt should be:
+# python /path_to_opencv/samples/python/volume.py --source_folder /path_to_datasets/rgbd_dataset_freiburg1_xyz --algo <some algo>
+# so that the folder contains files groundtruth.txt and depth.txt
```

Review comment:
Please do it. The result is not reproducible for now.
**File:** samples/python/volume.py
**Change Type:** added
**Context:** PR #22925: Volume gets Python bindings and examples

**Code Changes:**
```diff
@@ -0,0 +1,140 @@
+import numpy as np
+import cv2 as cv
+import argparse
+
+# Use source data from this site:
+# https://vision.in.tum.de/data/datasets/rgbd-dataset/download
+# For example if you use rgbd_dataset_freiburg1_xyz sequence, your prompt should be:
+# python /path_to_opencv/samples/python/volume.py --source_folder /path_to_datasets/rgbd_dataset_freiburg1_xyz --algo <some algo>
+# so that the folder contains files groundtruth.txt and depth.txt
```

Review comment:
Please add check that images are loaded correctly.
**File:** modules/3d/include/opencv2/3d/odometry_frame.hpp
**Change Type:** modified
**Context:** PR #22925: Volume gets Python bindings and examples

**Code Changes:**
```diff
@@ -29,68 +29,68 @@ enum OdometryFramePyramidType
 /**
  * @brief An object that keeps per-frame data for Odometry algorithms from user-provided images to algorithm-specific precalculated data.
  * When not empty, it contains a depth image, a mask of valid pixels and a set of pyramids generated from that data.
- * An BGR/Gray image and normals are optional.
+ * A BGR/Gray image and normals are optional.
  * OdometryFrame is made to be used together with Odometry class to reuse precalculated data between Rt data calculations.
- * A proper way to do that is to call Odometry::prepareFrames() on prev and next frames and then pass them to Odometry::compute() method.
+ * A correct way to do that is to call Odometry::prepareFrames() on prev and next frames and then pass them to Odometry::compute() method.
  */
```

Review comment:
Please ensure that binding for `size_t` is correctly generated. Please use int for APIs with bindings to prevent issues with Python and Java.