nareshmlx/opencv-pr huggingface dataset:
**File:** modules/core/src/hal_replacement.hpp
**Change Type:** modified
**Context:** PR #25506: HAL mul8x8to16 added

**Code Changes:**
```diff
@@ -324,6 +324,8 @@ inline int hal_ni_mul16s(const short *src1_data, size_t src1_step, const short *
 inline int hal_ni_mul32s(const int *src1_data, size_t src1_step, const int *src2_data, size_t src2_step, int *dst_data, size_t dst_step, int width, int height, double scale) { return CV_HAL_ERROR_NOT_IMPLEMENTED; }
 inline int hal_ni_mul32f(const float *src1_data, size_t src1_step, const float *src2_data, size_t src2_step, float *dst_data, size_t dst_step, int width, int height, double scale) { return CV_HAL_ERROR_NOT_IMPLEMENTED; }
 inline int hal_ni_mul64f(const double *src1_data, size_t src1_step, const double *src2_data, size_t src2_step, double *dst_data, size_t dst_step, int width, int height, double scale) { return CV_HAL_ERROR_NOT_IMPLEMENTED; }
+inline int hal_ni_mul8u16u(const uchar* src1_data, size_t src1_step, const uchar* src2_data, size_t src2_step, ushort* dst_data, size_t dst_step, int width, int height, double scale) { return CV_HAL_ERROR_NOT_IMPLEMENTED; }
+inline int hal_ni_mul8s16s(const schar* src1_data, size_t src1_step, const schar* src2_data, size_t src2_step, short* dst_data, size_t dst_step, int width, int height, double scale) { return CV_HAL_ERROR_NOT_IMPLEMENTED; }
 //! @}
 
 /**
@@ -378,6 +380,8 @@ inline int hal_ni_recip64f(const double *src_data, size_t src_step, double *dst_
```

Review comment:
usually, IPP and other libs use notation like 8u16u to describe the situation when input and output types are different. Can we avoid `Extend` in the name and use `8u16u` suffix? **Alternative proposal:** since this is new functionality (mixed-type inputs and outputs), may we try the new approach for generic mul functions: ``` typedef void (*hal_mul_t)(const uchar* src1_data, size_t src1_step, const uchar* src2_data, size_t src2_step, uchar* dst_data, size_t dst_step, int width, int height, double scale); hal_mul_t hal_get_mul_func(int src1_depth, int src2_depth, int dst_depth); ``` ? this function will let us to cover these 2 and potentially many other mul flavors without quadratic expansion of the number of functions.
**File:** modules/core/src/hal_replacement.hpp
**Change Type:** modified
**Context:** PR #25506: HAL mul8x8to16 added

**Code Changes:**
```diff
@@ -324,6 +324,8 @@ inline int hal_ni_mul16s(const short *src1_data, size_t src1_step, const short *
 inline int hal_ni_mul32s(const int *src1_data, size_t src1_step, const int *src2_data, size_t src2_step, int *dst_data, size_t dst_step, int width, int height, double scale) { return CV_HAL_ERROR_NOT_IMPLEMENTED; }
 inline int hal_ni_mul32f(const float *src1_data, size_t src1_step, const float *src2_data, size_t src2_step, float *dst_data, size_t dst_step, int width, int height, double scale) { return CV_HAL_ERROR_NOT_IMPLEMENTED; }
 inline int hal_ni_mul64f(const double *src1_data, size_t src1_step, const double *src2_data, size_t src2_step, double *dst_data, size_t dst_step, int width, int height, double scale) { return CV_HAL_ERROR_NOT_IMPLEMENTED; }
+inline int hal_ni_mul8u16u(const uchar* src1_data, size_t src1_step, const uchar* src2_data, size_t src2_step, ushort* dst_data, size_t dst_step, int width, int height, double scale) { return CV_HAL_ERROR_NOT_IMPLEMENTED; }
+inline int hal_ni_mul8s16s(const schar* src1_data, size_t src1_step, const schar* src2_data, size_t src2_step, short* dst_data, size_t dst_step, int width, int height, double scale) { return CV_HAL_ERROR_NOT_IMPLEMENTED; }
 //! @}
 
 /**
@@ -378,6 +380,8 @@ inline int hal_ni_recip64f(const double *src_data, size_t src_step, double *dst_
```

