nareshmlx/opencv-pr huggingface dataset:
**File:** modules/calib/test/test_calibration_hand_eye.cpp
**Change Type:** modified
**Context:** PR #23189: (5.x) Merge 4.x - #16189 from mshabunin:enable-two-channels #23025 from savuor:backport3_stddev_calib_fix #23047 from fengyuentau:layer_nor...
**Review Line:** 431

**Code Changes:**
```diff
-        eps_tvec_noise[CALIB_HAND_EYE_TSAI] = 5.0e-2;
-        eps_tvec_noise[CALIB_HAND_EYE_PARK] = 5.0e-2;
-        eps_tvec_noise[CALIB_HAND_EYE_HORAUD] = 5.0e-2;
+        eps_tvec_noise[CALIB_HAND_EYE_TSAI] = 7.0e-2;
+        eps_tvec_noise[CALIB_HAND_EYE_PARK] = 7.0e-2;
+        eps_tvec_noise[CALIB_HAND_EYE_HORAUD] = 7.0e-2;
         if (eyeToHandConfig)
         {
             eps_tvec_noise[CALIB_HAND_EYE_ANDREFF] = 7.0e-2;
@@ -453,7 +453,7 @@ void CV_CalibrateHandEyeTest::run(int)
 {
```

Review comment:
It is changed for 4.x branch in #23167. Failure message e.g. here: https://pullrequest.opencv.org/buildbot/builders/precommit_linux64/builds/102499/steps/test_calib3d/logs/stdio There are many failures of unreliable tests after "fixing" of RNG behavior. Need to drop unstable `get_rng()` call completely.
**File:** modules/calib/src/fisheye.cpp
**Change Type:** modified
**Context:** PR #23178: Fisheye calibration: uncertainty fixed
**Review Line:** 1581

**Code Changes:**
```diff
 
+    int nParams = JJ2.rows;
+    // an explanation of that denominator correction can be found here:
+    // R. Hartley, A. Zisserman, Multiple View Geometry in Computer Vision, 2004, section 5.1.3, page 134
+    // see the discussion for more details: https://github.com/opencv/opencv/pull/22992
+    sigma_x  *= sqrt(2.0 * (double)ex.total()/(2.0 * (double)ex.total() - nParams));
+
     errors = 3 * sigma_x(0) * JJ2.diag();
     rms = sqrt(norm(ex, NORM_L2SQR)/ex.total());
 }
```

Review comment:
it makes sense to add reference to MVG book too.
**File:** modules/ts/include/opencv2/ts.hpp
**Change Type:** modified
**Context:** PR #23203: Supress tones of -Wdeprecated-copy warnings

**Code Changes:**
```diff
@@ -123,6 +123,9 @@
 //#pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wsuggest-override"
 #endif
+#if defined(__OPENCV_BUILD) && defined(__APPLE__) && defined(__clang__) && ((__clang_major__*100 + __clang_minor__) >= 1301)
+#pragma clang diagnostic ignored "-Wdeprecated-copy"
+#endif
 #include "opencv2/ts/ts_gtest.h"
 #if defined(__OPENCV_BUILD) && defined(__GNUC__) && __GNUC__ >= 5
 //#pragma GCC diagnostic pop
```

Review comment:
We should have here also: - `__APPLE__` - and compiler version check Use this to check available macros: https://stackoverflow.com/questions/2224334/gcc-dump-preprocessor-defines BTW, there is gtest patch for that (but it is large): https://github.com/google/googletest/pull/2815 --- Keep code consistent and use `__OPENCV_BUILD` guard.
**File:** modules/gapi/cmake/DownloadADE.cmake
**Change Type:** modified
**Context:** PR #23203: Supress tones of -Wdeprecated-copy warnings

