nareshmlx/opencv-pr huggingface dataset:
**File:** modules/3d/include/opencv2/3d.hpp
**Change Type:** modified
**Context:** PR #23985: [GSoC] Update octree methods and create frames for PCC

**Code Changes:**
```diff
@@ -2676,112 +2676,156 @@ CV_EXPORTS_W bool solvePnP( InputArray objectPoints, InputArray imagePoints,
  * children[7]: origin == (1, 1, 1), size == 1, furthest from child 0
  */
 
-class CV_EXPORTS Octree {
-
+class CV_EXPORTS_W Octree
+{
 public:
-
```

Review comment:
Input arrays usually go first in the public API.
**File:** modules/3d/include/opencv2/3d.hpp
**Change Type:** modified
**Context:** PR #23985: [GSoC] Update octree methods and create frames for PCC

**Code Changes:**
```diff
@@ -2676,112 +2676,156 @@ CV_EXPORTS_W bool solvePnP( InputArray objectPoints, InputArray imagePoints,
  * children[7]: origin == (1, 1, 1), size == 1, furthest from child 0
  */
 
-class CV_EXPORTS Octree {
-
+class CV_EXPORTS_W Octree
+{
 public:
-
```

Review comment:
What about bindings?
**File:** modules/3d/test/test_octree.cpp
**Change Type:** modified
**Context:** PR #23985: [GSoC] Update octree methods and create frames for PCC

**Code Changes:**
```diff
@@ -14,100 +14,145 @@ class OctreeTest: public testing::Test
     void SetUp() override
     {
         pointCloudSize = 1000;
-        maxDepth = 18;
-
+        resolution = 0.0001;
         int scale;
         Point3i pmin, pmax;
-        scale = 1<<20;
```

Review comment:
Is the remark still relevant?
**File:** modules/3d/test/test_octree.cpp
**Change Type:** modified
**Context:** PR #23985: [GSoC] Update octree methods and create frames for PCC
**Review Line:** 106

**Code Changes:**
```diff
+    for (int i = 0; i < (int)goldVals.size(); i++, it++)
+    {
+        Point3f p = it->second;
+        EXPECT_FLOAT_EQ(goldVals[i].x, p.x);
+        EXPECT_FLOAT_EQ(goldVals[i].y, p.y);
+    }
 }
 
 TEST_F(OctreeTest, KNNSearchTest)
 {
     int K = 10;
```

Review comment:
It could be just NORM_INF
**File:** modules/3d/src/octree.cpp
**Change Type:** modified
**Context:** PR #23985: [GSoC] Update octree methods and create frames for PCC

**Code Changes:**
```diff
@@ -4,32 +4,27 @@
 
 #include "precomp.hpp"
 #include "octree.hpp"
-
-#define OCTREE_CHILD_NUM 8
+#include "opencv2/3d.hpp"
 
 namespace cv{
 
```

Review comment:
Ptr& does not make sense.
**File:** modules/3d/include/opencv2/3d.hpp
**Change Type:** modified
**Context:** PR #23985: [GSoC] Update octree methods and create frames for PCC

**Code Changes:**
```diff
@@ -2676,112 +2676,156 @@ CV_EXPORTS_W bool solvePnP( InputArray objectPoints, InputArray imagePoints,
  * children[7]: origin == (1, 1, 1), size == 1, furthest from child 0
  */
 
-class CV_EXPORTS Octree {
-
+class CV_EXPORTS_W Octree
+{
 public:
-
```

Review comment:
This was made intentionally to reduce amount of overloaded methods
**File:** modules/3d/include/opencv2/3d.hpp
**Change Type:** modified
**Context:** PR #23985: [GSoC] Update octree methods and create frames for PCC

**Code Changes:**
```diff
@@ -2676,112 +2676,156 @@ CV_EXPORTS_W bool solvePnP( InputArray objectPoints, InputArray imagePoints,
  * children[7]: origin == (1, 1, 1), size == 1, furthest from child 0
  */
 
-class CV_EXPORTS Octree {
-
+class CV_EXPORTS_W Octree
+{
 public:
-
```