Review comment:
I vote for 8u16u. Agreed with Vadim's concern, but it requires significant internals redesign and HAL API redesign.
**File:** modules/core/src/hal_replacement.hpp
**Change Type:** modified
**Context:** PR #25506: HAL mul8x8to16 added

**Code Changes:**
```diff
@@ -324,6 +324,8 @@ inline int hal_ni_mul16s(const short *src1_data, size_t src1_step, const short *
 inline int hal_ni_mul32s(const int *src1_data, size_t src1_step, const int *src2_data, size_t src2_step, int *dst_data, size_t dst_step, int width, int height, double scale) { return CV_HAL_ERROR_NOT_IMPLEMENTED; }
 inline int hal_ni_mul32f(const float *src1_data, size_t src1_step, const float *src2_data, size_t src2_step, float *dst_data, size_t dst_step, int width, int height, double scale) { return CV_HAL_ERROR_NOT_IMPLEMENTED; }
 inline int hal_ni_mul64f(const double *src1_data, size_t src1_step, const double *src2_data, size_t src2_step, double *dst_data, size_t dst_step, int width, int height, double scale) { return CV_HAL_ERROR_NOT_IMPLEMENTED; }
+inline int hal_ni_mul8u16u(const uchar* src1_data, size_t src1_step, const uchar* src2_data, size_t src2_step, ushort* dst_data, size_t dst_step, int width, int height, double scale) { return CV_HAL_ERROR_NOT_IMPLEMENTED; }
+inline int hal_ni_mul8s16s(const schar* src1_data, size_t src1_step, const schar* src2_data, size_t src2_step, short* dst_data, size_t dst_step, int width, int height, double scale) { return CV_HAL_ERROR_NOT_IMPLEMENTED; }
 //! @}
 
 /**
@@ -378,6 +380,8 @@ inline int hal_ni_recip64f(const double *src_data, size_t src_step, double *dst_
```

Review comment:
Applied the comment to PR.
**File:** modules/core/src/arithm.cpp
**Change Type:** modified
**Context:** PR #25506: HAL mul8x8to16 added

**Code Changes:**
```diff
@@ -585,9 +585,14 @@ static bool ocl_arithm_op(InputArray _src1, InputArray _src2, OutputArray _dst,
 
 #endif
 
+typedef int (*ExtendedTypeFunc)(const uchar* src1, size_t step1,
+                                const uchar* src2, size_t step2,
+                                uchar* dst, size_t step, int width, int height,
+                                void*);
+
 static void arithm_op(InputArray _src1, InputArray _src2, OutputArray _dst,
```

Review comment:
The HAL function may return not implemented status, if size is to small or data is not aligned. Static pre-check does not work.
**File:** modules/core/src/arithm.cpp
**Change Type:** modified
**Context:** PR #25506: HAL mul8x8to16 added

**Code Changes:**
```diff
@@ -585,9 +585,14 @@ static bool ocl_arithm_op(InputArray _src1, InputArray _src2, OutputArray _dst,
 
 #endif
 
+typedef int (*ExtendedTypeFunc)(const uchar* src1, size_t step1,
+                                const uchar* src2, size_t step2,
+                                uchar* dst, size_t step, int width, int height,
+                                void*);
+
 static void arithm_op(InputArray _src1, InputArray _src2, OutputArray _dst,
```

Review comment:
`cv_hal_mul8s16s` and `cv_hal_mul8u16u` return value is not checked. They may return error or not implemented status.
**File:** modules/core/src/arithm.cpp
**Change Type:** modified
**Context:** PR #25506: HAL mul8x8to16 added

**Code Changes:**
```diff
@@ -585,9 +585,14 @@ static bool ocl_arithm_op(InputArray _src1, InputArray _src2, OutputArray _dst,
 
 #endif
 
+typedef int (*ExtendedTypeFunc)(const uchar* src1, size_t step1,
+                                const uchar* src2, size_t step2,
+                                uchar* dst, size_t step, int width, int height,
+                                void*);
+
 static void arithm_op(InputArray _src1, InputArray _src2, OutputArray _dst,
```

Review comment:
What if HAL implements only one of them?
**File:** modules/core/src/arithm.cpp
**Change Type:** modified
**Context:** PR #25506: HAL mul8x8to16 added