**Code Changes:**
```diff
@@ -24,6 +24,12 @@ add_library(ade STATIC ${OPENCV_3RDPARTY_EXCLUDE_FROM_ALL}
     ${ADE_include}
     ${ADE_sources}
 )
+
+# https://github.com/opencv/ade/issues/32
+if(CV_CLANG AND CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 13.1)
+  ocv_warnings_disable(CMAKE_CXX_FLAGS -Wdeprecated-copy)
+endif()
+
```

Review comment:
Indentation is 2 spaces in CMake files: https://github.com/opencv/opencv/blob/4.7.0/.editorconfig#L15
**File:** modules/calib3d/src/solvepnp.cpp
**Change Type:** modified
**Context:** PR #22914: Bugfix for solvePnPRansac with SOLVEPNP_ITERATIVE
**Review Line:** 317

**Code Changes:**
```diff
@@ -313,7 +314,13 @@ bool solvePnPRansac(InputArray _opoints, InputArray _ipoints,
     ipoints_inliers.resize(npoints1);
     try
     {
-        result = solvePnP(opoints_inliers, ipoints_inliers, cameraMatrix,
+       if (flags == SOLVEPNP_ITERATIVE && !useExtrinsicGuess)
+       {
+          rvec = _local_model.col(0).clone();
+          tvec = _local_model.col(1).clone();
+          useExtrinsicGuess = true;
+       }
```

Review comment:
Do we need this condition ? Shouldn't that be for all methods ? Thx
**File:** modules/calib3d/src/solvepnp.cpp
**Change Type:** modified
**Context:** PR #22914: Bugfix for solvePnPRansac with SOLVEPNP_ITERATIVE
**Review Line:** 317

**Code Changes:**
```diff
@@ -313,7 +314,13 @@ bool solvePnPRansac(InputArray _opoints, InputArray _ipoints,
     ipoints_inliers.resize(npoints1);
     try
     {
-        result = solvePnP(opoints_inliers, ipoints_inliers, cameraMatrix,
+       if (flags == SOLVEPNP_ITERATIVE && !useExtrinsicGuess)
+       {
+          rvec = _local_model.col(0).clone();
+          tvec = _local_model.col(1).clone();
+          useExtrinsicGuess = true;
+       }
```

Review comment:
I think the issue only occurs for`SOLVEPNP_ITERATIVE` because AFAIK the other methods do not use extrinsic guess which was overwritten in each RANSAC iteration
**File:** modules/ts/src/ts.cpp
**Change Type:** modified
**Context:** PR #16189: Enable 2-channel arrays in resize tests
**Review Line:** 624

**Code Changes:**
```diff
@@ -621,20 +621,27 @@ void TS::set_gtest_status()
 
 void TS::update_context( BaseTest* test, int test_case_idx, bool update_ts_context )
 {
+    CV_UNUSED(update_ts_context);
+
     if( current_test_info.test != test )
     {
         for( int i = 0; i <= CONSOLE_IDX; i++ )
             output_buf[i] = string();
```

Review comment:
These changes are used to have reproducible initial RNG seed (independent and different for each test_case_idx of the legacy test system). RNG seeds are changed by this modification, so some tests are started to fail. This is the question to the testing code and performed checks.
**File:** modules/features2d/include/opencv2/features2d.hpp
**Change Type:** modified
**Context:** PR #21942: added blob contours to blob detector

**Code Changes:**
```diff
@@ -107,6 +107,10 @@ class CV_EXPORTS KeyPointsFilter
      * Remove keypoints from some image by mask for pixels of this image.
      */
     static void runByPixelsMask( std::vector<KeyPoint>& keypoints, const Mat& mask );
+    /*
+     * Remove objects from some image and a vector of points by mask for pixels of this image
+     */
+    static void runByPixelsMask2VectorPoint(std::vector<KeyPoint> &keypoints, std::vector<std::vector<Point> > &removeFrom, const Mat &mask);
     /*
      * Remove duplicated keypoints.
```

