Skip to content

Commit 7ffc4b5

Browse files
committed
Merge pull request opencv#19535 from alalek:issue_18897
2 parents d4d1216 + 309e1e2 commit 7ffc4b5

File tree

5 files changed

+58
-35
lines changed

5 files changed

+58
-35
lines changed

modules/core/include/opencv2/core/cvdef.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,7 +400,9 @@ typedef union Cv64suf
400400
}
401401
Cv64suf;
402402

403+
#ifndef OPENCV_ABI_COMPATIBILITY
403404
#define OPENCV_ABI_COMPATIBILITY 300
405+
#endif
404406

405407
#ifdef __OPENCV_BUILD
406408
# define DISABLE_OPENCV_24_COMPATIBILITY

modules/core/include/opencv2/core/mat.hpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,15 +170,19 @@ class CV_EXPORTS _InputArray
170170
STD_VECTOR = 3 << KIND_SHIFT,
171171
STD_VECTOR_VECTOR = 4 << KIND_SHIFT,
172172
STD_VECTOR_MAT = 5 << KIND_SHIFT,
173-
EXPR = 6 << KIND_SHIFT, //!< removed
173+
#if OPENCV_ABI_COMPATIBILITY < 500
174+
EXPR = 6 << KIND_SHIFT, //!< removed: https://github.com/opencv/opencv/pull/17046
175+
#endif
174176
OPENGL_BUFFER = 7 << KIND_SHIFT,
175177
CUDA_HOST_MEM = 8 << KIND_SHIFT,
176178
CUDA_GPU_MAT = 9 << KIND_SHIFT,
177179
UMAT =10 << KIND_SHIFT,
178180
STD_VECTOR_UMAT =11 << KIND_SHIFT,
179181
STD_BOOL_VECTOR =12 << KIND_SHIFT,
180182
STD_VECTOR_CUDA_GPU_MAT = 13 << KIND_SHIFT,
181-
STD_ARRAY =14 << KIND_SHIFT,
183+
#if OPENCV_ABI_COMPATIBILITY < 500
184+
STD_ARRAY =14 << KIND_SHIFT, //!< removed: https://github.com/opencv/opencv/issues/18897
185+
#endif
182186
STD_ARRAY_MAT =15 << KIND_SHIFT
183187
};
184188

modules/core/include/opencv2/core/mat.inl.hpp

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ _InputArray::_InputArray(const std::vector<_Tp>& vec)
112112
#ifdef CV_CXX_STD_ARRAY
113113
template<typename _Tp, std::size_t _Nm> inline
114114
_InputArray::_InputArray(const std::array<_Tp, _Nm>& arr)
115-
{ init(FIXED_TYPE + FIXED_SIZE + STD_ARRAY + traits::Type<_Tp>::value + ACCESS_READ, arr.data(), Size(1, _Nm)); }
115+
{ init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_READ, arr.data(), Size(1, _Nm)); }
116116

117117
template<std::size_t _Nm> inline
118118
_InputArray::_InputArray(const std::array<Mat, _Nm>& arr)
@@ -176,7 +176,7 @@ template<typename _Tp, std::size_t _Nm> inline
176176
_InputArray _InputArray::rawIn(const std::array<_Tp, _Nm>& arr)
177177
{
178178
_InputArray v;
179-
v.flags = FIXED_TYPE + FIXED_SIZE + STD_ARRAY + traits::Type<_Tp>::value + ACCESS_READ;
179+
v.flags = FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_READ;
180180
v.obj = (void*)arr.data();
181181
v.sz = Size(1, _Nm);
182182
return v;
@@ -199,7 +199,7 @@ inline bool _InputArray::isUMatVector() const { return kind() == _InputArray::S
199199
inline bool _InputArray::isMatx() const { return kind() == _InputArray::MATX; }
200200
inline bool _InputArray::isVector() const { return kind() == _InputArray::STD_VECTOR ||
201201
kind() == _InputArray::STD_BOOL_VECTOR ||
202-
kind() == _InputArray::STD_ARRAY; }
202+
(kind() == _InputArray::MATX && (sz.width <= 1 || sz.height <= 1)); }
203203
inline bool _InputArray::isGpuMat() const { return kind() == _InputArray::CUDA_GPU_MAT; }
204204
inline bool _InputArray::isGpuMatVector() const { return kind() == _InputArray::STD_VECTOR_CUDA_GPU_MAT; }
205205

@@ -219,7 +219,7 @@ _OutputArray::_OutputArray(std::vector<_Tp>& vec)
219219
#ifdef CV_CXX_STD_ARRAY
220220
template<typename _Tp, std::size_t _Nm> inline
221221
_OutputArray::_OutputArray(std::array<_Tp, _Nm>& arr)
222-
{ init(FIXED_TYPE + FIXED_SIZE + STD_ARRAY + traits::Type<_Tp>::value + ACCESS_WRITE, arr.data(), Size(1, _Nm)); }
222+
{ init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_WRITE, arr.data(), Size(1, _Nm)); }
223223