Review comment:
Implemented python bindings for Octree + a simple test
**File:** modules/3d/test/test_octree.cpp
**Change Type:** modified
**Context:** PR #23985: [GSoC] Update octree methods and create frames for PCC
**Review Line:** 106

**Code Changes:**
```diff
+    for (int i = 0; i < (int)goldVals.size(); i++, it++)
+    {
+        Point3f p = it->second;
+        EXPECT_FLOAT_EQ(goldVals[i].x, p.x);
+        EXPECT_FLOAT_EQ(goldVals[i].y, p.y);
+    }
 }
 
 TEST_F(OctreeTest, KNNSearchTest)
 {
     int K = 10;
```

Review comment:
I propose to leave it as it is, using `NORM_INF` looks cumbersome here
**File:** modules/dnn/test/test_layers.cpp
**Change Type:** modified
**Context:** PR #25117: Scale layer 1d test
**Review Line:** 640

**Code Changes:**
```diff
+    std::vector<int> output_shape = {batch_size, 3};
+
+    if (batch_size == 0){
+        input_shape.erase(input_shape.begin());
+        output_shape.erase(output_shape.begin());
+    }
+
+    cv::Mat input = cv::Mat(input_shape, CV_32F, 1.0);
+    cv::randn(input, 0.0, 1.0);
+    cv::Mat weight = cv::Mat(output_shape, CV_32F, 2.0);
+
```

Review comment:
What is that?
**File:** modules/dnn/test/test_layers.cpp
**Change Type:** modified
**Context:** PR #25117: Scale layer 1d test
**Review Line:** 656

**Code Changes:**
```diff
+
+    ASSERT_EQ(shape(output_ref), shape(outputs[0]));
+    normAssert(output_ref, outputs[0]);
+}
+INSTANTIATE_TEST_CASE_P(/*nothing*/, Layer_Scale_1d_Test,
+/*operation*/           Values(0, 1));
+
+
 typedef testing::TestWithParam<tuple<int, int>> Layer_Gather_1d_Test;
 TEST_P(Layer_Gather_1d_Test, Accuracy) {
 
```

Review comment:
batch = 0 meaningless. We should test: - batch = 1 - inference of 1 set of inputs - batch = N, where N > 1 - inference of N sets of inputs.
**File:** modules/dnn/test/test_layers.cpp
**Change Type:** modified
**Context:** PR #25117: Scale layer 1d test
**Review Line:** 640

**Code Changes:**
```diff
+    std::vector<int> output_shape = {batch_size, 3};
+
+    if (batch_size == 0){
+        input_shape.erase(input_shape.begin());
+        output_shape.erase(output_shape.begin());
+    }
+
+    cv::Mat input = cv::Mat(input_shape, CV_32F, 1.0);
+    cv::randn(input, 0.0, 1.0);
+    cv::Mat weight = cv::Mat(output_shape, CV_32F, 2.0);
+
```

Review comment:
to test [N] sized vector
**File:** modules/dnn/test/test_layers.cpp
**Change Type:** modified
**Context:** PR #25117: Scale layer 1d test
**Review Line:** 656

**Code Changes:**
```diff
+
+    ASSERT_EQ(shape(output_ref), shape(outputs[0]));
+    normAssert(output_ref, outputs[0]);
+}
+INSTANTIATE_TEST_CASE_P(/*nothing*/, Layer_Scale_1d_Test,
+/*operation*/           Values(0, 1));
+
+
 typedef testing::TestWithParam<tuple<int, int>> Layer_Gather_1d_Test;
 TEST_P(Layer_Gather_1d_Test, Accuracy) {
 
```

Review comment:
This is what I am doing
**File:** modules/dnn/test/test_layers.cpp
**Change Type:** modified
**Context:** PR #25117: Scale layer 1d test
**Review Line:** 640

