# endif
#endif
+/****************************************************************************************\
+* C++11 std::array *
+\****************************************************************************************/
+
+#ifndef CV_CXX_STD_ARRAY
+# if __cplusplus >= 201103L
+# define CV_CXX_STD_ARRAY 1
+# include <array>
+# endif
+#else
+# if CV_CXX_STD_ARRAY == 0
+# undef CV_CXX_STD_ARRAY
+# endif
+#endif
+
//! @}
#endif // OPENCV_CORE_CVDEF_H
UMAT =10 << KIND_SHIFT,
STD_VECTOR_UMAT =11 << KIND_SHIFT,
STD_BOOL_VECTOR =12 << KIND_SHIFT,
- STD_VECTOR_CUDA_GPU_MAT = 13 << KIND_SHIFT
+ STD_VECTOR_CUDA_GPU_MAT = 13 << KIND_SHIFT,
+ STD_ARRAY =14 << KIND_SHIFT,
+ STD_ARRAY_MAT =15 << KIND_SHIFT
};
_InputArray();
_InputArray(const UMat& um);
_InputArray(const std::vector<UMat>& umv);
+#ifdef CV_CXX_STD_ARRAY
+ template<typename _Tp, std::size_t _N> _InputArray(const std::array<_Tp, _N>& arr);
+ template<std::size_t _N> _InputArray(const std::array<Mat, _N>& arr);
+#endif
+
Mat getMat(int idx=-1) const;
Mat getMat_(int idx=-1) const;
UMat getUMat(int idx=-1) const;
_OutputArray(const UMat& m);
_OutputArray(const std::vector<UMat>& vec);
+#ifdef CV_CXX_STD_ARRAY
+ template<typename _Tp, std::size_t _N> _OutputArray(std::array<_Tp, _N>& arr);
+ template<typename _Tp, std::size_t _N> _OutputArray(const std::array<_Tp, _N>& arr);
+ template<std::size_t _N> _OutputArray(std::array<Mat, _N>& arr);
+ template<std::size_t _N> _OutputArray(const std::array<Mat, _N>& arr);
+#endif
+
bool fixedSize() const;
bool fixedType() const;
bool needed() const;
template<typename _Tp, int m, int n> _InputOutputArray(const Matx<_Tp, m, n>& matx);
_InputOutputArray(const UMat& m);
_InputOutputArray(const std::vector<UMat>& vec);
+
+#ifdef CV_CXX_STD_ARRAY
+ template<typename _Tp, std::size_t _N> _InputOutputArray(std::array<_Tp, _N>& arr);
+ template<typename _Tp, std::size_t _N> _InputOutputArray(const std::array<_Tp, _N>& arr);
+ template<std::size_t _N> _InputOutputArray(std::array<Mat, _N>& arr);
+ template<std::size_t _N> _InputOutputArray(const std::array<Mat, _N>& arr);
+#endif
+
};
typedef const _InputArray& InputArray;
*/
template<typename _Tp> explicit Mat(const std::vector<_Tp>& vec, bool copyData=false);
+#ifdef CV_CXX_STD_ARRAY
+ /** @overload
+ */
+ template<typename _Tp, size_t _N> explicit Mat(const std::array<_Tp, _N>& arr, bool copyData=false);
+#endif
+
/** @overload
*/
template<typename _Tp, int n> explicit Mat(const Vec<_Tp, n>& vec, bool copyData=true);
template<typename _Tp, int n> operator Vec<_Tp, n>() const;
template<typename _Tp, int m, int n> operator Matx<_Tp, m, n>() const;
+#ifdef CV_CXX_STD_ARRAY
+ template<typename _Tp, std::size_t _N> operator std::array<_Tp, _N>() const;
+#endif
+
/** @brief Reports whether the matrix is continuous or not.
The method returns true if the matrix elements are stored continuously without gaps at the end of
explicit Mat_(const Point3_<typename DataType<_Tp>::channel_type>& pt, bool copyData=true);
explicit Mat_(const MatCommaInitializer_<_Tp>& commaInitializer);
+#ifdef CV_CXX_STD_ARRAY
+ template <std::size_t _N> explicit Mat_(const std::array<_Tp, _N>& arr, bool copyData=false);
+#endif
+
Mat_& operator = (const Mat& m);
Mat_& operator = (const Mat_& m);
//! set all the elements to s.
//! conversion to vector.
operator std::vector<_Tp>() const;
+
+#ifdef CV_CXX_STD_ARRAY
+ //! conversion to array.
+ template<std::size_t _N> operator std::array<_Tp, _N>() const;
+#endif
+
//! conversion to Vec
template<int n> operator Vec<typename DataType<_Tp>::channel_type, n>() const;
//! conversion to Matx
UMat(const UMat& m, const std::vector<Range>& ranges);
//! builds matrix from std::vector with or without copying the data
template<typename _Tp> explicit UMat(const std::vector<_Tp>& vec, bool copyData=false);
+
//! builds matrix from cv::Vec; the data is copied by default
template<typename _Tp, int n> explicit UMat(const Vec<_Tp, n>& vec, bool copyData=true);
//! builds matrix from cv::Matx; the data is copied by default
_InputArray::_InputArray(const std::vector<_Tp>& vec)
{ init(FIXED_TYPE + STD_VECTOR + DataType<_Tp>::type + ACCESS_READ, &vec); }
+#ifdef CV_CXX_STD_ARRAY
+template<typename _Tp, std::size_t _N> inline
+_InputArray::_InputArray(const std::array<_Tp, _N>& arr)
+{ init(FIXED_TYPE + FIXED_SIZE + STD_ARRAY + DataType<_Tp>::type + ACCESS_READ, arr.data(), Size(1, _N)); }
+
+template<std::size_t _N> inline
+_InputArray::_InputArray(const std::array<Mat, _N>& arr)
+{ init(STD_ARRAY_MAT + ACCESS_READ, arr.data(), Size(1, _N)); }
+#endif
+
inline
_InputArray::_InputArray(const std::vector<bool>& vec)
{ init(FIXED_TYPE + STD_BOOL_VECTOR + DataType<bool>::type + ACCESS_READ, &vec); }
inline bool _InputArray::isMatVector() const { return kind() == _InputArray::STD_VECTOR_MAT; }
inline bool _InputArray::isUMatVector() const { return kind() == _InputArray::STD_VECTOR_UMAT; }
inline bool _InputArray::isMatx() const { return kind() == _InputArray::MATX; }
-inline bool _InputArray::isVector() const { return kind() == _InputArray::STD_VECTOR || kind() == _InputArray::STD_BOOL_VECTOR; }
+inline bool _InputArray::isVector() const { return kind() == _InputArray::STD_VECTOR ||
+ kind() == _InputArray::STD_BOOL_VECTOR ||
+ kind() == _InputArray::STD_ARRAY; }
inline bool _InputArray::isGpuMatVector() const { return kind() == _InputArray::STD_VECTOR_CUDA_GPU_MAT; }
////////////////////////////////////////////////////////////////////////////////////////
_OutputArray::_OutputArray(std::vector<_Tp>& vec)
{ init(FIXED_TYPE + STD_VECTOR + DataType<_Tp>::type + ACCESS_WRITE, &vec); }
+#ifdef CV_CXX_STD_ARRAY
+template<typename _Tp, std::size_t _N> inline
+_OutputArray::_OutputArray(std::array<_Tp, _N>& arr)
+{ init(FIXED_TYPE + FIXED_SIZE + STD_ARRAY + DataType<_Tp>::type + ACCESS_WRITE, arr.data(), Size(1, _N)); }
+
+template<std::size_t _N> inline
+_OutputArray::_OutputArray(std::array<Mat, _N>& arr)
+{ init(STD_ARRAY_MAT + ACCESS_WRITE, arr.data(), Size(1, _N)); }
+#endif
+
inline
_OutputArray::_OutputArray(std::vector<bool>&)
{ CV_Error(Error::StsUnsupportedFormat, "std::vector<bool> cannot be an output array\n"); }
_OutputArray::_OutputArray(const std::vector<_Tp>& vec)
{ init(FIXED_TYPE + FIXED_SIZE + STD_VECTOR + DataType<_Tp>::type + ACCESS_WRITE, &vec); }
+#ifdef CV_CXX_STD_ARRAY
+template<typename _Tp, std::size_t _N> inline
+_OutputArray::_OutputArray(const std::array<_Tp, _N>& arr)
+{ init(FIXED_TYPE + FIXED_SIZE + STD_ARRAY + DataType<_Tp>::type + ACCESS_WRITE, arr.data(), Size(1, _N)); }
+
+template<std::size_t _N> inline
+_OutputArray::_OutputArray(const std::array<Mat, _N>& arr)
+{ init(FIXED_SIZE + STD_ARRAY_MAT + ACCESS_WRITE, arr.data(), Size(1, _N)); }
+#endif
+
template<typename _Tp> inline
_OutputArray::_OutputArray(const std::vector<std::vector<_Tp> >& vec)
{ init(FIXED_TYPE + FIXED_SIZE + STD_VECTOR_VECTOR + DataType<_Tp>::type + ACCESS_WRITE, &vec); }
_InputOutputArray::_InputOutputArray(std::vector<_Tp>& vec)
{ init(FIXED_TYPE + STD_VECTOR + DataType<_Tp>::type + ACCESS_RW, &vec); }
+#ifdef CV_CXX_STD_ARRAY
+template<typename _Tp, std::size_t _N> inline
+_InputOutputArray::_InputOutputArray(std::array<_Tp, _N>& arr)
+{ init(FIXED_TYPE + FIXED_SIZE + STD_ARRAY + DataType<_Tp>::type + ACCESS_RW, arr.data(), Size(1, _N)); }
+
+template<std::size_t _N> inline
+_InputOutputArray::_InputOutputArray(std::array<Mat, _N>& arr)
+{ init(STD_ARRAY_MAT + ACCESS_RW, arr.data(), Size(1, _N)); }
+#endif
+
inline _InputOutputArray::_InputOutputArray(std::vector<bool>&)
{ CV_Error(Error::StsUnsupportedFormat, "std::vector<bool> cannot be an input/output array\n"); }
_InputOutputArray::_InputOutputArray(const std::vector<_Tp>& vec)
{ init(FIXED_TYPE + FIXED_SIZE + STD_VECTOR + DataType<_Tp>::type + ACCESS_RW, &vec); }
+#ifdef CV_CXX_STD_ARRAY
+template<typename _Tp, std::size_t _N> inline
+_InputOutputArray::_InputOutputArray(const std::array<_Tp, _N>& arr)
+{ init(FIXED_TYPE + FIXED_SIZE + STD_ARRAY + DataType<_Tp>::type + ACCESS_RW, arr.data(), Size(1, _N)); }
+
+template<std::size_t _N> inline
+_InputOutputArray::_InputOutputArray(const std::array<Mat, _N>& arr)
+{ init(FIXED_SIZE + STD_ARRAY_MAT + ACCESS_RW, arr.data(), Size(1, _N)); }
+#endif
+
template<typename _Tp> inline
_InputOutputArray::_InputOutputArray(const std::vector<std::vector<_Tp> >& vec)
{ init(FIXED_TYPE + FIXED_SIZE + STD_VECTOR_VECTOR + DataType<_Tp>::type + ACCESS_RW, &vec); }
Mat((int)vec.size(), 1, DataType<_Tp>::type, (uchar*)&vec[0]).copyTo(*this);
}
+#ifdef CV_CXX_STD_ARRAY
+template<typename _Tp, std::size_t _N> inline
+Mat::Mat(const std::array<_Tp, _N>& arr, bool copyData)
+ : flags(MAGIC_VAL | DataType<_Tp>::type | CV_MAT_CONT_FLAG), dims(2), rows((int)arr.size()),
+ cols(1), data(0), datastart(0), dataend(0), allocator(0), u(0), size(&rows)
+{
+ if(arr.empty())
+ return;
+ if( !copyData )
+ {
+ step[0] = step[1] = sizeof(_Tp);
+ datastart = data = (uchar*)arr.data();
+ datalimit = dataend = datastart + rows * step[0];
+ }
+ else
+ Mat((int)arr.size(), 1, DataType<_Tp>::type, (uchar*)arr.data()).copyTo(*this);
+}
+#endif
+
template<typename _Tp, int n> inline
Mat::Mat(const Vec<_Tp, n>& vec, bool copyData)
: flags(MAGIC_VAL | DataType<_Tp>::type | CV_MAT_CONT_FLAG), dims(2), rows(n), cols(1), data(0),
return v;
}
+#ifdef CV_CXX_STD_ARRAY
+template<typename _Tp, std::size_t _N> inline
+Mat::operator std::array<_Tp, _N>() const
+{
+ std::array<_Tp, _N> v;
+ copyTo(v);
+ return v;
+}
+#endif
+
template<typename _Tp, int n> inline
Mat::operator Vec<_Tp, n>() const
{
: Mat(vec, copyData)
{}
+#ifdef CV_CXX_STD_ARRAY
+template<typename _Tp> template<std::size_t _N> inline
+Mat_<_Tp>::Mat_(const std::array<_Tp, _N>& arr, bool copyData)
+ : Mat(arr, copyData)
+{}
+#endif
+
template<typename _Tp> inline
Mat_<_Tp>& Mat_<_Tp>::operator = (const Mat& m)
{
return v;
}
+#ifdef CV_CXX_STD_ARRAY
+template<typename _Tp> template<std::size_t _N> inline
+Mat_<_Tp>::operator std::array<_Tp, _N>() const
+{
+ std::array<_Tp, _N> a;
+ copyTo(a);
+ return a;
+}
+#endif
+
template<typename _Tp> template<int n> inline
Mat_<_Tp>::operator Vec<typename DataType<_Tp>::channel_type, n>() const
{
Mat((int)vec.size(), 1, DataType<_Tp>::type, (uchar*)&vec[0]).copyTo(*this);
}
-
inline
UMat& UMat::operator = (const UMat& m)
{
ocl_mixChannels(src, dst, fromTo, npairs))
bool src_is_mat = src.kind() != _InputArray::STD_VECTOR_MAT &&
+ src.kind() != _InputArray::STD_ARRAY_MAT &&
src.kind() != _InputArray::STD_VECTOR_VECTOR &&
src.kind() != _InputArray::STD_VECTOR_UMAT;
bool dst_is_mat = dst.kind() != _InputArray::STD_VECTOR_MAT &&
+ dst.kind() != _InputArray::STD_ARRAY_MAT &&
dst.kind() != _InputArray::STD_VECTOR_VECTOR &&
dst.kind() != _InputArray::STD_VECTOR_UMAT;
int i;
ocl_mixChannels(src, dst, &fromTo[0], fromTo.size()>>1))
bool src_is_mat = src.kind() != _InputArray::STD_VECTOR_MAT &&
+ src.kind() != _InputArray::STD_ARRAY_MAT &&
src.kind() != _InputArray::STD_VECTOR_VECTOR &&
src.kind() != _InputArray::STD_VECTOR_UMAT;
bool dst_is_mat = dst.kind() != _InputArray::STD_VECTOR_MAT &&
+ dst.kind() != _InputArray::STD_ARRAY_MAT &&
dst.kind() != _InputArray::STD_VECTOR_VECTOR &&
dst.kind() != _InputArray::STD_VECTOR_UMAT;
int i;
static Mat asRowMatrix(InputArrayOfArrays src, int rtype, double alpha=1, double beta=0) {
// make sure the input data is a vector of matrices or vector of vector
- if(src.kind() != _InputArray::STD_VECTOR_MAT && src.kind() != _InputArray::STD_VECTOR_VECTOR) {
+ if(src.kind() != _InputArray::STD_VECTOR_MAT && src.kind() != _InputArray::STD_ARRAY_MAT &&
+ src.kind() != _InputArray::STD_VECTOR_VECTOR) {
String error_message = "The data is expected as InputArray::STD_VECTOR_MAT (a std::vector<Mat>) or _InputArray::STD_VECTOR_VECTOR (a std::vector< std::vector<...> >).";
CV_Error(Error::StsBadArg, error_message);
}
void LDA::compute(InputArrayOfArrays _src, InputArray _lbls) {
switch(_src.kind()) {
case _InputArray::STD_VECTOR_MAT:
+ case _InputArray::STD_ARRAY_MAT:
lda(asRowMatrix(_src, CV_64FC1), _lbls);
break;
case _InputArray::MAT:
{
CV_INSTRUMENT_REGION()
- if(_src.kind() == _InputArray::STD_VECTOR_MAT)
+ if(_src.kind() == _InputArray::STD_VECTOR_MAT || _src.kind() == _InputArray::STD_ARRAY_MAT)
{
std::vector<cv::Mat> src;
_src.getMatVector(src);
return (Mat)*((const MatExpr*)obj);
}
- if( k == MATX )
+ if( k == MATX || k == STD_ARRAY )
{
CV_Assert( i < 0 );
return Mat(sz, flags, obj);
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;
return;
}
- if( k == MATX )
+ if( k == MATX || k == STD_ARRAY )
{
size_t n = sz.height, esz = CV_ELEM_SIZE(flags);
mv.resize(n);
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;
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;
return ((const UMat*)obj)->size();
}
- if( k == MATX )
+ if( k == MATX || k == STD_ARRAY )
{
CV_Assert( i < 0 );
return sz;
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;
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;
return ((const UMat*)obj)->dims;
}
- if( k == MATX )
+ if( k == MATX || k == STD_ARRAY )
{
CV_Assert( i < 0 );
return 2;
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;
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 )
{
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 )
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;
if( k == EXPR )
return false;
- if( k == MATX )
+ if( k == MATX || k == STD_ARRAY )
return false;
if( k == STD_VECTOR )
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;
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;
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;
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;
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;
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;
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;
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;
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;
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);
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);
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) );
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;
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
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);
ASSERT_EQ(3, sub_mat.size[1]);
ASSERT_EQ(2, sub_mat.size[2]);
}
+
+#ifdef CV_CXX_STD_ARRAY
+TEST(Core_Mat_array, outputArray_create_getMat)
+{
+ cv::Mat_<uchar> src_base(5, 1);
+ std::array<uchar, 5> dst8;
+
+ src_base << 1, 2, 3, 4, 5;
+
+ Mat src(src_base);
+ OutputArray _dst(dst8);
+
+ {
+ _dst.create(src.rows, src.cols, src.type());
+ Mat dst = _dst.getMat();
+ EXPECT_EQ(src.dims, dst.dims);
+ EXPECT_EQ(src.cols, dst.cols);
+ EXPECT_EQ(src.rows, dst.rows);
+ }
+}
+
+TEST(Core_Mat_array, copyTo_roi_column)
+{
+ cv::Mat_<uchar> src_base(5, 2);
+
+ src_base << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;
+
+ Mat src_full(src_base);
+ Mat src(src_full.col(0));
+
+ std::array<uchar, 5> dst1;
+ src.copyTo(dst1);
+ std::cout << "src = " << src << std::endl;
+ std::cout << "dst = " << Mat(dst1) << std::endl;
+ EXPECT_EQ((size_t)5, dst1.size());
+ EXPECT_EQ(1, (int)dst1[0]);
+ EXPECT_EQ(3, (int)dst1[1]);
+ EXPECT_EQ(5, (int)dst1[2]);
+ EXPECT_EQ(7, (int)dst1[3]);
+ EXPECT_EQ(9, (int)dst1[4]);
+}
+
+TEST(Core_Mat_array, copyTo_roi_row)
+{
+ cv::Mat_<uchar> src_base(2, 5);
+ std::array<uchar, 5> dst1;
+
+ src_base << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;
+
+ Mat src_full(src_base);
+ Mat src(src_full.row(0));
+ OutputArray _dst(dst1);
+ {
+ _dst.create(5, 1, src.type());
+ Mat dst = _dst.getMat();
+ EXPECT_EQ(src.dims, dst.dims);
+ EXPECT_EQ(1, dst.cols);
+ EXPECT_EQ(5, dst.rows);
+ }
+
+ std::array<uchar, 5> dst2;
+ src.copyTo(dst2);
+ std::cout << "src = " << src << std::endl;
+ std::cout << "dst = " << Mat(dst2) << std::endl;
+ EXPECT_EQ(1, (int)dst2[0]);
+ EXPECT_EQ(2, (int)dst2[1]);
+ EXPECT_EQ(3, (int)dst2[2]);
+ EXPECT_EQ(4, (int)dst2[3]);
+ EXPECT_EQ(5, (int)dst2[4]);
+}
+
+TEST(Core_Mat_array, SplitMerge)
+{
+ std::array<cv::Mat, 3> src;
+ for(size_t i=0; i<src.size(); ++i) {
+ src[i].create(10, 10, CV_8U);
+ src[i] = 127 * i;
+ }
+
+ Mat merged;
+ merge(src, merged);
+
+ std::array<cv::Mat, 3> dst;
+ split(merged, dst);
+
+ Mat diff;
+ for(size_t i=0; i<dst.size(); ++i) {
+ absdiff(src[i], dst[i], diff);
+ EXPECT_EQ(0, countNonZero(diff));
+ }
+}
+#endif
\ No newline at end of file