Review comment:
shouldn't we include collectContours into SimpleBlobDetector::Params?
**File:** modules/features2d/include/opencv2/features2d.hpp
**Change Type:** modified
**Context:** PR #21942: added blob contours to blob detector

**Code Changes:**
```diff
@@ -107,6 +107,10 @@ class CV_EXPORTS KeyPointsFilter
      * Remove keypoints from some image by mask for pixels of this image.
      */
     static void runByPixelsMask( std::vector<KeyPoint>& keypoints, const Mat& mask );
+    /*
+     * Remove objects from some image and a vector of points by mask for pixels of this image
+     */
+    static void runByPixelsMask2VectorPoint(std::vector<KeyPoint> &keypoints, std::vector<std::vector<Point> > &removeFrom, const Mat &mask);
     /*
      * Remove duplicated keypoints.
```

Review comment:
i thought of `params` as a descriptor for which blobs should be detected, and `collectContours` as a modifier for the process itself. i think it's ok to include it into `params`, made changes.
**File:** modules/features2d/include/opencv2/features2d.hpp
**Change Type:** modified
**Context:** PR #21942: added blob contours to blob detector

**Code Changes:**
```diff
@@ -107,6 +107,10 @@ class CV_EXPORTS KeyPointsFilter
      * Remove keypoints from some image by mask for pixels of this image.
      */
     static void runByPixelsMask( std::vector<KeyPoint>& keypoints, const Mat& mask );
+    /*
+     * Remove objects from some image and a vector of points by mask for pixels of this image
+     */
+    static void runByPixelsMask2VectorPoint(std::vector<KeyPoint> &keypoints, std::vector<std::vector<Point> > &removeFrom, const Mat &mask);
     /*
      * Remove duplicated keypoints.
```

Review comment:
exposing template function API without providing implementation in the header is a bug. Can we move this function into .cpp completely?
**File:** modules/features2d/include/opencv2/features2d.hpp
**Change Type:** modified
**Context:** PR #21942: added blob contours to blob detector

**Code Changes:**
```diff
@@ -107,6 +107,10 @@ class CV_EXPORTS KeyPointsFilter
      * Remove keypoints from some image by mask for pixels of this image.
      */
     static void runByPixelsMask( std::vector<KeyPoint>& keypoints, const Mat& mask );
+    /*
+     * Remove objects from some image and a vector of points by mask for pixels of this image
+     */
+    static void runByPixelsMask2VectorPoint(std::vector<KeyPoint> &keypoints, std::vector<std::vector<Point> > &removeFrom, const Mat &mask);
     /*
      * Remove duplicated keypoints.
```

Review comment:
This function is used in `blobdetector.cpp`, so shouldn't it be declared in an `hpp` file?
**File:** modules/features2d/include/opencv2/features2d.hpp
**Change Type:** modified
**Context:** PR #21942: added blob contours to blob detector

**Code Changes:**
```diff
@@ -107,6 +107,10 @@ class CV_EXPORTS KeyPointsFilter
      * Remove keypoints from some image by mask for pixels of this image.
      */
     static void runByPixelsMask( std::vector<KeyPoint>& keypoints, const Mat& mask );
+    /*
+     * Remove objects from some image and a vector of points by mask for pixels of this image
+     */
+    static void runByPixelsMask2VectorPoint(std::vector<KeyPoint> &keypoints, std::vector<std::vector<Point> > &removeFrom, const Mat &mask);
     /*
      * Remove duplicated keypoints.
```

Review comment:
Made changes to use non-templated function in header.
**File:** modules/features2d/include/opencv2/features2d.hpp
**Change Type:** modified
**Context:** PR #21942: added blob contours to blob detector

