nareshmlx/opencv-pr huggingface dataset:
**File:** samples/android/video-recorder/src/org/opencv/samples/recorder/RecorderActivity.java
**Change Type:** added
**Context:** PR #24592: Android sample for VideoWriter

**Code Changes:**
```diff
@@ -0,0 +1,340 @@
+package org.opencv.samples.recorder;
+
+import org.opencv.android.CameraActivity;
+import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
+import org.opencv.android.OpenCVLoader;
+import org.opencv.android.Utils;
+import org.opencv.core.Mat;
+import org.opencv.core.Size;
+import org.opencv.imgproc.Imgproc;
```

Review comment:
It should be Imgproc.`COLOR_BGR2RGBA`, because bitmap is created as `Bitmap.Config.ARGB_8888`
**File:** platforms/android/build_sdk.py
**Change Type:** modified
**Context:** PR #24592: Android sample for VideoWriter

**Code Changes:**
```diff
@@ -215,7 +215,7 @@ def clean_library_build_dir(self):
         for d in ["CMakeCache.txt", "CMakeFiles/", "bin/", "libs/", "lib/", "package/", "install/samples/"]:
             rm_one(d)
 
-    def build_library(self, abi, do_install):
+    def build_library(self, abi, do_install, no_media_ndk):
         cmd = [self.cmake_path, "-GNinja"]
         cmake_vars = dict(
             CMAKE_TOOLCHAIN_FILE=self.get_toolchain_file(),
@@ -260,6 +260,9 @@ def build_library(self, abi, do_install):
```

Review comment:
Currently `WITH_ANDROID_MEDIANDK` is enabled by default for `ANDROID_NATIVE_API_LEVEL`>20. So we should add `--no-media-ndk` option to be able to disable it.
**File:** samples/android/video-recorder/src/org/opencv/samples/recorder/RecorderActivity.java
**Change Type:** added
**Context:** PR #24592: Android sample for VideoWriter

**Code Changes:**
```diff
@@ -0,0 +1,340 @@
+package org.opencv.samples.recorder;
+
+import org.opencv.android.CameraActivity;
+import org.opencv.android.CameraBridgeViewBase.CvCameraViewFrame;
+import org.opencv.android.OpenCVLoader;
+import org.opencv.android.Utils;
+import org.opencv.core.Mat;
+import org.opencv.core.Size;
+import org.opencv.imgproc.Imgproc;
```

Review comment:
In-place cvtColor is not possible here. IT has to allocate new Mat each time internally.
**File:** 3rdparty/openjpeg/openjp2/ht_dec.c
**Change Type:** modified
**Context:** PR #24205: ht_dec.c: Improve MSVC arm64 popcount performance
**Review Line:** 59

**Code Changes:**
```diff
@@ -55,6 +55,10 @@
 #define OPJ_COMPILER_GNUC
 #endif
 
+#if defined(OPJ_COMPILER_MSVC) && defined(_M_ARM64)
+#include <arm64_neon.h>
+#endif
+
 //************************************************************************/
 /** @brief Displays the error message for disabling the decoding of SPP and
   * MRP passes
```

Review comment:
> 3rdparty We usually don't modify 3rdparty code. Because it complicates maintenance and such changes could be lost after 3rdparty library upgrade. Is where similar patch / commit in the upstream repository of 3rdparty library?
**File:** 3rdparty/openjpeg/openjp2/ht_dec.c
**Change Type:** modified
**Context:** PR #24205: ht_dec.c: Improve MSVC arm64 popcount performance
**Review Line:** 59

**Code Changes:**
```diff
@@ -55,6 +55,10 @@
 #define OPJ_COMPILER_GNUC
 #endif
 
+#if defined(OPJ_COMPILER_MSVC) && defined(_M_ARM64)
+#include <arm64_neon.h>
+#endif
+
 //************************************************************************/
 /** @brief Displays the error message for disabling the decoding of SPP and
   * MRP passes
```