**Code Changes:**
```diff
@@ -585,9 +585,14 @@ static bool ocl_arithm_op(InputArray _src1, InputArray _src2, OutputArray _dst,
 
 #endif
 
+typedef int (*ExtendedTypeFunc)(const uchar* src1, size_t step1,
+                                const uchar* src2, size_t step2,
+                                uchar* dst, size_t step, int width, int height,
+                                void*);
+
 static void arithm_op(InputArray _src1, InputArray _src2, OutputArray _dst,
```

Review comment:
`if (!extendedFunc || extendedFunc() != 0)`
**File:** modules/core/src/arithm.cpp
**Change Type:** modified
**Context:** PR #25506: HAL mul8x8to16 added

**Code Changes:**
```diff
@@ -585,9 +585,14 @@ static bool ocl_arithm_op(InputArray _src1, InputArray _src2, OutputArray _dst,
 
 #endif
 
+typedef int (*ExtendedTypeFunc)(const uchar* src1, size_t step1,
+                                const uchar* src2, size_t step2,
+                                uchar* dst, size_t step, int width, int height,
+                                void*);
+
 static void arithm_op(InputArray _src1, InputArray _src2, OutputArray _dst,
```

Review comment:
Use constant instead of 0.
**File:** modules/dnn/test/test_layers_1d.cpp
**Change Type:** modified
**Context:** PR #25595: Add support for scalar and matrix multiplication in einsum

**Code Changes:**
```diff
@@ -824,26 +824,27 @@ INSTANTIATE_TEST_CASE_P(/*nothing*/, Layer_Tile_Test,
         std::vector<int>({2, 2})
         ));
 
-typedef testing::TestWithParam<tuple<std::vector<int>, std::string>> Layer_Einsum_Test;
+typedef testing::TestWithParam<tuple<std::vector<int>, std::vector<int>, std::string>> Layer_Einsum_Test;
 TEST_P(Layer_Einsum_Test, Accuracy_01D)
 {
     auto tup = GetParam();
-    std::vector<int> input_shape = std::get<0>(tup);
```

Review comment:
```suggestion std::make_tuple(std::vector<int>({}), std::vector<int>({}), ",->"), std::make_tuple(std::vector<int>({1}), std::vector<int>({}), "i,->i"), std::make_tuple(std::vector<int>({}), std::vector<int>({1}), ",i->i"), std::make_tuple(std::vector<int>({4, 1}), std::vector<int>({}), "ij,->ij"), // std::make_tuple(std::vector<int>({}), std::vector<int>({4, 1}), ",ij->ij")), // mul function of arithm_op can not handle cases with different number of channels std::make_tuple(std::vector<int>({1}), std::vector<int>({1}), "i,i->i"), std::make_tuple(std::vector<int>({1}), std::vector<int>({1}), "i,i->"), std::make_tuple(std::vector<int>({4}), std::vector<int>({4}), "i,i->i"), std::make_tuple(std::vector<int>({4}), std::vector<int>({4}), "i,i->"), std::make_tuple(std::vector<int>({1, 4}), std::vector<int>({1, 4}), "ij,ij->ij"), std::make_tuple(std::vector<int>({4, 1}), std::vector<int>({4, 1}), "ij,ij->ij"), std::make_tuple(std::vector<int>({1, 4}), std::vector<int>({1, 4}), "ij,ij->i"), std::make_tuple(std::vector<int>({4, 1}), std::vector<int>({4, 1}), "ij,ij->i"), std::make_tuple(std::vector<int>({4, 4}), std::vector<int>({4, 4}), "ij,ij->i") ```
**File:** modules/objdetect/include/opencv2/objdetect/barcode.hpp
**Change Type:** modified
**Context:** PR #24903: Feature barcode detector parameters

**Code Changes:**
```diff
@@ -57,6 +57,52 @@ class CV_EXPORTS_W_SIMPLE BarcodeDetector : public cv::GraphicalCodeDetector
                                       CV_OUT std::vector<std::string> &decoded_info,
                                       CV_OUT std::vector<std::string> &decoded_type,
                                       OutputArray points = noArray()) const;
+
+    /** @brief Get detector downsampling threshold.
+     *
+     * @return detector downsampling threshold
+     */
+    CV_WRAP double getDownsamplingThreshold() const;
```

Review comment:
It should be in implementation, but not interface.
**File:** modules/objdetect/include/opencv2/objdetect/barcode.hpp
**Change Type:** modified
**Context:** PR #24903: Feature barcode detector parameters

