mirror of
https://github.com/opencv/opencv.git
synced 2026-07-29 15:23:05 +04:00
Merge pull request #8535 from arnaudbrejeon:std_array
Add support for std::array<T, N> (#8535) * Add support for std::array<T, N> * Add std::array<Mat, N> support * Remove UMat constructor with std::array parameter
This commit is contained in:
committed by
Alexander Alekhin
parent
2922738b6d
commit
636ab095b0
+208
-15
@@ -1235,7 +1235,7 @@ Mat _InputArray::getMat_(int i) const
|
||||
return (Mat)*((const MatExpr*)obj);
|
||||
}
|
||||
|
||||
if( k == MATX )
|
||||
if( k == MATX || k == STD_ARRAY )
|
||||
{
|
||||
CV_Assert( i < 0 );
|
||||
return Mat(sz, flags, obj);
|
||||
@@ -1286,6 +1286,14 @@ Mat _InputArray::getMat_(int i) const
|
||||
return v[i];
|
||||
}
|
||||
|
||||
if( k == STD_ARRAY_MAT )
|
||||
{
|
||||
const Mat* v = (const Mat*)obj;
|
||||
CV_Assert( 0 <= i && i < sz.height );
|
||||
|
||||
return v[i];
|
||||
}
|
||||
|
||||
if( k == STD_VECTOR_UMAT )
|
||||
{
|
||||
const std::vector<UMat>& v = *(const std::vector<UMat>*)obj;
|
||||
@@ -1381,7 +1389,7 @@ void _InputArray::getMatVector(std::vector<Mat>& mv) const
|
||||
return;
|
||||
}
|
||||
|
||||
if( k == MATX )
|
||||
if( k == MATX || k == STD_ARRAY )
|
||||
{
|
||||
size_t n = sz.height, esz = CV_ELEM_SIZE(flags);
|
||||
mv.resize(n);
|
||||
@@ -1436,6 +1444,17 @@ void _InputArray::getMatVector(std::vector<Mat>& mv) const
|
||||
return;
|
||||
}
|
||||
|
||||
if( k == STD_ARRAY_MAT )
|
||||
{
|
||||
const Mat* v = (const Mat*)obj;
|
||||
size_t n = sz.height;
|
||||
mv.resize(n);
|
||||
|
||||
for( size_t i = 0; i < n; i++ )
|
||||
mv[i] = v[i];
|
||||
return;
|
||||
}
|
||||
|
||||
if( k == STD_VECTOR_UMAT )
|
||||
{
|
||||
const std::vector<UMat>& v = *(const std::vector<UMat>*)obj;
|
||||
@@ -1472,6 +1491,17 @@ void _InputArray::getUMatVector(std::vector<UMat>& umv) const
|
||||
return;
|
||||
}
|
||||
|
||||
if( k == STD_ARRAY_MAT )
|
||||
{
|
||||
const Mat* v = (const Mat*)obj;
|
||||
size_t n = sz.height;
|
||||
umv.resize(n);
|
||||
|
||||
for( size_t i = 0; i < n; i++ )
|
||||
umv[i] = v[i].getUMat(accessFlags);
|
||||
return;
|
||||
}
|
||||
|
||||
if( k == STD_VECTOR_UMAT )
|
||||
{
|
||||
const std::vector<UMat>& v = *(const std::vector<UMat>*)obj;
|
||||
@@ -1584,7 +1614,7 @@ Size _InputArray::size(int i) const
|
||||
return ((const UMat*)obj)->size();
|
||||
}
|
||||
|
||||
if( k == MATX )
|
||||
if( k == MATX || k == STD_ARRAY )
|
||||
{
|
||||
CV_Assert( i < 0 );
|
||||
return sz;
|
||||
@@ -1631,6 +1661,16 @@ Size _InputArray::size(int i) const
|
||||
return vv[i].size();
|
||||
}
|
||||
|
||||
if( k == STD_ARRAY_MAT )
|
||||
{
|
||||
const Mat* vv = (const Mat*)obj;
|
||||
if( i < 0 )
|
||||
return sz.height==0 ? Size() : Size(sz.height, 1);
|
||||
CV_Assert( i < sz.height );
|
||||
|
||||
return vv[i].size();
|
||||
}
|
||||
|
||||
if (k == STD_VECTOR_CUDA_GPU_MAT)
|
||||
{
|
||||
const std::vector<cuda::GpuMat>& vv = *(const std::vector<cuda::GpuMat>*)obj;
|
||||
@@ -1709,6 +1749,16 @@ int _InputArray::sizend(int* arrsz, int i) const
|
||||
for(j = 0; j < d; j++)
|
||||
arrsz[j] = m.size.p[j];
|
||||
}
|
||||
else if( k == STD_ARRAY_MAT && i >= 0 )
|
||||
{
|
||||
const Mat* vv = (const Mat*)obj;
|
||||
CV_Assert( i < sz.height );
|
||||
const Mat& m = vv[i];
|
||||
d = m.dims;
|
||||
if(arrsz)
|
||||
for(j = 0; j < d; j++)
|
||||
arrsz[j] = m.size.p[j];
|
||||
}
|
||||
else if( k == STD_VECTOR_UMAT && i >= 0 )
|
||||
{
|
||||
const std::vector<UMat>& vv = *(const std::vector<UMat>*)obj;
|
||||
@@ -1789,7 +1839,7 @@ int _InputArray::dims(int i) const
|
||||
return ((const UMat*)obj)->dims;
|
||||
}
|
||||
|
||||
if( k == MATX )
|
||||
if( k == MATX || k == STD_ARRAY )
|
||||
{
|
||||
CV_Assert( i < 0 );
|
||||
return 2;
|
||||
@@ -1823,6 +1873,16 @@ int _InputArray::dims(int i) const
|
||||
return vv[i].dims;
|
||||
}
|
||||
|
||||
if( k == STD_ARRAY_MAT )
|
||||
{
|
||||
const Mat* vv = (const Mat*)obj;
|
||||
if( i < 0 )
|
||||
return 1;
|
||||
CV_Assert( i < sz.height );
|
||||
|
||||
return vv[i].dims;
|
||||
}
|
||||
|
||||
if( k == STD_VECTOR_UMAT )
|
||||
{
|
||||
const std::vector<UMat>& vv = *(const std::vector<UMat>*)obj;
|
||||
@@ -1881,6 +1941,15 @@ size_t _InputArray::total(int i) const
|
||||
return vv[i].total();
|
||||
}
|
||||
|
||||
if( k == STD_ARRAY_MAT )
|
||||
{
|
||||
const Mat* vv = (const Mat*)obj;
|
||||
if( i < 0 )
|
||||
return sz.height;
|
||||
|
||||
CV_Assert( i < sz.height );
|
||||
return vv[i].total();
|
||||
}
|
||||
|
||||
if( k == STD_VECTOR_UMAT )
|
||||
{
|
||||
@@ -1908,7 +1977,7 @@ int _InputArray::type(int i) const
|
||||
if( k == EXPR )
|
||||
return ((const MatExpr*)obj)->type();
|
||||
|
||||
if( k == MATX || k == STD_VECTOR || k == STD_VECTOR_VECTOR || k == STD_BOOL_VECTOR )
|
||||
if( k == MATX || k == STD_VECTOR || k == STD_ARRAY || k == STD_VECTOR_VECTOR || k == STD_BOOL_VECTOR )
|
||||
return CV_MAT_TYPE(flags);
|
||||
|
||||
if( k == NONE )
|
||||
@@ -1938,6 +2007,18 @@ int _InputArray::type(int i) const
|
||||
return vv[i >= 0 ? i : 0].type();
|
||||
}
|
||||
|
||||
if( k == STD_ARRAY_MAT )
|
||||
{
|
||||
const Mat* vv = (const Mat*)obj;
|
||||
if( sz.height == 0 )
|
||||
{
|
||||
CV_Assert((flags & FIXED_TYPE) != 0);
|
||||
return CV_MAT_TYPE(flags);
|
||||
}
|
||||
CV_Assert( i < sz.height );
|
||||
return vv[i >= 0 ? i : 0].type();
|
||||
}
|
||||
|
||||
if (k == STD_VECTOR_CUDA_GPU_MAT)
|
||||
{
|
||||
const std::vector<cuda::GpuMat>& vv = *(const std::vector<cuda::GpuMat>*)obj;
|
||||
@@ -1986,7 +2067,7 @@ bool _InputArray::empty() const
|
||||
if( k == EXPR )
|
||||
return false;
|
||||
|
||||
if( k == MATX )
|
||||
if( k == MATX || k == STD_ARRAY )
|
||||
return false;
|
||||
|
||||
if( k == STD_VECTOR )
|
||||
@@ -2016,6 +2097,11 @@ bool _InputArray::empty() const
|
||||
return vv.empty();
|
||||
}
|
||||
|
||||
if( k == STD_ARRAY_MAT )
|
||||
{
|
||||
return sz.height == 0;
|
||||
}
|
||||
|
||||
if( k == STD_VECTOR_UMAT )
|
||||
{
|
||||
const std::vector<UMat>& vv = *(const std::vector<UMat>*)obj;
|
||||
@@ -2051,7 +2137,7 @@ bool _InputArray::isContinuous(int i) const
|
||||
if( k == UMAT )
|
||||
return i < 0 ? ((const UMat*)obj)->isContinuous() : true;
|
||||
|
||||
if( k == EXPR || k == MATX || k == STD_VECTOR ||
|
||||
if( k == EXPR || k == MATX || k == STD_VECTOR || k == STD_ARRAY ||
|
||||
k == NONE || k == STD_VECTOR_VECTOR || k == STD_BOOL_VECTOR )
|
||||
return true;
|
||||
|
||||
@@ -2062,6 +2148,13 @@ bool _InputArray::isContinuous(int i) const
|
||||
return vv[i].isContinuous();
|
||||
}
|
||||
|
||||
if( k == STD_ARRAY_MAT )
|
||||
{
|
||||
const Mat* vv = (const Mat*)obj;
|
||||
CV_Assert(i < sz.height);
|
||||
return vv[i].isContinuous();
|
||||
}
|
||||
|
||||
if( k == STD_VECTOR_UMAT )
|
||||
{
|
||||
const std::vector<UMat>& vv = *(const std::vector<UMat>*)obj;
|
||||
@@ -2086,7 +2179,7 @@ bool _InputArray::isSubmatrix(int i) const
|
||||
if( k == UMAT )
|
||||
return i < 0 ? ((const UMat*)obj)->isSubmatrix() : false;
|
||||
|
||||
if( k == EXPR || k == MATX || k == STD_VECTOR ||
|
||||
if( k == EXPR || k == MATX || k == STD_VECTOR || k == STD_ARRAY ||
|
||||
k == NONE || k == STD_VECTOR_VECTOR || k == STD_BOOL_VECTOR )
|
||||
return false;
|
||||
|
||||
@@ -2097,6 +2190,13 @@ bool _InputArray::isSubmatrix(int i) const
|
||||
return vv[i].isSubmatrix();
|
||||
}
|
||||
|
||||
if( k == STD_ARRAY_MAT )
|
||||
{
|
||||
const Mat* vv = (const Mat*)obj;
|
||||
CV_Assert(i < sz.height);
|
||||
return vv[i].isSubmatrix();
|
||||
}
|
||||
|
||||
if( k == STD_VECTOR_UMAT )
|
||||
{
|
||||
const std::vector<UMat>& vv = *(const std::vector<UMat>*)obj;
|
||||
@@ -2125,7 +2225,7 @@ size_t _InputArray::offset(int i) const
|
||||
return ((const UMat*)obj)->offset;
|
||||
}
|
||||
|
||||
if( k == EXPR || k == MATX || k == STD_VECTOR ||
|
||||
if( k == EXPR || k == MATX || k == STD_VECTOR || k == STD_ARRAY ||
|
||||
k == NONE || k == STD_VECTOR_VECTOR || k == STD_BOOL_VECTOR )
|
||||
return 0;
|
||||
|
||||
@@ -2139,6 +2239,15 @@ size_t _InputArray::offset(int i) const
|
||||
return (size_t)(vv[i].ptr() - vv[i].datastart);
|
||||
}
|
||||
|
||||
if( k == STD_ARRAY_MAT )
|
||||
{
|
||||
const Mat* vv = (const Mat*)obj;
|
||||
if( i < 0 )
|
||||
return 1;
|
||||
CV_Assert( i < sz.height );
|
||||
return (size_t)(vv[i].ptr() - vv[i].datastart);
|
||||
}
|
||||
|
||||
if( k == STD_VECTOR_UMAT )
|
||||
{
|
||||
const std::vector<UMat>& vv = *(const std::vector<UMat>*)obj;
|
||||
@@ -2180,7 +2289,7 @@ size_t _InputArray::step(int i) const
|
||||
return ((const UMat*)obj)->step;
|
||||
}
|
||||
|
||||
if( k == EXPR || k == MATX || k == STD_VECTOR ||
|
||||
if( k == EXPR || k == MATX || k == STD_VECTOR || k == STD_ARRAY ||
|
||||
k == NONE || k == STD_VECTOR_VECTOR || k == STD_BOOL_VECTOR )
|
||||
return 0;
|
||||
|
||||
@@ -2193,6 +2302,15 @@ size_t _InputArray::step(int i) const
|
||||
return vv[i].step;
|
||||
}
|
||||
|
||||
if( k == STD_ARRAY_MAT )
|
||||
{
|
||||
const Mat* vv = (const Mat*)obj;
|
||||
if( i < 0 )
|
||||
return 1;
|
||||
CV_Assert( i < sz.height );
|
||||
return vv[i].step;
|
||||
}
|
||||
|
||||
if( k == STD_VECTOR_UMAT )
|
||||
{
|
||||
const std::vector<UMat>& vv = *(const std::vector<UMat>*)obj;
|
||||
@@ -2222,7 +2340,7 @@ void _InputArray::copyTo(const _OutputArray& arr) const
|
||||
|
||||
if( k == NONE )
|
||||
arr.release();
|
||||
else if( k == MAT || k == MATX || k == STD_VECTOR || k == STD_BOOL_VECTOR )
|
||||
else if( k == MAT || k == MATX || k == STD_VECTOR || k == STD_ARRAY || k == STD_BOOL_VECTOR )
|
||||
{
|
||||
Mat m = getMat();
|
||||
m.copyTo(arr);
|
||||
@@ -2247,7 +2365,7 @@ void _InputArray::copyTo(const _OutputArray& arr, const _InputArray & mask) cons
|
||||
|
||||
if( k == NONE )
|
||||
arr.release();
|
||||
else if( k == MAT || k == MATX || k == STD_VECTOR || k == STD_BOOL_VECTOR )
|
||||
else if( k == MAT || k == MATX || k == STD_VECTOR || k == STD_ARRAY || k == STD_BOOL_VECTOR )
|
||||
{
|
||||
Mat m = getMat();
|
||||
m.copyTo(arr, mask);
|
||||
@@ -2436,6 +2554,14 @@ void _OutputArray::create(int d, const int* sizes, int mtype, int i,
|
||||
return;
|
||||
}
|
||||
|
||||
if( k == STD_ARRAY )
|
||||
{
|
||||
int type0 = CV_MAT_TYPE(flags);
|
||||
CV_Assert( mtype == type0 || (CV_MAT_CN(mtype) == 1 && ((1 << type0) & fixedDepthMask) != 0) );
|
||||
CV_Assert( d == 2 && sz.area() == sizes[0]*sizes[1]);
|
||||
return;
|
||||
}
|
||||
|
||||
if( k == STD_VECTOR || k == STD_VECTOR_VECTOR )
|
||||
{
|
||||
CV_Assert( d == 2 && (sizes[0] == 1 || sizes[1] == 1 || sizes[0]*sizes[1] == 0) );
|
||||
@@ -2583,6 +2709,65 @@ void _OutputArray::create(int d, const int* sizes, int mtype, int i,
|
||||
return;
|
||||
}
|
||||
|
||||
if( k == STD_ARRAY_MAT )
|
||||
{
|
||||
Mat* v = (Mat*)obj;
|
||||
|
||||
if( i < 0 )
|
||||
{
|
||||
CV_Assert( d == 2 && (sizes[0] == 1 || sizes[1] == 1 || sizes[0]*sizes[1] == 0) );
|
||||
size_t len = sizes[0]*sizes[1] > 0 ? sizes[0] + sizes[1] - 1 : 0, len0 = sz.height;
|
||||
|
||||
CV_Assert(len == len0);
|
||||
if( fixedType() )
|
||||
{
|
||||
int _type = CV_MAT_TYPE(flags);
|
||||
for( size_t j = len0; j < len; j++ )
|
||||
{
|
||||
if( v[j].type() == _type )
|
||||
continue;
|
||||
CV_Assert( v[j].empty() );
|
||||
v[j].flags = (v[j].flags & ~CV_MAT_TYPE_MASK) | _type;
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
CV_Assert( i < sz.height );
|
||||
Mat& m = v[i];
|
||||
|
||||
if( allowTransposed )
|
||||
{
|
||||
if( !m.isContinuous() )
|
||||
{
|
||||
CV_Assert(!fixedType() && !fixedSize());
|
||||
m.release();
|
||||
}
|
||||
|
||||
if( d == 2 && m.dims == 2 && m.data &&
|
||||
m.type() == mtype && m.rows == sizes[1] && m.cols == sizes[0] )
|
||||
return;
|
||||
}
|
||||
|
||||
if(fixedType())
|
||||
{
|
||||
if(CV_MAT_CN(mtype) == m.channels() && ((1 << CV_MAT_TYPE(flags)) & fixedDepthMask) != 0 )
|
||||
mtype = m.type();
|
||||
else
|
||||
CV_Assert(CV_MAT_TYPE(mtype) == m.type());
|
||||
}
|
||||
|
||||
if(fixedSize())
|
||||
{
|
||||
CV_Assert(m.dims == d);
|
||||
for(int j = 0; j < d; ++j)
|
||||
CV_Assert(m.size[j] == sizes[j]);
|
||||
}
|
||||
|
||||
m.create(d, sizes, mtype);
|
||||
return;
|
||||
}
|
||||
|
||||
if( k == STD_VECTOR_UMAT )
|
||||
{
|
||||
std::vector<UMat>& v = *(std::vector<UMat>*)obj;
|
||||
@@ -2748,13 +2933,21 @@ Mat& _OutputArray::getMatRef(int i) const
|
||||
CV_Assert( k == MAT );
|
||||
return *(Mat*)obj;
|
||||
}
|
||||
else
|
||||
|
||||
CV_Assert( k == STD_VECTOR_MAT || k == STD_ARRAY_MAT );
|
||||
|
||||
if( k == STD_VECTOR_MAT )
|
||||
{
|
||||
CV_Assert( k == STD_VECTOR_MAT );
|
||||
std::vector<Mat>& v = *(std::vector<Mat>*)obj;
|
||||
CV_Assert( i < (int)v.size() );
|
||||
return v[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
Mat* v = (Mat*)obj;
|
||||
CV_Assert( 0 <= i && i < sz.height );
|
||||
return v[i];
|
||||
}
|
||||
}
|
||||
|
||||
UMat& _OutputArray::getUMatRef(int i) const
|
||||
@@ -2807,7 +3000,7 @@ void _OutputArray::setTo(const _InputArray& arr, const _InputArray & mask) const
|
||||
|
||||
if( k == NONE )
|
||||
;
|
||||
else if( k == MAT || k == MATX || k == STD_VECTOR )
|
||||
else if( k == MAT || k == MATX || k == STD_VECTOR || k == STD_ARRAY )
|
||||
{
|
||||
Mat m = getMat();
|
||||
m.setTo(arr, mask);
|
||||
|
||||
Reference in New Issue
Block a user