Review comment:
This actually follows onto the fix made in #24054, which simply disabled popcnt on ARM entirely instead of using an ARM-specific intrinsic. I don't know if that fix has been made upstream yet.
**File:** doc/tutorials/introduction/android_binary_package/android_dev_intro.markdown
**Change Type:** modified
**Context:** PR #24653: Android Studio tutorials rewritten

**Code Changes:**
```diff
@@ -2,24 +2,22 @@ Introduction into Android Development {#tutorial_android_dev_intro}
 =====================================
 
 @prev_tutorial{tutorial_clojure_dev_intro}
-@next_tutorial{tutorial_O4A_SDK}
+@next_tutorial{tutorial_dev_with_OCV_on_Android}
 
 |    |    |
 | -: | :- |
-| Original author | Vsevolod Glumov |
```

Review comment:
Answer server is frozen. https://forum.opencv.org should be used instead.
**File:** doc/tutorials/introduction/android_binary_package/android_dev_intro.markdown
**Change Type:** modified
**Context:** PR #24653: Android Studio tutorials rewritten

**Code Changes:**
```diff
@@ -2,24 +2,22 @@ Introduction into Android Development {#tutorial_android_dev_intro}
 =====================================
 
 @prev_tutorial{tutorial_clojure_dev_intro}
-@next_tutorial{tutorial_O4A_SDK}
+@next_tutorial{tutorial_dev_with_OCV_on_Android}
 
 |    |    |
 | -: | :- |
-| Original author | Vsevolod Glumov |
```

Review comment:
I would recommend "Install fresh Android SDK and NDK" without versions. Modern tools should work too.
**File:** doc/tutorials/introduction/android_binary_package/android_dev_intro.markdown
**Change Type:** modified
**Context:** PR #24653: Android Studio tutorials rewritten

**Code Changes:**
```diff
@@ -2,24 +2,22 @@ Introduction into Android Development {#tutorial_android_dev_intro}
 =====================================
 
 @prev_tutorial{tutorial_clojure_dev_intro}
-@next_tutorial{tutorial_O4A_SDK}
+@next_tutorial{tutorial_dev_with_OCV_on_Android}
 
 |    |    |
 | -: | :- |
-| Original author | Vsevolod Glumov |
```

Review comment:
Idea uses Java and provides Java. Need to check if it's enough.
**File:** doc/tutorials/introduction/android_binary_package/android_dev_intro.markdown
**Change Type:** modified
**Context:** PR #24653: Android Studio tutorials rewritten

**Code Changes:**
```diff
@@ -2,24 +2,22 @@ Introduction into Android Development {#tutorial_android_dev_intro}
 =====================================
 
 @prev_tutorial{tutorial_clojure_dev_intro}
-@next_tutorial{tutorial_O4A_SDK}
+@next_tutorial{tutorial_dev_with_OCV_on_Android}
 
 |    |    |
 | -: | :- |
-| Original author | Vsevolod Glumov |
```

Review comment:
Minimum Android version required here.
**File:** doc/tutorials/introduction/android_binary_package/android_dev_intro.markdown
**Change Type:** modified
**Context:** PR #24653: Android Studio tutorials rewritten

**Code Changes:**
```diff
@@ -2,24 +2,22 @@ Introduction into Android Development {#tutorial_android_dev_intro}
 =====================================
 
 @prev_tutorial{tutorial_clojure_dev_intro}
-@next_tutorial{tutorial_O4A_SDK}
+@next_tutorial{tutorial_dev_with_OCV_on_Android}
 
 |    |    |
 | -: | :- |
-| Original author | Vsevolod Glumov |
```

Review comment:
This is the minimal no-fail set of packages for the build, having no installed Java packages leads to a failure Maybe we can specify Java executables from the Android Studio installation but I haven't checked this yet
**File:** modules/dnn/test/test_onnx_importer.cpp
**Change Type:** modified
**Context:** PR #24611: Add test for YoloX Yolo v6 and Yolo v8