**Code Changes:**
```diff
+    std::vector<int> output_shape = {batch_size, 3};
+
+    if (batch_size == 0){
+        input_shape.erase(input_shape.begin());
+        output_shape.erase(output_shape.begin());
+    }
+
+    cv::Mat input = cv::Mat(input_shape, CV_32F, 1.0);
+    cv::randn(input, 0.0, 1.0);
+    cv::Mat weight = cv::Mat(output_shape, CV_32F, 2.0);
+
```

Review comment:
when batch is 0
**File:** modules/dnn/src/int8layers/convolution_layer.cpp
**Change Type:** modified
**Context:** PR #24556: Optimization based on RISC-V P Packed SIMD Extension v0.5.2

**Code Changes:**
```diff
@@ -969,6 +969,13 @@ class ConvolutionLayerInt8Impl CV_FINAL : public BaseConvolutionLayerInt8Impl
                                     stride_h, stride_w, dilation_h, dilation_w, pad_t, pad_l,
                                     biasptr, multptr, inptr_, height, width, outptr_, out_d, outH, outW, inpZp, outZp);
                             else
+                        #endif
+                        #if CV_RVP052
+                            if(isConv2D)
+                                opt_RVP052::fastDepthwiseConv(wptr, kernel_h, kernel_w,
+                                    stride_h, stride_w, dilation_h, dilation_w, pad_t, pad_l,
+                                    biasptr, multptr, inptr_, height, width, outptr_, out_d, outH, outW, inpZp, outZp);
```

Review comment:
`useRVP052` is always the same as `CV_RVP052` and does not have external interface, so I suggest removing boolean flag completely. Here and in other files.
**File:** modules/dnn/src/int8layers/convolution_layer.cpp
**Change Type:** modified
**Context:** PR #24556: Optimization based on RISC-V P Packed SIMD Extension v0.5.2

**Code Changes:**
```diff
@@ -969,6 +969,13 @@ class ConvolutionLayerInt8Impl CV_FINAL : public BaseConvolutionLayerInt8Impl
                                     stride_h, stride_w, dilation_h, dilation_w, pad_t, pad_l,
                                     biasptr, multptr, inptr_, height, width, outptr_, out_d, outH, outW, inpZp, outZp);
                             else
+                        #endif
+                        #if CV_RVP052
+                            if(isConv2D)
+                                opt_RVP052::fastDepthwiseConv(wptr, kernel_h, kernel_w,
+                                    stride_h, stride_w, dilation_h, dilation_w, pad_t, pad_l,
+                                    biasptr, multptr, inptr_, height, width, outptr_, out_d, outH, outW, inpZp, outZp);
```

Review comment:
In `fully_connected_layer.cpp` this is absolutely right. But in `convolution_layer.cpp`, `useRVP052` is not always the same as `CV_RVP052`, because of `line 769` `p.useRVP052 = CV_RVP052 && isConv2D;` introducing a little difference. So change this boolean flag into `isConv2D` might be better.
**File:** 3rdparty/libjasper/jas_stream.c
**Change Type:** modified
**Context:** PR #25086: Fixed typo.
**Review Line:** 892

**Code Changes:**
```diff
@@ -889,7 +889,7 @@ int jas_stream_copy(jas_stream_t *out, jas_stream_t *in, int n)
     while (all || m > 0) {
         if ((c = jas_stream_getc_macro(in)) == EOF) {
             /* The next character of input could not be read. */
-            /* Return with an error if an I/O error occured
+            /* Return with an error if an I/O error occurred
               (not including EOF) or if an explicit copy count
               was specified. */
             return (!all || jas_stream_error(in)) ? (-1) : 0;
```

Review comment:
3rdparty files should NOT be touched without whole 3rdparty library upgrade.
**File:** modules/calib/include/opencv2/calib.hpp
**Change Type:** modified
**Context:** PR #25061: RegisterCameras function for heterogenious cameras pair

**Code Changes:**
```diff
@@ -422,6 +422,11 @@ enum { CALIB_CB_SYMMETRIC_GRID  = 1,
 
 #define CALIB_NINTRINSIC 18 //!< Maximal size of camera internal parameters (initrinsics) vector
 
+enum CameraModel {
+    CALIB_MODEL_PINHOLE = 0, //!< Pinhole camera model
+    CALIB_MODEL_FISHEYE = 1, //!< Fisheye camera model
+};
+
 enum { CALIB_USE_INTRINSIC_GUESS = 0x00001, //!< Use user provided intrinsics as initial point for optimization.
```