**Code Changes:**
```diff
@@ -57,6 +57,52 @@ class CV_EXPORTS_W_SIMPLE BarcodeDetector : public cv::GraphicalCodeDetector
                                       CV_OUT std::vector<std::string> &decoded_info,
                                       CV_OUT std::vector<std::string> &decoded_type,
                                       OutputArray points = noArray()) const;
+
+    /** @brief Get detector downsampling threshold.
+     *
+     * @return detector downsampling threshold
+     */
+    CV_WRAP double getDownsamplingThreshold() const;
```

Review comment:
Fixed, thx
**File:** modules/objdetect/include/opencv2/objdetect/barcode.hpp
**Change Type:** modified
**Context:** PR #24903: Feature barcode detector parameters

**Code Changes:**
```diff
@@ -57,6 +57,52 @@ class CV_EXPORTS_W_SIMPLE BarcodeDetector : public cv::GraphicalCodeDetector
                                       CV_OUT std::vector<std::string> &decoded_info,
                                       CV_OUT std::vector<std::string> &decoded_type,
                                       OutputArray points = noArray()) const;
+
+    /** @brief Get detector downsampling threshold.
+     *
+     * @return detector downsampling threshold
+     */
+    CV_WRAP double getDownsamplingThreshold() const;
```

Review comment:
`return *this;` to allow chain of setters
**File:** modules/objdetect/include/opencv2/objdetect/barcode.hpp
**Change Type:** modified
**Context:** PR #24903: Feature barcode detector parameters

**Code Changes:**
```diff
@@ -57,6 +57,52 @@ class CV_EXPORTS_W_SIMPLE BarcodeDetector : public cv::GraphicalCodeDetector
                                       CV_OUT std::vector<std::string> &decoded_info,
                                       CV_OUT std::vector<std::string> &decoded_type,
                                       OutputArray points = noArray()) const;
+
+    /** @brief Get detector downsampling threshold.
+     *
+     * @return detector downsampling threshold
+     */
+    CV_WRAP double getDownsamplingThreshold() const;
```

Review comment:
In public API only "*Parameters" classes are allowed to have properly fields. Algorithms classes should have setters/getters in public API and properly fields in internal implementations.
**File:** modules/objdetect/include/opencv2/objdetect/barcode.hpp
**Change Type:** modified
**Context:** PR #24903: Feature barcode detector parameters

**Code Changes:**
```diff
@@ -57,6 +57,52 @@ class CV_EXPORTS_W_SIMPLE BarcodeDetector : public cv::GraphicalCodeDetector
                                       CV_OUT std::vector<std::string> &decoded_info,
                                       CV_OUT std::vector<std::string> &decoded_type,
                                       OutputArray points = noArray()) const;
+
+    /** @brief Get detector downsampling threshold.
+     *
+     * @return detector downsampling threshold
+     */
+    CV_WRAP double getDownsamplingThreshold() const;
```

Review comment:
For simple types `double getGradientThresh() const;` is better: - Type conversions in C++, if needed. - Automatic python/java/etc bindings. I propose to apply it for all methods, besides `getDetectorScales`. getDetectorScales operates with vector.
**File:** modules/objdetect/include/opencv2/objdetect/barcode.hpp
**Change Type:** modified
**Context:** PR #24903: Feature barcode detector parameters

**Code Changes:**
```diff
@@ -57,6 +57,52 @@ class CV_EXPORTS_W_SIMPLE BarcodeDetector : public cv::GraphicalCodeDetector
                                       CV_OUT std::vector<std::string> &decoded_info,
                                       CV_OUT std::vector<std::string> &decoded_type,
                                       OutputArray points = noArray()) const;
+
+    /** @brief Get detector downsampling threshold.
+     *
+     * @return detector downsampling threshold
+     */
+    CV_WRAP double getDownsamplingThreshold() const;
```

Review comment:
I suggest renaming to `getDownsamplingThresh` (similarly for set-method). "downsampling" is a single world.
**File:** modules/objdetect/include/opencv2/objdetect/barcode.hpp
**Change Type:** modified
**Context:** PR #24903: Feature barcode detector parameters

**Code Changes:**
```diff
@@ -57,6 +57,52 @@ class CV_EXPORTS_W_SIMPLE BarcodeDetector : public cv::GraphicalCodeDetector
                                       CV_OUT std::vector<std::string> &decoded_info,
                                       CV_OUT std::vector<std::string> &decoded_type,
                                       OutputArray points = noArray()) const;
+
+    /** @brief Get detector downsampling threshold.
+     *
+     * @return detector downsampling threshold
+     */
+    CV_WRAP double getDownsamplingThreshold() const;
```