**Code Changes:**
```diff
@@ -12,6 +12,15 @@
 #include <numeric>
 namespace opencv_test { namespace {
 
+void yoloPostProcessing(
+    std::vector<Mat>& outs,
+    std::vector<int>& keep_classIds,
+    std::vector<float>& keep_confidences,
+    std::vector<Rect2d>& keep_boxes,
+    float conf_threshold,
```

Review comment:
Not sure if that struct is really required. Maybe let's return all the fields by arguments at `yoloPostProcessing`?
**File:** modules/dnn/test/test_onnx_importer.cpp
**Change Type:** modified
**Context:** PR #24611: Add test for YoloX Yolo v6 and Yolo v8
**Review Line:** 2682

**Code Changes:**
```diff
             double conf;
             Point maxLoc;
             minMaxLoc(scores, 0, &conf, 0, &maxLoc);
-            conf *= obj_conf;
+
+            conf = (test_name != "yolov8") ? conf * obj_conf : conf;
             if (conf < conf_threshold)
                 continue;
 
@@ -2653,6 +2689,7 @@ static void testYOLO(const std::string& weightPath, const std::vector<int>& refC
             double cy = det[1];
```

Review comment:
There is a difference with a sample https://github.com/opencv/opencv/pull/24396. Does it mean that sample should be updated as well?
**File:** modules/dnn/test/test_onnx_importer.cpp
**Change Type:** modified
**Context:** PR #24611: Add test for YoloX Yolo v6 and Yolo v8

**Code Changes:**
```diff
@@ -12,6 +12,15 @@
 #include <numeric>
 namespace opencv_test { namespace {
 
+void yoloPostProcessing(
+    std::vector<Mat>& outs,
+    std::vector<int>& keep_classIds,
+    std::vector<float>& keep_confidences,
+    std::vector<Rect2d>& keep_boxes,
+    float conf_threshold,
```

Review comment:
Is that an observed error or just to cover all backends and HW targets? Just seems too big.
**File:** modules/dnn/test/test_onnx_importer.cpp
**Change Type:** modified
**Context:** PR #24611: Add test for YoloX Yolo v6 and Yolo v8

**Code Changes:**
```diff
@@ -12,6 +12,15 @@
 #include <numeric>
 namespace opencv_test { namespace {
 
+void yoloPostProcessing(
+    std::vector<Mat>& outs,
+    std::vector<int>& keep_classIds,
+    std::vector<float>& keep_confidences,
+    std::vector<Rect2d>& keep_boxes,
+    float conf_threshold,
```

Review comment:
I think `x` should be capital.
**File:** modules/dnn/test/test_onnx_importer.cpp
**Change Type:** modified
**Context:** PR #24611: Add test for YoloX Yolo v6 and Yolo v8

**Code Changes:**
```diff
@@ -12,6 +12,15 @@
 #include <numeric>
 namespace opencv_test { namespace {
 
+void yoloPostProcessing(
+    std::vector<Mat>& outs,
+    std::vector<int>& keep_classIds,
+    std::vector<float>& keep_confidences,
+    std::vector<Rect2d>& keep_boxes,
+    float conf_threshold,
```

Review comment:
I was thinking constructing it that way, but then opted to proceed with current version because this way I thought it is more self contained (a part from needing to have struct). If you think it is better to return by argument, I will change it.
**File:** modules/dnn/test/test_onnx_importer.cpp
**Change Type:** modified
**Context:** PR #24611: Add test for YoloX Yolo v6 and Yolo v8
**Review Line:** 2682

**Code Changes:**
```diff
             double conf;
             Point maxLoc;
             minMaxLoc(scores, 0, &conf, 0, &maxLoc);
-            conf *= obj_conf;
+
+            conf = (test_name != "yolov8") ? conf * obj_conf : conf;
             if (conf < conf_threshold)
                 continue;
 
@@ -2653,6 +2689,7 @@ static void testYOLO(const std::string& weightPath, const std::vector<int>& refC
             double cy = det[1];
```