Review comment:
I'd suggest to use a non-anonymous enumeration for the camera model to make it more robust. enum `CameraModel { CALIB_MODEL_.... };` or even `enum class CameraModel { PINHOLE=0, FISHEYE=1 };`
**File:** modules/calib/test/test_cameracalibration.cpp
**Change Type:** modified
**Context:** PR #25061: RegisterCameras function for heterogenious cameras pair
**Review Line:** 1774

**Code Changes:**
```diff
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
+///////////////////////////////// Register Cameras ////////////////////////////////////////////////
+
+class CV_CameraRegistrationTest : public cvtest::BaseTest
+{
+public:
+    CV_CameraRegistrationTest();
+    ~CV_CameraRegistrationTest();
+    void clear();
```

Review comment:
Most of the test are written in old style; perhaps, need to rewrite them in GTest-style sometimes, but it's not urgent, of course
**File:** modules/calib/src/calibration.cpp
**Change Type:** modified
**Context:** PR #25061: RegisterCameras function for heterogenious cameras pair
**Review Line:** 1482

**Code Changes:**
```diff
+
+                            for(int j = 0; j < 3; j++)
+                                J_LR.at<double>(p, 3+j) = de3dt2(j);
+                        }
+
+                        JtJ(Rect(0, 0, 6, 6)) += J_LR.t()*J_LR;
+                        JtJ(Rect(eofs, 0, 6, 6)) = J_LR.t()*Je;
+                        JtErr.rowRange(0, 6) += J_LR.t()*err;
+                    }
+
+                    JtJ(Rect(eofs, eofs, 6, 6)) += Je.t()*Je;
```

Review comment:
btw, all such code would have to be rewritten if we get rid of matrix expressions; probably, it's easier to keep it (matrix expressions and this code)
**File:** doc/tutorials/objdetect/aruco_board_detection/aruco_board_detection.markdown
**Change Type:** added
**Context:** PR #23018: Move Aruco tutorials and samples to main repo

**Code Changes:**
```diff
@@ -0,0 +1,201 @@
+Detection of ArUco boards {#tutorial_aruco_board_detection}
+=========================
+
+@prev_tutorial{tutorial_aruco_detection}
+
+|    |    |
+| -: | :- |
+| Original authors | Sergio Garrido, Alexander Panov |
+| Compatibility    | OpenCV >= 4.7.0 |
```

Review comment:
Real life photos must be in JPEG format. PNG blows up size in these cases.
**File:** doc/tutorials/objdetect/aruco_board_detection/aruco_board_detection.markdown
**Change Type:** added
**Context:** PR #23018: Move Aruco tutorials and samples to main repo

**Code Changes:**
```diff
@@ -0,0 +1,201 @@
+Detection of ArUco boards {#tutorial_aruco_board_detection}
+=========================
+
+@prev_tutorial{tutorial_aruco_detection}
+
+|    |    |
+| -: | :- |
+| Original authors | Sergio Garrido, Alexander Panov |
+| Compatibility    | OpenCV >= 4.7.0 |
```

Review comment:
Snippets should be used instead of manual **non-verified** code.
**File:** doc/tutorials/objdetect/aruco_board_detection/aruco_board_detection.markdown
**Change Type:** added
**Context:** PR #23018: Move Aruco tutorials and samples to main repo

**Code Changes:**
```diff
@@ -0,0 +1,201 @@
+Detection of ArUco boards {#tutorial_aruco_board_detection}
+=========================
+
+@prev_tutorial{tutorial_aruco_detection}
+
+|    |    |
+| -: | :- |
+| Original authors | Sergio Garrido, Alexander Panov |
+| Compatibility    | OpenCV >= 4.7.0 |
```

Review comment:
`#solvePnP ` is enough
**File:** doc/tutorials/objdetect/aruco_board_detection/aruco_board_detection.markdown
**Change Type:** added
**Context:** PR #23018: Move Aruco tutorials and samples to main repo