**Code Changes:**
```diff
@@ -107,6 +107,10 @@ class CV_EXPORTS KeyPointsFilter
      * Remove keypoints from some image by mask for pixels of this image.
      */
     static void runByPixelsMask( std::vector<KeyPoint>& keypoints, const Mat& mask );
+    /*
+     * Remove objects from some image and a vector of points by mask for pixels of this image
+     */
+    static void runByPixelsMask2VectorPoint(std::vector<KeyPoint> &keypoints, std::vector<std::vector<Point> > &removeFrom, const Mat &mask);
     /*
      * Remove duplicated keypoints.
```

Review comment:
"Source API" compatibility doesn't allow to add new virtual **pure** methods. Do we really want to violate that and bypass checker? --- - 4.x: implementation with `CV_Error(not implemented)` should be used instead. - 5.x: pure method patch should be used
**File:** modules/features2d/misc/java/test/SIMPLEBLOBFeatureDetectorTest.java
**Change Type:** modified
**Context:** PR #21942: added blob contours to blob detector
**Review Line:** 116

**Code Changes:**
```diff
 
         detector.write(filename);
 
-        String truth = "<?xml version=\"1.0\"?>\n<opencv_storage>\n<format>3</format>\n<thresholdStep>10.</thresholdStep>\n<minThreshold>50.</minThreshold>\n<maxThreshold>220.</maxThreshold>\n<minRepeatability>2</minRepeatability>\n<minDistBetweenBlobs>10.</minDistBetweenBlobs>\n<filterByColor>1</filterByColor>\n<blobColor>0</blobColor>\n<filterByArea>1</filterByArea>\n<minArea>25.</minArea>\n<maxArea>5000.</maxArea>\n<filterByCircularity>0</filterByCircularity>\n<minCircularity>8.0000001192092896e-01</minCircularity>\n<maxCircularity>3.4028234663852886e+38</maxCircularity>\n<filterByInertia>1</filterByInertia>\n<minInertiaRatio>1.0000000149011612e-01</minInertiaRatio>\n<maxInertiaRatio>3.4028234663852886e+38</maxInertiaRatio>\n<filterByConvexity>1</filterByConvexity>\n<minConvexity>9.4999998807907104e-01</minConvexity>\n<maxConvexity>3.4028234663852886e+38</maxConvexity>\n</opencv_storage>\n";
+        String truth = "<?xml version=\"1.0\"?>\n<opencv_storage>\n<format>3</format>\n<thresholdStep>10.</thresholdStep>\n<minThreshold>50.</minThreshold>\n<maxThreshold>220.</maxThreshold>\n<minRepeatability>2</minRepeatability>\n<minDistBetweenBlobs>10.</minDistBetweenBlobs>\n<filterByColor>1</filterByColor>\n<blobColor>0</blobColor>\n<filterByArea>1</filterByArea>\n<minArea>25.</minArea>\n<maxArea>5000.</maxArea>\n<filterByCircularity>0</filterByCircularity>\n<minCircularity>8.0000001192092896e-01</minCircularity>\n<maxCircularity>3.4028234663852886e+38</maxCircularity>\n<filterByInertia>1</filterByInertia>\n<minInertiaRatio>1.0000000149011612e-01</minInertiaRatio>\n<maxInertiaRatio>3.4028234663852886e+38</maxInertiaRatio>\n<filterByConvexity>1</filterByConvexity>\n<minConvexity>9.4999998807907104e-01</minConvexity>\n<maxConvexity>3.4028234663852886e+38</maxConvexity>\n<collectContours>0</collectContours>\n</opencv_storage>\n";
         assertEquals(truth, readFile(filename));
     }
 }
```

Review comment:
Why do we need to patch **existed** tests? Does this patch change behavior of OpenCV? --- In general we should add new test for new behavior instead of changing an existing.
**File:** modules/features2d/include/opencv2/features2d.hpp
**Change Type:** modified
**Context:** PR #21942: added blob contours to blob detector