Review comment:
From I quick glance, it seems as nothing needs to be changed since confidence score is taken as max over all scores. But the onnx the sample is using is difference from the one I am using
**File:** modules/dnn/test/test_onnx_importer.cpp
**Change Type:** modified
**Context:** PR #24611: Add test for YoloX Yolo v6 and Yolo v8

**Code Changes:**
```diff
@@ -12,6 +12,15 @@
 #include <numeric>
 namespace opencv_test { namespace {
 
+void yoloPostProcessing(
+    std::vector<Mat>& outs,
+    std::vector<int>& keep_classIds,
+    std::vector<float>& keep_confidences,
+    std::vector<Rect2d>& keep_boxes,
+    float conf_threshold,
```

Review comment:
I only checked on 1 image for all backends. Did not try differences HWs. Why too big? 0.1 is not even a pixel difference.
**File:** modules/dnn/test/test_onnx_importer.cpp
**Change Type:** modified
**Context:** PR #24611: Add test for YoloX Yolo v6 and Yolo v8
**Review Line:** 2682

**Code Changes:**
```diff
             double conf;
             Point maxLoc;
             minMaxLoc(scores, 0, &conf, 0, &maxLoc);
-            conf *= obj_conf;
+
+            conf = (test_name != "yolov8") ? conf * obj_conf : conf;
             if (conf < conf_threshold)
                 continue;
 
@@ -2653,6 +2689,7 @@ static void testYOLO(const std::string& weightPath, const std::vector<int>& refC
             double cy = det[1];
```

Review comment:
Do you mean YOLOv8? Which one of the models is more convenient this way?
**File:** modules/dnn/test/test_onnx_importer.cpp
**Change Type:** modified
**Context:** PR #24611: Add test for YoloX Yolo v6 and Yolo v8
**Review Line:** 2682

**Code Changes:**
```diff
             double conf;
             Point maxLoc;
             minMaxLoc(scores, 0, &conf, 0, &maxLoc);
-            conf *= obj_conf;
+
+            conf = (test_name != "yolov8") ? conf * obj_conf : conf;
             if (conf < conf_threshold)
                 continue;
 
@@ -2653,6 +2689,7 @@ static void testYOLO(const std::string& weightPath, const std::vector<int>& refC
             double cy = det[1];
```