224224
template<std::size_t _Nm> inline
225225
_OutputArray::_OutputArray(std::array<Mat, _Nm>& arr)
@@ -261,7 +261,7 @@ _OutputArray::_OutputArray(const std::vector<_Tp>& vec)
261261
#ifdef CV_CXX_STD_ARRAY
262262
template<typename _Tp, std::size_t _Nm> inline
263263
_OutputArray::_OutputArray(const std::array<_Tp, _Nm>& arr)
264-
{ init(FIXED_TYPE + FIXED_SIZE + STD_ARRAY + traits::Type<_Tp>::value + ACCESS_WRITE, arr.data(), Size(1, _Nm)); }
264+
{ init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_WRITE, arr.data(), Size(1, _Nm)); }
265265

266266
template<std::size_t _Nm> inline
267267
_OutputArray::_OutputArray(const std::array<Mat, _Nm>& arr)
@@ -336,7 +336,7 @@ template<typename _Tp, std::size_t _Nm> inline
336336
_OutputArray _OutputArray::rawOut(std::array<_Tp, _Nm>& arr)
337337
{
338338
_OutputArray v;
339-
v.flags = FIXED_TYPE + FIXED_SIZE + STD_ARRAY + traits::Type<_Tp>::value + ACCESS_WRITE;
339+
v.flags = FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_WRITE;
340340
v.obj = (void*)arr.data();
341341
v.sz = Size(1, _Nm);
342342
return v;
@@ -359,7 +359,7 @@ _InputOutputArray::_InputOutputArray(std::vector<_Tp>& vec)
359359
#ifdef CV_CXX_STD_ARRAY
360360
template<typename _Tp, std::size_t _Nm> inline
361361
_InputOutputArray::_InputOutputArray(std::array<_Tp, _Nm>& arr)
362-
{ init(FIXED_TYPE + FIXED_SIZE + STD_ARRAY + traits::Type<_Tp>::value + ACCESS_RW, arr.data(), Size(1, _Nm)); }
362+
{ init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_RW, arr.data(), Size(1, _Nm)); }
363363

364364
template<std::size_t _Nm> inline
365365
_InputOutputArray::_InputOutputArray(std::array<Mat, _Nm>& arr)
@@ -396,7 +396,7 @@ _InputOutputArray::_InputOutputArray(const std::vector<_Tp>& vec)
396396
#ifdef CV_CXX_STD_ARRAY
397397
template<typename _Tp, std::size_t _Nm> inline
398398
_InputOutputArray::_InputOutputArray(const std::array<_Tp, _Nm>& arr)
399-
{ init(FIXED_TYPE + FIXED_SIZE + STD_ARRAY + traits::Type<_Tp>::value + ACCESS_RW, arr.data(), Size(1, _Nm)); }
399+
{ init(FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_RW, arr.data(), Size(1, _Nm)); }
400400

401401
template<std::size_t _Nm> inline
402402
_InputOutputArray::_InputOutputArray(const std::array<Mat, _Nm>& arr)
@@ -473,7 +473,7 @@ template<typename _Tp, std::size_t _Nm> inline
473473
_InputOutputArray _InputOutputArray::rawInOut(std::array<_Tp, _Nm>& arr)
474474
{
475475
_InputOutputArray v;
476-
v.flags = FIXED_TYPE + FIXED_SIZE + STD_ARRAY + traits::Type<_Tp>::value + ACCESS_RW;
476+
v.flags = FIXED_TYPE + FIXED_SIZE + MATX + traits::Type<_Tp>::value + ACCESS_RW;
477477
v.obj = (void*)arr.data();
478478
v.sz = Size(1, _Nm);
479479
return v;

modules/core/src/matrix_wrap.cpp

Lines changed: 41 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ Mat _InputArray::getMat_(int i) const
3232
return m->getMat(accessFlags).row(i);
3333
}
3434