Review comment:
`min(shape[:2])` - can it be rephrased in a natural language?
**File:** modules/objdetect/test/test_barcode.cpp
**Change Type:** modified
**Context:** PR #24903: Feature barcode detector parameters

**Code Changes:**
```diff
@@ -60,7 +60,7 @@ map<string, BarcodeResult> testResults {
     { "single/book.jpg", {"EAN_13", "9787115279460"} },
     { "single/bottle_1.jpg", {"EAN_13", "6922255451427"} },
     { "single/bottle_2.jpg", {"EAN_13", "6921168509256"} },
-    { "multiple/4_barcodes.jpg", {"EAN_13;EAN_13;EAN_13;EAN_13", "9787564350840;9783319200064;9787118081473;9787122276124"} }
+    { "multiple/4_barcodes.jpg", {"EAN_13;EAN_13;EAN_13;EAN_13", "9787564350840;9783319200064;9787118081473;9787122276124"} },
 };
 
 typedef testing::TestWithParam< string > BarcodeDetector_main;
@@ -144,4 +144,87 @@ TEST(BarcodeDetector_base, invalid)
```

Review comment:
Can we avoid creating extra test images? I suggest the following test scenario: 1. take one of existing images 2. set detector parameters to some predefined values 3. run detector and verify that result is as expected (e.g. it can be empty with some parameter set) Test can be parametrised with `(params set, expected result)`. Test can be combined with new regression test (check parameters after setting). Input image can be modified in some way (scaled, rotated, filtered,...) or it can be built from several other images (`vconcat`).
**File:** modules/objdetect/src/barcode.cpp
**Change Type:** modified
**Context:** PR #24903: Feature barcode detector parameters

**Code Changes:**
```diff
@@ -142,11 +142,15 @@ struct BarcodeImpl : public GraphicalCodeDetector::Impl
 public:
     shared_ptr<SuperScale> sr;
     bool use_nn_sr = false;
+    double detectorThrDownSample = 512.f;
+    vector<float> detectorWindowSizes = {0.01f, 0.03f, 0.06f, 0.08f};
+    double detectorThrGradMagnitude = 64.f;
 
 public:
     //=================
```

Review comment:
Should be vector of float rather than double
**File:** modules/objdetect/src/barcode_detector/bardetect.cpp
**Change Type:** modified
**Context:** PR #24903: Feature barcode detector parameters

**Code Changes:**
```diff
@@ -136,13 +136,13 @@ static void NMSBoxes(const std::vector<RotatedRect>& bboxes, const std::vector<f
 
 //==============================================================================
 
-void Detect::init(const Mat &src)
+void Detect::init(const Mat &src, double detectorThreshDownSamplingLimit)
 {
     const double min_side = std::min(src.size().width, src.size().height);
-    if (min_side > 512.0)
+    if (min_side > detectorThreshDownSamplingLimit)
```

Review comment:
```suggestion void Detect::localization(const std::vector<double>& detectorWindowSizes, double detectorThreshGradientMagnitude) ```
**File:** modules/objdetect/test/test_barcode.cpp
**Change Type:** modified
**Context:** PR #24903: Feature barcode detector parameters

**Code Changes:**
```diff
@@ -60,7 +60,7 @@ map<string, BarcodeResult> testResults {
     { "single/book.jpg", {"EAN_13", "9787115279460"} },
     { "single/bottle_1.jpg", {"EAN_13", "6922255451427"} },
     { "single/bottle_2.jpg", {"EAN_13", "6921168509256"} },
-    { "multiple/4_barcodes.jpg", {"EAN_13;EAN_13;EAN_13;EAN_13", "9787564350840;9783319200064;9787118081473;9787122276124"} }
+    { "multiple/4_barcodes.jpg", {"EAN_13;EAN_13;EAN_13;EAN_13", "9787564350840;9783319200064;9787118081473;9787122276124"} },
 };
 
 typedef testing::TestWithParam< string > BarcodeDetector_main;
@@ -144,4 +144,87 @@ TEST(BarcodeDetector_base, invalid)
```

Review comment:
> Can we avoid creating extra test images? Extra test data was designed to detect abnormal changes to the `barcode_detector.cpp` algorithm impl wrt to false positives. It needs to happen.
**File:** modules/objdetect/test/test_barcode.cpp
**Change Type:** modified
**Context:** PR #24903: Feature barcode detector parameters