**Code Changes:**
```diff
@@ -0,0 +1,201 @@
+Detection of ArUco boards {#tutorial_aruco_board_detection}
+=========================
+
+@prev_tutorial{tutorial_aruco_detection}
+
+|    |    |
+| -: | :- |
+| Original authors | Sergio Garrido, Alexander Panov |
+| Compatibility    | OpenCV >= 4.7.0 |
```

Review comment:
`#drawFrameAxes`
**File:** doc/tutorials/objdetect/aruco_board_detection/aruco_board_detection.markdown
**Change Type:** added
**Context:** PR #23018: Move Aruco tutorials and samples to main repo

**Code Changes:**
```diff
@@ -0,0 +1,201 @@
+Detection of ArUco boards {#tutorial_aruco_board_detection}
+=========================
+
+@prev_tutorial{tutorial_aruco_detection}
+
+|    |    |
+| -: | :- |
+| Original authors | Sergio Garrido, Alexander Panov |
+| Compatibility    | OpenCV >= 4.7.0 |
```

Review comment:
What should I do if the example contains a lot of extra code that I would **not** like to include in the tutorial?
**File:** doc/tutorials/objdetect/aruco_board_detection/aruco_board_detection.markdown
**Change Type:** added
**Context:** PR #23018: Move Aruco tutorials and samples to main repo

**Code Changes:**
```diff
@@ -0,0 +1,201 @@
+Detection of ArUco boards {#tutorial_aruco_board_detection}
+=========================
+
+@prev_tutorial{tutorial_aruco_detection}
+
+|    |    |
+| -: | :- |
+| Original authors | Sergio Garrido, Alexander Panov |
+| Compatibility    | OpenCV >= 4.7.0 |
```

Review comment:
Take a look on `cv::reduce` on docs.opencv.org as example. You could define any part of the code to include into documentation.
**File:** doc/tutorials/objdetect/aruco_board_detection/aruco_board_detection.markdown
**Change Type:** added
**Context:** PR #23018: Move Aruco tutorials and samples to main repo

**Code Changes:**
```diff
@@ -0,0 +1,201 @@
+Detection of ArUco boards {#tutorial_aruco_board_detection}
+=========================
+
+@prev_tutorial{tutorial_aruco_detection}
+
+|    |    |
+| -: | :- |
+| Original authors | Sergio Garrido, Alexander Panov |
+| Compatibility    | OpenCV >= 4.7.0 |
```

Review comment:
replaced by snippets
**File:** doc/tutorials/objdetect/aruco_board_detection/aruco_board_detection.markdown
**Change Type:** added
**Context:** PR #23018: Move Aruco tutorials and samples to main repo

**Code Changes:**
```diff
@@ -0,0 +1,201 @@
+Detection of ArUco boards {#tutorial_aruco_board_detection}
+=========================
+
+@prev_tutorial{tutorial_aruco_detection}
+
+|    |    |
+| -: | :- |
+| Original authors | Sergio Garrido, Alexander Panov |
+| Compatibility    | OpenCV >= 4.7.0 |
```

Review comment:
Please use just cv::aruco::Board here and other places. Doxygen automatically adds links.
**File:** doc/tutorials/objdetect/aruco_board_detection/aruco_board_detection.markdown
**Change Type:** added
**Context:** PR #23018: Move Aruco tutorials and samples to main repo

**Code Changes:**
```diff
@@ -0,0 +1,201 @@
+Detection of ArUco boards {#tutorial_aruco_board_detection}
+=========================
+
+@prev_tutorial{tutorial_aruco_detection}
+
+|    |    |
+| -: | :- |
+| Original authors | Sergio Garrido, Alexander Panov |
+| Compatibility    | OpenCV >= 4.7.0 |
```

Review comment:
The same for links.
**File:** doc/tutorials/objdetect/aruco_board_detection/aruco_board_detection.markdown
**Change Type:** added
**Context:** PR #23018: Move Aruco tutorials and samples to main repo