**Code Changes:**
```diff
@@ -107,6 +107,10 @@ class CV_EXPORTS KeyPointsFilter
      * Remove keypoints from some image by mask for pixels of this image.
      */
     static void runByPixelsMask( std::vector<KeyPoint>& keypoints, const Mat& mask );
+    /*
+     * Remove objects from some image and a vector of points by mask for pixels of this image
+     */
+    static void runByPixelsMask2VectorPoint(std::vector<KeyPoint> &keypoints, std::vector<std::vector<Point> > &removeFrom, const Mat &mask);
     /*
      * Remove duplicated keypoints.
```

Review comment:
I initially wanted to merged this into master, not a particular release. Do you think it makes sense to have two PRs for both branches?
**File:** modules/features2d/misc/java/test/SIMPLEBLOBFeatureDetectorTest.java
**Change Type:** modified
**Context:** PR #21942: added blob contours to blob detector
**Review Line:** 116

**Code Changes:**
```diff
 
         detector.write(filename);
 
-        String truth = "<?xml version=\"1.0\"?>\n<opencv_storage>\n<format>3</format>\n<thresholdStep>10.</thresholdStep>\n<minThreshold>50.</minThreshold>\n<maxThreshold>220.</maxThreshold>\n<minRepeatability>2</minRepeatability>\n<minDistBetweenBlobs>10.</minDistBetweenBlobs>\n<filterByColor>1</filterByColor>\n<blobColor>0</blobColor>\n<filterByArea>1</filterByArea>\n<minArea>25.</minArea>\n<maxArea>5000.</maxArea>\n<filterByCircularity>0</filterByCircularity>\n<minCircularity>8.0000001192092896e-01</minCircularity>\n<maxCircularity>3.4028234663852886e+38</maxCircularity>\n<filterByInertia>1</filterByInertia>\n<minInertiaRatio>1.0000000149011612e-01</minInertiaRatio>\n<maxInertiaRatio>3.4028234663852886e+38</maxInertiaRatio>\n<filterByConvexity>1</filterByConvexity>\n<minConvexity>9.4999998807907104e-01</minConvexity>\n<maxConvexity>3.4028234663852886e+38</maxConvexity>\n</opencv_storage>\n";
+        String truth = "<?xml version=\"1.0\"?>\n<opencv_storage>\n<format>3</format>\n<thresholdStep>10.</thresholdStep>\n<minThreshold>50.</minThreshold>\n<maxThreshold>220.</maxThreshold>\n<minRepeatability>2</minRepeatability>\n<minDistBetweenBlobs>10.</minDistBetweenBlobs>\n<filterByColor>1</filterByColor>\n<blobColor>0</blobColor>\n<filterByArea>1</filterByArea>\n<minArea>25.</minArea>\n<maxArea>5000.</maxArea>\n<filterByCircularity>0</filterByCircularity>\n<minCircularity>8.0000001192092896e-01</minCircularity>\n<maxCircularity>3.4028234663852886e+38</maxCircularity>\n<filterByInertia>1</filterByInertia>\n<minInertiaRatio>1.0000000149011612e-01</minInertiaRatio>\n<maxInertiaRatio>3.4028234663852886e+38</maxInertiaRatio>\n<filterByConvexity>1</filterByConvexity>\n<minConvexity>9.4999998807907104e-01</minConvexity>\n<maxConvexity>3.4028234663852886e+38</maxConvexity>\n<collectContours>0</collectContours>\n</opencv_storage>\n";
         assertEquals(truth, readFile(filename));
     }
 }
```

Review comment:
The patch adds one more item to algorithm parameters and also extends functions that dump settings to file and load them (cv::Algorithm logic). Java test is not smart enough and just checks dumped XML file content as a string. So the changes are legitimate.
**File:** modules/highgui/src/plugin_wrapper.impl.hpp
**Change Type:** modified
**Context:** PR #22160: make imgcodecs optional for highgui