35-
if( k == MATX || k == STD_ARRAY )
35+
if (k == MATX)
3636
{
3737
CV_Assert( i < 0 );
3838
return Mat(sz, flags, obj);
@@ -172,7 +172,7 @@ void _InputArray::getMatVector(std::vector<Mat>& mv) const
172172
return;
173173
}
174174

175-
if( k == MATX || k == STD_ARRAY )
175+
if (k == MATX)
176176
{
177177
size_t n = sz.height, esz = CV_ELEM_SIZE(flags);
178178
mv.resize(n);
@@ -361,7 +361,14 @@ ogl::Buffer _InputArray::getOGlBuffer() const
361361
int _InputArray::kind() const
362362
{
363363
int k = flags & KIND_MASK;
364+
#if CV_VERSION_MAJOR < 5
364365
CV_DbgAssert(k != EXPR);
366+
#if CV_VERSION_MAJOR < 4
367+
if (k == STD_ARRAY)
368+
k = MATX;
369+
#endif
370+
CV_DbgAssert(k != STD_ARRAY);
371+
#endif
365372
return k;
366373
}
367374

@@ -391,7 +398,7 @@ Size _InputArray::size(int i) const
391398
return ((const UMat*)obj)->size();
392399
}
393400

394-
if( k == MATX || k == STD_ARRAY )
401+
if (k == MATX)
395402
{
396403
CV_Assert( i < 0 );
397404
return sz;
@@ -610,7 +617,7 @@ int _InputArray::dims(int i) const
610617
return ((const UMat*)obj)->dims;
611618
}
612619