**Code Changes:**
```diff
@@ -0,0 +1,201 @@
+Detection of ArUco boards {#tutorial_aruco_board_detection}
+=========================
+
+@prev_tutorial{tutorial_aruco_detection}
+
+|    |    |
+| -: | :- |
+| Original authors | Sergio Garrido, Alexander Panov |
+| Compatibility    | OpenCV >= 4.7.0 |
```

Review comment:
board, capital letter is not required.
**File:** doc/tutorials/objdetect/aruco_board_detection/aruco_board_detection.markdown
**Change Type:** added
**Context:** PR #23018: Move Aruco tutorials and samples to main repo

**Code Changes:**
```diff
@@ -0,0 +1,201 @@
+Detection of ArUco boards {#tutorial_aruco_board_detection}
+=========================
+
+@prev_tutorial{tutorial_aruco_detection}
+
+|    |    |
+| -: | :- |
+| Original authors | Sergio Garrido, Alexander Panov |
+| Compatibility    | OpenCV >= 4.7.0 |
```

Review comment:
it should be relative to opencv repo root.
**File:** samples/cpp/tutorial_code/objectDetection/aruco_samples_utility.hpp
**Change Type:** added
**Context:** PR #23018: Move Aruco tutorials and samples to main repo

**Code Changes:**
```diff
@@ -0,0 +1,48 @@
+#include <opencv2/highgui.hpp>
+#include <opencv2/objdetect/aruco_detector.hpp>
+#include <opencv2/calib3d.hpp>
+#include <ctime>
+
+namespace {
+inline static bool readCameraParameters(const std::string& filename, cv::Mat &camMatrix, cv::Mat &distCoeffs) {
+    cv::FileStorage fs(filename, cv::FileStorage::READ);
+    if (!fs.isOpened())
```

Review comment:
`const std::string&`
**File:** samples/cpp/tutorial_code/objectDetection/create_marker.cpp
**Change Type:** added
**Context:** PR #23018: Move Aruco tutorials and samples to main repo

**Code Changes:**
```diff
@@ -0,0 +1,77 @@
+#include <opencv2/highgui.hpp>
+#include <opencv2/objdetect/aruco_detector.hpp>
+#include <iostream>
+#include "aruco_samples_utility.hpp"
+
+using namespace cv;
+
+namespace {
+const char* about = "Create an ArUco marker image";
```

Review comment:
please use named constant instead 0.
**File:** samples/cpp/tutorial_code/objectDetection/detect_markers.cpp
**Change Type:** added
**Context:** PR #23018: Move Aruco tutorials and samples to main repo

**Code Changes:**
```diff
@@ -0,0 +1,177 @@
+#include <opencv2/highgui.hpp>
+#include <opencv2/objdetect/aruco_detector.hpp>
+#include <iostream>
+#include "aruco_samples_utility.hpp"
+
+using namespace std;
+using namespace cv;
+
+namespace {
```

Review comment:
Please use named constant for dictionary.
**File:** doc/tutorials/objdetect/aruco_board_detection/aruco_board_detection.markdown
**Change Type:** added
**Context:** PR #23018: Move Aruco tutorials and samples to main repo

**Code Changes:**
```diff
@@ -0,0 +1,201 @@
+Detection of ArUco boards {#tutorial_aruco_board_detection}
+=========================
+
+@prev_tutorial{tutorial_aruco_detection}
+
+|    |    |
+| -: | :- |
+| Original authors | Sergio Garrido, Alexander Panov |
+| Compatibility    | OpenCV >= 4.7.0 |
```