**Code Changes:**
```diff
@@ -235,12 +235,15 @@ std::vector<FileSystemPath_t> getPluginCandidates(const std::string& baseName)
     return results;
 }
 
-// NB: require loading of imgcodecs module
+#ifdef HAVE_OPENCV_IMGCODECS // NB: require loading of imgcodecs module
 static void* g_imwrite = (void*)imwrite;
+#endif
 
 void PluginUIBackendFactory::loadPlugin()
```

Review comment:
Please keep under `#ifdef` instead. BTW, Removal/disabling of this code requires `OPENCV_PLUGIN_NO_LINK=OFF` to force plugin linking to opencv binaries.
**File:** modules/highgui/src/window_w32.cpp
**Change Type:** modified
**Context:** PR #22160: make imgcodecs optional for highgui

**Code Changes:**
```diff
@@ -2132,6 +2132,7 @@ cvDestroyAllWindows(void)
 
 static void showSaveDialog(CvWindow& window)
 {
+#ifdef HAVE_OPENCV_IMGCODECS
     if (!window.image)
         return;
 
@@ -2193,6 +2194,11 @@ static void showSaveDialog(CvWindow& window)
         cv::flip(cv::Mat(sz.cy, sz.cx, CV_8UC(channels), data, (sz.cx * channels + 3) & -4), tmp, 0);
```

Review comment:
It makes sense to emit some `CV_LOG_WARNING()` for this case.
**File:** modules/imgcodecs/include/opencv2/imgcodecs.hpp
**Change Type:** modified
**Context:** PR #22128: [GSoC 2022] Multipage Image Decoder API

**Code Changes:**
```diff
@@ -332,6 +332,51 @@ CV_EXPORTS_W bool haveImageReader( const String& filename );
  */
 CV_EXPORTS_W bool haveImageWriter( const String& filename );
 
+/** @brief To read Multi Page images on demand
+
+The ImageCollection class provides iterator API to read multi page images on demand. Create iterator
+to the collection of the images and iterate over the collection. Decode the necessary page with operator*.
+
+The performance of page decoding is O(1) if collection is increment sequentially. If the user wants to access random page,
```

Review comment:
do we need this `#include` in public header?
**File:** modules/imgcodecs/include/opencv2/imgcodecs.hpp
**Change Type:** modified
**Context:** PR #22128: [GSoC 2022] Multipage Image Decoder API

**Code Changes:**
```diff
@@ -332,6 +332,51 @@ CV_EXPORTS_W bool haveImageReader( const String& filename );
  */
 CV_EXPORTS_W bool haveImageWriter( const String& filename );
 
+/** @brief To read Multi Page images on demand
+
+The ImageCollection class provides iterator API to read multi page images on demand. Create iterator
+to the collection of the images and iterate over the collection. Decode the necessary page with operator*.
+
+The performance of page decoding is O(1) if collection is increment sequentially. If the user wants to access random page,
```

Review comment:
please, use 'pimpl'. Hide everything non-public in a dedicated impl class
**File:** modules/imgcodecs/include/opencv2/imgcodecs.hpp
**Change Type:** modified
**Context:** PR #22128: [GSoC 2022] Multipage Image Decoder API

**Code Changes:**
```diff
@@ -332,6 +332,51 @@ CV_EXPORTS_W bool haveImageReader( const String& filename );
  */
 CV_EXPORTS_W bool haveImageWriter( const String& filename );
 
+/** @brief To read Multi Page images on demand
+
+The ImageCollection class provides iterator API to read multi page images on demand. Create iterator
+to the collection of the images and iterate over the collection. Decode the necessary page with operator*.
+
+The performance of page decoding is O(1) if collection is increment sequentially. If the user wants to access random page,
```

Review comment:
private constructors is terrible C++ invention. Please, don't use it. If user wants `std::vector<ImageCollection> many_collections(1000);`, he should be able to do that. I don't see why in this case the constructor cannot play role of `fromMultiPageImage`?
**File:** modules/imgcodecs/include/opencv2/imgcodecs.hpp
**Change Type:** modified
**Context:** PR #22128: [GSoC 2022] Multipage Image Decoder API