613-
if( k == MATX || k == STD_ARRAY )
620+
if (k == MATX)
614621
{
615622
CV_Assert( i < 0 );
616623
return 2;
@@ -744,7 +751,7 @@ int _InputArray::type(int i) const
744751
if( k == UMAT )
745752
return ((const UMat*)obj)->type();
746753

747-
if( k == MATX || k == STD_VECTOR || k == STD_ARRAY || k == STD_VECTOR_VECTOR || k == STD_BOOL_VECTOR )
754+
if( k == MATX || k == STD_VECTOR || k == STD_VECTOR_VECTOR || k == STD_BOOL_VECTOR )
748755
return CV_MAT_TYPE(flags);
749756

750757
if( k == NONE )
@@ -830,7 +837,7 @@ bool _InputArray::empty() const
830837
if( k == UMAT )
831838
return ((const UMat*)obj)->empty();
832839

833-
if( k == MATX || k == STD_ARRAY )
840+
if (k == MATX)
834841
return false;
835842

836843
if( k == STD_VECTOR )
@@ -899,7 +906,7 @@ bool _InputArray::isContinuous(int i) const
899906
if( k == UMAT )
900907
return i < 0 ? ((const UMat*)obj)->isContinuous() : true;
901908

902-
if( k == MATX || k == STD_VECTOR || k == STD_ARRAY ||
909+
if( k == MATX || k == STD_VECTOR ||
903910
k == NONE || k == STD_VECTOR_VECTOR || k == STD_BOOL_VECTOR )
904911
return true;
905912

@@ -940,7 +947,7 @@ bool _InputArray::isSubmatrix(int i) const
940947
if( k == UMAT )
941948
return i < 0 ? ((const UMat*)obj)->isSubmatrix() : false;
942949

943-
if( k == MATX || k == STD_VECTOR || k == STD_ARRAY ||
950+
if( k == MATX || k == STD_VECTOR ||
944951
k == NONE || k == STD_VECTOR_VECTOR || k == STD_BOOL_VECTOR )
945952
return false;
946953

@@ -985,7 +992,7 @@ size_t _InputArray::offset(int i) const
985992
return ((const UMat*)obj)->offset;
986993
}
987994

988-
if( k == MATX || k == STD_VECTOR || k == STD_ARRAY ||
995+
if( k == MATX || k == STD_VECTOR ||
989996
k == NONE || k == STD_VECTOR_VECTOR || k == STD_BOOL_VECTOR )
990997
return 0;
991998

@@ -1044,7 +1051,7 @@ size_t _InputArray::step(int i) const
10441051
return ((const UMat*)obj)->step;
10451052
}
10461053

1047-
if( k == MATX || k == STD_VECTOR || k == STD_ARRAY ||
1054+
if( k == MATX || k == STD_VECTOR ||
10481055
k == NONE || k == STD_VECTOR_VECTOR || k == STD_BOOL_VECTOR )
10491056
return 0;
10501057

@@ -1090,7 +1097,7 @@ void _InputArray::copyTo(const _OutputArray& arr) const
10901097

10911098
if( k == NONE )
10921099
arr.release();
1093-
else if( k == MAT || k == MATX || k == STD_VECTOR || k == STD_ARRAY || k == STD_BOOL_VECTOR )
1100+
else if( k == MAT || k == MATX || k == STD_VECTOR || k == STD_BOOL_VECTOR )
10941101
{
10951102
Mat m = getMat();
10961103
m.copyTo(arr);
@@ -1111,7 +1118,7 @@ void _InputArray::copyTo(const _OutputArray& arr, const _InputArray & mask) cons
11111118

11121119
if( k == NONE )
11131120
arr.release();
1114-
else if( k == MAT || k == MATX || k == STD_VECTOR || k == STD_ARRAY || k == STD_BOOL_VECTOR )
1121+
else if( k == MAT || k == MATX || k == STD_VECTOR || k == STD_BOOL_VECTOR )
11151122
{
11161123
Mat m = getMat();
11171124
m.copyTo(arr, mask);
@@ -1299,16 +1306,27 @@ void _OutputArray::create(int d, const int* sizes, int mtype, int i,
12991306
CV_Assert( i < 0 );
13001307
int type0 = CV_MAT_TYPE(flags);
13011308
CV_Assert( mtype == type0 || (CV_MAT_CN(mtype) == 1 && ((1 << type0) & fixedDepthMask) != 0) );
1302-
CV_Assert( d == 2 && ((sizes[0] == sz.height && sizes[1] == sz.width) ||
1303-
(allowTransposed && sizes[0] == sz.width && sizes[1] == sz.height)));
1304-
return;
1305-
}
1306-
1307-
if( k == STD_ARRAY )
1308-
{
1309-
int type0 = CV_MAT_TYPE(flags);
1310-
CV_Assert( mtype == type0 || (CV_MAT_CN(mtype) == 1 && ((1 << type0) & fixedDepthMask) != 0) );
1311-
CV_Assert( d == 2 && sz.area() == sizes[0]*sizes[1]);
1309+
CV_CheckLE(d, 2, "");
1310+
Size requested_size(d == 2 ? sizes[1] : 1, d >= 1 ? sizes[0] : 1);
1311+
if (sz.width == 1 || sz.height == 1)
1312+
{
1313+
// NB: 1D arrays assume allowTransposed=true (see #4159)
1314+
int total_1d = std::max(sz.width, sz.height);
1315+
CV_Check(requested_size, std::max(requested_size.width, requested_size.height) == total_1d, "");
1316+
}
1317+
else
1318+
{
1319+
if (!allowTransposed)
1320+
{
1321+
CV_CheckEQ(requested_size, sz, "");
1322+
}
1323+
else
1324+
{
1325+
CV_Check(requested_size,
1326+
(requested_size == sz || (requested_size.height == sz.width && requested_size.width == sz.height)),
1327+
"");
1328+
}
1329+
}
13121330
return;
13131331
}
13141332

@@ -1770,7 +1788,7 @@ void _OutputArray::setTo(const _InputArray& arr, const _InputArray & mask) const
17701788

17711789
if( k == NONE )
17721790
;
1773-
else if( k == MAT || k == MATX || k == STD_VECTOR || k == STD_ARRAY )
1791+
else if (k == MAT || k == MATX || k == STD_VECTOR)
17741792
{
17751793
Mat m = getMat();
17761794
m.setTo(arr, mask);

modules/core/test/test_mat.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1998,7 +1998,6 @@ class TestInputArrayRangeChecking {
19981998
C(EXPR);
19991999
C(MATX);
20002000
C(STD_VECTOR);
2001-
C(STD_ARRAY);
20022001
C(NONE);
20032002
C(STD_VECTOR_VECTOR);
20042003
C(STD_BOOL_VECTOR);

0 commit comments

Comments
 (0)