Review comment:
need to use: solvePnP() or \`solvePnP()\` I suggest to use \`solvePnP()\` to improve `.markdown` readability: ![image](https://github.com/opencv/opencv/assets/22337800/e4464af0-9213-4bce-8da5-6490ae94208b)
**File:** doc/tutorials/objdetect/aruco_board_detection/aruco_board_detection.markdown
**Change Type:** added
**Context:** PR #23018: Move Aruco tutorials and samples to main repo

**Code Changes:**
```diff
@@ -0,0 +1,201 @@
+Detection of ArUco boards {#tutorial_aruco_board_detection}
+=========================
+
+@prev_tutorial{tutorial_aruco_detection}
+
+|    |    |
+| -: | :- |
+| Original authors | Sergio Garrido, Alexander Panov |
+| Compatibility    | OpenCV >= 4.7.0 |
```

Review comment:
need to use drawFrameAxes() or \`drawFrameAxes()\` fixed to \`drawFrameAxes()\`
**File:** doc/tutorials/objdetect/aruco_board_detection/aruco_board_detection.markdown
**Change Type:** added
**Context:** PR #23018: Move Aruco tutorials and samples to main repo

**Code Changes:**
```diff
@@ -0,0 +1,201 @@
+Detection of ArUco boards {#tutorial_aruco_board_detection}
+=========================
+
+@prev_tutorial{tutorial_aruco_detection}
+
+|    |    |
+| -: | :- |
+| Original authors | Sergio Garrido, Alexander Panov |
+| Compatibility    | OpenCV >= 4.7.0 |
```

Review comment:
added \`cv::aruco::Board\`
**File:** doc/tutorials/objdetect/aruco_board_detection/aruco_board_detection.markdown
**Change Type:** added
**Context:** PR #23018: Move Aruco tutorials and samples to main repo

**Code Changes:**
```diff
@@ -0,0 +1,201 @@
+Detection of ArUco boards {#tutorial_aruco_board_detection}
+=========================
+
+@prev_tutorial{tutorial_aruco_detection}
+
+|    |    |
+| -: | :- |
+| Original authors | Sergio Garrido, Alexander Panov |
+| Compatibility    | OpenCV >= 4.7.0 |
```

Review comment:
fixed: ![image](https://github.com/opencv/opencv/assets/22337800/51ffc26e-ee25-463a-8230-c84186ea8459)
**File:** doc/tutorials/objdetect/aruco_board_detection/aruco_board_detection.markdown
**Change Type:** added
**Context:** PR #23018: Move Aruco tutorials and samples to main repo

**Code Changes:**
```diff
@@ -0,0 +1,201 @@
+Detection of ArUco boards {#tutorial_aruco_board_detection}
+=========================
+
+@prev_tutorial{tutorial_aruco_detection}
+
+|    |    |
+| -: | :- |
+| Original authors | Sergio Garrido, Alexander Panov |
+| Compatibility    | OpenCV >= 4.7.0 |
```

Review comment:
![image](https://github.com/opencv/opencv/assets/22337800/a35de443-b6eb-4f87-a59e-92ce0a7e4af0)
**File:** doc/tutorials/objdetect/aruco_board_detection/aruco_board_detection.markdown
**Change Type:** added
**Context:** PR #23018: Move Aruco tutorials and samples to main repo

**Code Changes:**
```diff
@@ -0,0 +1,201 @@
+Detection of ArUco boards {#tutorial_aruco_board_detection}
+=========================
+
+@prev_tutorial{tutorial_aruco_detection}
+
+|    |    |
+| -: | :- |
+| Original authors | Sergio Garrido, Alexander Panov |
+| Compatibility    | OpenCV >= 4.7.0 |
```

Review comment:
What does it mean? I propose to replace images, if drown axis are do not correspond to modern OpenCV behaviour.
**File:** doc/tutorials/objdetect/aruco_board_detection/aruco_board_detection.markdown
**Change Type:** added
**Context:** PR #23018: Move Aruco tutorials and samples to main repo

**Code Changes:**
```diff
@@ -0,0 +1,201 @@
+Detection of ArUco boards {#tutorial_aruco_board_detection}
+=========================
+
+@prev_tutorial{tutorial_aruco_detection}
+
+|    |    |
+| -: | :- |
+| Original authors | Sergio Garrido, Alexander Panov |
+| Compatibility    | OpenCV >= 4.7.0 |
```

Review comment:
I propose to recommend `doc/patter_tools/gen_pattern.py`. As it generates pattern with predictable geometry that is not corrupted with resize or printing scale.