**Code Changes:**
```diff
@@ -332,6 +332,51 @@ CV_EXPORTS_W bool haveImageReader( const String& filename );
  */
 CV_EXPORTS_W bool haveImageWriter( const String& filename );
 
+/** @brief To read Multi Page images on demand
+
+The ImageCollection class provides iterator API to read multi page images on demand. Create iterator
+to the collection of the images and iterate over the collection. Decode the necessary page with operator*.
+
+The performance of page decoding is O(1) if collection is increment sequentially. If the user wants to access random page,
```

Review comment:
do we need forward declaration here?
**File:** modules/imgcodecs/include/opencv2/imgcodecs.hpp
**Change Type:** modified
**Context:** PR #22128: [GSoC 2022] Multipage Image Decoder API

**Code Changes:**
```diff
@@ -332,6 +332,51 @@ CV_EXPORTS_W bool haveImageReader( const String& filename );
  */
 CV_EXPORTS_W bool haveImageWriter( const String& filename );
 
+/** @brief To read Multi Page images on demand
+
+The ImageCollection class provides iterator API to read multi page images on demand. Create iterator
+to the collection of the images and iterate over the collection. Decode the necessary page with operator*.
+
+The performance of page decoding is O(1) if collection is increment sequentially. If the user wants to access random page,
```

Review comment:
`nimages()` => `size()` to make it more STL-like?
**File:** modules/imgcodecs/include/opencv2/imgcodecs.hpp
**Change Type:** modified
**Context:** PR #22128: [GSoC 2022] Multipage Image Decoder API

**Code Changes:**
```diff
@@ -332,6 +332,51 @@ CV_EXPORTS_W bool haveImageReader( const String& filename );
  */
 CV_EXPORTS_W bool haveImageWriter( const String& filename );
 
+/** @brief To read Multi Page images on demand
+
+The ImageCollection class provides iterator API to read multi page images on demand. Create iterator
+to the collection of the images and iterate over the collection. Decode the necessary page with operator*.
+
+The performance of page decoding is O(1) if collection is increment sequentially. If the user wants to access random page,
```

Review comment:
does not just release the image at `index` or it also shifts all the subsequent images so that the sequence of images is still contiguous? If the latter, can we use another STL-like name (erase?)
**File:** modules/imgcodecs/include/opencv2/imgcodecs.hpp
**Change Type:** modified
**Context:** PR #22128: [GSoC 2022] Multipage Image Decoder API

**Code Changes:**
```diff
@@ -332,6 +332,51 @@ CV_EXPORTS_W bool haveImageReader( const String& filename );
  */
 CV_EXPORTS_W bool haveImageWriter( const String& filename );
 
+/** @brief To read Multi Page images on demand
+
+The ImageCollection class provides iterator API to read multi page images on demand. Create iterator
+to the collection of the images and iterate over the collection. Decode the necessary page with operator*.
+
+The performance of page decoding is O(1) if collection is increment sequentially. If the user wants to access random page,
```

Review comment:
Please, hide the implementation details as well. Let's keep the headers as clean as possible
**File:** modules/imgcodecs/include/opencv2/imgcodecs.hpp
**Change Type:** modified
**Context:** PR #22128: [GSoC 2022] Multipage Image Decoder API

**Code Changes:**
```diff
@@ -332,6 +332,51 @@ CV_EXPORTS_W bool haveImageReader( const String& filename );
  */
 CV_EXPORTS_W bool haveImageWriter( const String& filename );
 
+/** @brief To read Multi Page images on demand
+
+The ImageCollection class provides iterator API to read multi page images on demand. Create iterator
+to the collection of the images and iterate over the collection. Decode the necessary page with operator*.
+
+The performance of page decoding is O(1) if collection is increment sequentially. If the user wants to access random page,
```

Review comment:
please remove CV_WRAP for now.