1
0
mirror of https://github.com/opencv/opencv.git synced 2026-07-29 15:23:05 +04:00

Merge pull request #29082 from vpisarev:fix_input_array_std_vector_5x

fix vector<T> and vector<vector<T>> handling via InputArray/OutputArray
This commit is contained in:
Alexander Smorkalov
2026-05-21 14:22:00 +03:00
committed by GitHub
2 changed files with 231 additions and 176 deletions
+64
View File
@@ -2978,4 +2978,68 @@ TEST(Mat, issue_27080)
EXPECT_EQ(cv::norm(src3, src4, NORM_L1), UINT_MAX);
}
template<typename _Tp, int cn> static void make_vector(std::vector<cv::Vec<_Tp, cn> >& v, int n)
{
v.clear();
v.resize(n);
_Tp* data = &v[0][0];
for (int i = 0; i < n; i++) {
for (int j = 0; j < cn; j++) {
int k = j % 4;
int val = (k == 0 ? 1 : k == 1 ? -1 : k == 2 ? (i+1) : -(i+1))*(i+1);
data[i*cn + j] = (_Tp)val;
}
}
}
TEST(Core_InputOutputArray, std_vector_vector)
{
std::vector<Vec3s> vv0_s, vv1_s;
std::vector<std::vector<short> > cn_s;
make_vector(vv0_s, 100);
split(vv0_s, cn_s);
merge(cn_s, vv1_s);
double err0 = cvtest::norm(vv0_s, vv1_s, NORM_INF);
EXPECT_EQ(0, err0);
_InputArray iarr_s(cn_s);
_OutputArray oarr_s(cn_s);
EXPECT_EQ(3u, iarr_s.total(-1));
size_t narr = iarr_s.total(-1);
for (size_t i = 0; i < narr; i++) {
EXPECT_EQ(MatShape({int(cn_s[i].size())}), iarr_s.shape(int(i)));
}
size_t newsize_s = vv0_s.size()*2;
oarr_s.create(Size((int)newsize_s, 1), CV_16S, 2);
EXPECT_EQ(newsize_s, cn_s[2].size());
cn_s[1].clear();
EXPECT_EQ(true, oarr_s.empty(1));
std::vector<Vec4d> vv0_d, vv1_d;
std::vector<std::vector<double> > cn_d;
make_vector(vv0_d, 1000);
split(vv0_d, cn_d);
merge(cn_d, vv1_d);
double err1 = cvtest::norm(vv0_d, vv1_d, NORM_INF);
EXPECT_EQ(0., err1);
_InputArray iarr_d(cn_d);
_OutputArray oarr_d(cn_d);
EXPECT_EQ(4u, iarr_d.total(-1));
size_t newsize_d = vv0_d.size()*3;
oarr_d.create(Size((int)newsize_d, 1), CV_64F, 3);
EXPECT_EQ(newsize_d, cn_d[3].size());
cn_d[1].clear();
EXPECT_EQ(true, oarr_d.empty(1));
Mat m2 = oarr_d.getMat(2);
double err2 = cvtest::norm(m2, Mat(cn_d[2]), NORM_INF);
EXPECT_EQ(m2.ptr<double>(), &cn_d[2][0]);
EXPECT_EQ(0., err2);
}
}} // namespace