Review comment:
For YOLOv8 there is no separate objectness score as for YOLOV5, 6,7, YOLOx. So I need to create it suing max class score. I did based on the [ultralytics](https://github.com/ultralytics/ultralytics) repository, which is the main repo for YOLOV8
**File:** modules/dnn/test/test_onnx_importer.cpp
**Change Type:** modified
**Context:** PR #24611: Add test for YoloX Yolo v6 and Yolo v8
**Review Line:** 2682

**Code Changes:**
```diff
             double conf;
             Point maxLoc;
             minMaxLoc(scores, 0, &conf, 0, &maxLoc);
-            conf *= obj_conf;
+
+            conf = (test_name != "yolov8") ? conf * obj_conf : conf;
             if (conf < conf_threshold)
                 continue;
 
@@ -2653,6 +2689,7 @@ static void testYOLO(const std::string& weightPath, const std::vector<int>& refC
             double cy = det[1];
```

Review comment:
Well, sample was tested on their model too. Let’s align sample in a separate PR
**File:** modules/dnn/test/test_onnx_importer.cpp
**Change Type:** modified
**Context:** PR #24611: Add test for YoloX Yolo v6 and Yolo v8

**Code Changes:**
```diff
@@ -12,6 +12,15 @@
 #include <numeric>
 namespace opencv_test { namespace {
 
+void yoloPostProcessing(
+    std::vector<Mat>& outs,
+    std::vector<int>& keep_classIds,
+    std::vector<float>& keep_confidences,
+    std::vector<Rect2d>& keep_boxes,
+    float conf_threshold,
```

Review comment:
Can you please share confidence scores as well?
**File:** modules/dnn/test/test_onnx_importer.cpp
**Change Type:** modified
**Context:** PR #24611: Add test for YoloX Yolo v6 and Yolo v8

**Code Changes:**
```diff
@@ -12,6 +12,15 @@
 #include <numeric>
 namespace opencv_test { namespace {
 
+void yoloPostProcessing(
+    std::vector<Mat>& outs,
+    std::vector<int>& keep_classIds,
+    std::vector<float>& keep_confidences,
+    std::vector<Rect2d>& keep_boxes,
+    float conf_threshold,
```

Review comment:
Looks like NMS works differently in GT and our implementation. What if we drop NMS and just sort boxes by confidence on both sides?
**File:** modules/dnn/test/test_onnx_importer.cpp
**Change Type:** modified
**Context:** PR #24611: Add test for YoloX Yolo v6 and Yolo v8

**Code Changes:**
```diff
@@ -12,6 +12,15 @@
 #include <numeric>
 namespace opencv_test { namespace {
 
+void yoloPostProcessing(
+    std::vector<Mat>& outs,
+    std::vector<int>& keep_classIds,
+    std::vector<float>& keep_confidences,
+    std::vector<Rect2d>& keep_boxes,
+    float conf_threshold,
```

Review comment:
> Can you please share confidence scores as well? conf, xmin, ymin, xmax, ymax **Target:** ``` 0.96, 104.62, 181.28, 470.95, 428.22 0.91, 112.32, 264.88, 258.11, 527.31 0.66, 389.63, 144.63, 576.66, 223.18 ``` **Source:** ``` 0.964937 105.568 179.377 470.586 428.593 0.916445 111.434 263.394 258.764 525.903 0.694355 389.142 143.935 578.056 221.994 ```
**File:** modules/dnn/test/test_onnx_importer.cpp
**Change Type:** modified
**Context:** PR #24611: Add test for YoloX Yolo v6 and Yolo v8

**Code Changes:**
```diff
@@ -12,6 +12,15 @@
 #include <numeric>
 namespace opencv_test { namespace {
 
+void yoloPostProcessing(
+    std::vector<Mat>& outs,
+    std::vector<int>& keep_classIds,
+    std::vector<float>& keep_confidences,
+    std::vector<Rect2d>& keep_boxes,
+    float conf_threshold,
```

Review comment:
> Looks like NMS works differently in GT and our implementation. What if we drop NMS and just sort boxes by confidence on both sides? How close must detectors final output match the GT ?
**File:** modules/dnn/test/test_onnx_importer.cpp
**Change Type:** modified
**Context:** PR #24611: Add test for YoloX Yolo v6 and Yolo v8

**Code Changes:**
```diff
@@ -12,6 +12,15 @@
 #include <numeric>
 namespace opencv_test { namespace {
 
+void yoloPostProcessing(
+    std::vector<Mat>& outs,
+    std::vector<int>& keep_classIds,
+    std::vector<float>& keep_confidences,
+    std::vector<Rect2d>& keep_boxes,
+    float conf_threshold,
```

Review comment:
not `1e-2`, but `4e-2` because `0.694355 - 0.66 = 0.034355`
**File:** modules/dnn/test/test_onnx_importer.cpp
**Change Type:** modified
**Context:** PR #24611: Add test for YoloX Yolo v6 and Yolo v8

**Code Changes:**
```diff
@@ -12,6 +12,15 @@
 #include <numeric>
 namespace opencv_test { namespace {
 
+void yoloPostProcessing(
+    std::vector<Mat>& outs,
+    std::vector<int>& keep_classIds,
+    std::vector<float>& keep_confidences,
+    std::vector<Rect2d>& keep_boxes,
+    float conf_threshold,
```

Review comment:
Found the issue. It what that input was BGR for rather than in RGB
**File:** modules/dnn/test/test_onnx_importer.cpp
**Change Type:** modified
**Context:** PR #24611: Add test for YoloX Yolo v6 and Yolo v8

**Code Changes:**
```diff
@@ -12,6 +12,15 @@
 #include <numeric>
 namespace opencv_test { namespace {
 
+void yoloPostProcessing(
+    std::vector<Mat>& outs,
+    std::vector<int>& keep_classIds,
+    std::vector<float>& keep_confidences,
+    std::vector<Rect2d>& keep_boxes,
+    float conf_threshold,
```

Review comment:
CI blames a trailing whitespace
**File:** modules/dnn/test/test_onnx_importer.cpp
**Change Type:** modified
**Context:** PR #24611: Add test for YoloX Yolo v6 and Yolo v8

**Code Changes:**
```diff
@@ -12,6 +12,15 @@
 #include <numeric>
 namespace opencv_test { namespace {
 
+void yoloPostProcessing(
+    std::vector<Mat>& outs,
+    std::vector<int>& keep_classIds,
+    std::vector<float>& keep_confidences,
+    std::vector<Rect2d>& keep_boxes,
+    float conf_threshold,
```

Review comment:
You may setup a related setting in IDE. For example, VSCode: https://stackoverflow.com/a/30884298
**File:** modules/dnn/test/test_onnx_importer.cpp
**Change Type:** modified
**Context:** PR #24611: Add test for YoloX Yolo v6 and Yolo v8

**Code Changes:**
```diff
@@ -12,6 +12,15 @@
 #include <numeric>
 namespace opencv_test { namespace {
 
+void yoloPostProcessing(
+    std::vector<Mat>& outs,
+    std::vector<int>& keep_classIds,
+    std::vector<float>& keep_confidences,
+    std::vector<Rect2d>& keep_boxes,
+    float conf_threshold,
```

Review comment:
> White spaces are NOT detected locally Again, mentioned Wiki page has BKM how to enable that.
**File:** doc/tutorials/introduction/crosscompilation/crosscompile_with_multiarch.markdown
**Change Type:** added
**Context:** PR #24629: doc: add crosscompile_with_multiarch

**Code Changes:**
```diff
@@ -0,0 +1,595 @@
+# MultiArch cross-compilation with Ubuntu/Debian{#tutorial_crosscompile_with_multiarch}
+
+@prev_tutorial{tutorial_arm_crosscompile_with_cmake}
+@next_tutorial{tutorial_building_tegra_cuda}
+
+[TOC]
+
+|    |    |
+| -: | :- |
```

Review comment:
Please add motivation why it's useful. I would start from words like this: ``` OpenCV may use a lot of 3rdparty libraries for video and image decoding, rendering, acceleration and complex math algorithms. The 3rdparty components are found by CMake on the build host Cross-compilation allows to build OpenCV for foreign architecture or OS, but we loose that large world of components and have to cross-compile each dependency separately and point to it during OpenCV build. Debian/Ubuntu MultiArch helps to fix this. It allows to install several foreign architecture libraries on host system and use them during OpenCV dependencies resolution. ```
**File:** doc/tutorials/introduction/crosscompilation/crosscompile_with_multiarch.markdown
**Change Type:** added
**Context:** PR #24629: doc: add crosscompile_with_multiarch

**Code Changes:**
```diff
@@ -0,0 +1,595 @@
+# MultiArch cross-compilation with Ubuntu/Debian{#tutorial_crosscompile_with_multiarch}
+
+@prev_tutorial{tutorial_arm_crosscompile_with_cmake}
+@next_tutorial{tutorial_building_tegra_cuda}
+
+[TOC]
+
+|    |    |
+| -: | :- |
```

Review comment:
Not Good will be better.
**File:** doc/tutorials/introduction/crosscompilation/crosscompile_with_multiarch.markdown
**Change Type:** added
**Context:** PR #24629: doc: add crosscompile_with_multiarch

**Code Changes:**
```diff
@@ -0,0 +1,595 @@
+# MultiArch cross-compilation with Ubuntu/Debian{#tutorial_crosscompile_with_multiarch}
+
+@prev_tutorial{tutorial_arm_crosscompile_with_cmake}
+@next_tutorial{tutorial_building_tegra_cuda}
+
+[TOC]
+
+|    |    |
+| -: | :- |
```

Review comment:
Please exclude CCache. It's useless, if you build OpenCV once for the project, but do not rebuild it continuously.
**File:** doc/tutorials/introduction/crosscompilation/crosscompile_with_multiarch.markdown
**Change Type:** added
**Context:** PR #24629: doc: add crosscompile_with_multiarch

**Code Changes:**
```diff
@@ -0,0 +1,595 @@
+# MultiArch cross-compilation with Ubuntu/Debian{#tutorial_crosscompile_with_multiarch}
+
+@prev_tutorial{tutorial_arm_crosscompile_with_cmake}
+@next_tutorial{tutorial_building_tegra_cuda}
+
+[TOC]
+
+|    |    |
+| -: | :- |
```

Review comment:
It'll be very useful to show the case with FFmpeg. It's the most requested 3rdparty dependency for cross-compilation.
**File:** doc/tutorials/introduction/crosscompilation/crosscompile_with_multiarch.markdown
**Change Type:** added
**Context:** PR #24629: doc: add crosscompile_with_multiarch

**Code Changes:**
```diff
@@ -0,0 +1,595 @@
+# MultiArch cross-compilation with Ubuntu/Debian{#tutorial_crosscompile_with_multiarch}
+
+@prev_tutorial{tutorial_arm_crosscompile_with_cmake}
+@next_tutorial{tutorial_building_tegra_cuda}
+
+[TOC]
+
+|    |    |
+| -: | :- |
```

Review comment:
Please do not drop platform specific CPU options from CMake output like CPU_BASELINE, CPU_DISPATCH. They are very important for the case.
**File:** doc/tutorials/introduction/crosscompilation/crosscompile_with_multiarch.markdown
**Change Type:** added
**Context:** PR #24629: doc: add crosscompile_with_multiarch

**Code Changes:**
```diff
@@ -0,0 +1,595 @@
+# MultiArch cross-compilation with Ubuntu/Debian{#tutorial_crosscompile_with_multiarch}
+
+@prev_tutorial{tutorial_arm_crosscompile_with_cmake}
+@next_tutorial{tutorial_building_tegra_cuda}
+
+[TOC]
+
+|    |    |
+| -: | :- |
```

Review comment:
As the last step please describe execution on cross-compilation target: you need to install the same versions of 3rdparty packages, etc.
**File:** doc/tutorials/introduction/crosscompilation/crosscompile_with_multiarch.markdown
**Change Type:** added
**Context:** PR #24629: doc: add crosscompile_with_multiarch
**Review Line:** 58

**Code Changes:**
```diff
+    cmake \
+    pkgconf \
+    build-essential \
+    ninja-build \
+    crossbuild-essential-armhf \
+    crossbuild-essential-arm64
+@endcode
+
+If you want to enable Python 3 wrapper, install these packages too.
+
+@code{.bash}
```

Review comment:
I suggest add python dependency because it's widely used ``` python3-minimal \ python3-pip \ libpython3-dev:armhf \ libpython3-dev:arm64 \ ``` There is a working Dockerfile for riscv64 as a reference: https://github.com/dkurt/hair_segmentation/blob/main/opencv_riscv64/Dockerfile
**File:** doc/tutorials/introduction/crosscompilation/crosscompile_with_multiarch.markdown
**Change Type:** added
**Context:** PR #24629: doc: add crosscompile_with_multiarch

**Code Changes:**
```diff
@@ -0,0 +1,595 @@
+# MultiArch cross-compilation with Ubuntu/Debian{#tutorial_crosscompile_with_multiarch}
+
+@prev_tutorial{tutorial_arm_crosscompile_with_cmake}
+@next_tutorial{tutorial_building_tegra_cuda}
+
+[TOC]
+
+|    |    |
+| -: | :- |
```

Review comment:
``` git clone --depth 1 https://github.com/opencv/opencv.git git clone --depth 1 https://github.com/opencv/opencv_contrib.git ```