**Code Changes:**
```diff
@@ -60,7 +60,7 @@ map<string, BarcodeResult> testResults {
     { "single/book.jpg", {"EAN_13", "9787115279460"} },
     { "single/bottle_1.jpg", {"EAN_13", "6922255451427"} },
     { "single/bottle_2.jpg", {"EAN_13", "6921168509256"} },
-    { "multiple/4_barcodes.jpg", {"EAN_13;EAN_13;EAN_13;EAN_13", "9787564350840;9783319200064;9787118081473;9787122276124"} }
+    { "multiple/4_barcodes.jpg", {"EAN_13;EAN_13;EAN_13;EAN_13", "9787564350840;9783319200064;9787118081473;9787122276124"} },
 };
 
 typedef testing::TestWithParam< string > BarcodeDetector_main;
@@ -144,4 +144,87 @@ TEST(BarcodeDetector_base, invalid)
```

Review comment:
What is different in these images comparing to pre-existing ones? If we really need them, can we reduce their size, for example we could add only one of them (`_sm`) and get crops from it in the test to replace other sizes or maybe somehow extend `_lg` image instead.
**File:** modules/imgcodecs/test/test_grfmt.cpp
**Change Type:** modified
**Context:** PR #25525: improvements on tests of imagecodecs module - [WIP] trivial improvements on tests of imagecodecs module
**Review Line:** 90

**Code Changes:**
```diff
@@ -87,11 +87,17 @@ const string all_images[] =
     "readwrite/uint16-mono2.dcm",
     "readwrite/uint8-rgb.dcm",
 #endif
+#if defined(HAVE_PNG) || defined(HAVE_SPNG)
     "readwrite/color_palette_alpha.png",
+#endif
+#ifdef HAVE_TIFF
     "readwrite/multipage.tif",
+#endif
```

Review comment:
We have GDAL library integration which should support all these image types (PNG, JPEG, TIFF). Perhaps it should be accounted too, though I didn't try to test GDAL backend specifically (with no other backends).
**File:** modules/core/src/hal_internal.cpp
**Change Type:** modified
**Context:** PR #25745: Merge 4.x -> 5.x - My attempt to make regular merge :slightly_smiling_face: Companion PRs: opencv/opencv_contrib#3758 and opencv/opencv_ext...
**Review Line:** 115

**Code Changes:**
```diff
 lapack_LU(fptype* a, size_t a_step, int m, fptype* b, size_t b_step, int n, int* info)
 {
-    int lda = (int)(a_step / sizeof(fptype)), sign = 0;
-    std::vector<int> piv(m+1);
+#if defined (ACCELERATE_NEW_LAPACK) && defined (ACCELERATE_LAPACK_ILP64)
+    cv::AutoBuffer<long> piv_buff(m);
+    long lda = (long)(a_step / sizeof(fptype));
+    long _m = static_cast<long>(m), _n = static_cast<long>(n);
+    long _info[1];
+#else
+    cv::AutoBuffer<int> piv_buff(m);
```

Review comment:
Just for reference. `m+1` change was discussed here: https://github.com/opencv/opencv/pull/18571/files#r1638087554
**File:** modules/3d/src/hal_replacement.hpp
**Change Type:** added
**Context:** PR #25745: Merge 4.x -> 5.x - My attempt to make regular merge :slightly_smiling_face: Companion PRs: opencv/opencv_contrib#3758 and opencv/opencv_ext...
**Review Line:** 148

**Code Changes:**
```diff
+   @param dst_data Pointer to resulting projected 2D points with coordinates interleaved as u, v, u, v,..
+   @param dst_step Step between consecutive projected 2D points
+   @param rt_data Pointer to 3x4 array containing rotation-then-translation matrix
+   @param intr_data Pointer to camera intrinsics structure
+*/
+inline int hal_ni_project_points_pinhole64f(const double* src_data, size_t src_step, size_t src_size,
+                                            double* dst_data, size_t dst_step, const double* rt_data,
+                                            const cv_camera_intrinsics_pinhole_64f* intr_data)
+{ return CV_HAL_ERROR_NOT_IMPLEMENTED; }
+
+//! @cond IGNORED
```

Review comment:
The integration part of HAL is missing in the PR. `undistortPoints` was reworked in 5.x. I'll attach solution soon.