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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user