Merge pull request #1663 from vpisarev:ocl_experiments3
This commit is contained in:
commit
616db74e49
@ -12,7 +12,10 @@ if(WIN32 AND NOT PYTHON_EXECUTABLE)
|
||||
)
|
||||
endforeach()
|
||||
endif()
|
||||
find_host_package(PythonInterp 2.7)
|
||||
if(NOT PYTHONINTERP_FOUND)
|
||||
find_host_package(PythonInterp "${MIN_VER_PYTHON}")
|
||||
endif()
|
||||
|
||||
unset(HAVE_SPHINX CACHE)
|
||||
|
||||
|
@ -378,7 +378,7 @@ Calculates the covariance matrix of a set of vectors.
|
||||
|
||||
.. ocv:function:: void calcCovarMatrix( const Mat* samples, int nsamples, Mat& covar, Mat& mean, int flags, int ctype=CV_64F)
|
||||
|
||||
.. ocv:function:: void calcCovarMatrix( InputArray samples, OutputArray covar, OutputArray mean, int flags, int ctype=CV_64F)
|
||||
.. ocv:function:: void calcCovarMatrix( InputArray samples, OutputArray covar, InputOutputArray mean, int flags, int ctype=CV_64F)
|
||||
|
||||
.. ocv:pyfunction:: cv2.calcCovarMatrix(samples, flags[, covar[, mean[, ctype]]]) -> covar, mean
|
||||
|
||||
|
@ -158,6 +158,9 @@ enum { REDUCE_SUM = 0,
|
||||
//! swaps two matrices
|
||||
CV_EXPORTS void swap(Mat& a, Mat& b);
|
||||
|
||||
//! swaps two umatrices
|
||||
CV_EXPORTS void swap( UMat& a, UMat& b );
|
||||
|
||||
//! 1D interpolation function: returns coordinate of the "donor" pixel for the specified location p.
|
||||
CV_EXPORTS_W int borderInterpolate(int p, int len, int borderType);
|
||||
|
||||
@ -439,7 +442,7 @@ CV_EXPORTS void calcCovarMatrix( const Mat* samples, int nsamples, Mat& covar, M
|
||||
|
||||
//! computes covariation matrix of a set of samples
|
||||
CV_EXPORTS_W void calcCovarMatrix( InputArray samples, OutputArray covar,
|
||||
OutputArray mean, int flags, int ctype = CV_64F);
|
||||
InputOutputArray mean, int flags, int ctype = CV_64F);
|
||||
|
||||
CV_EXPORTS_W void PCACompute(InputArray data, InputOutputArray mean,
|
||||
OutputArray eigenvectors, int maxComponents = 0);
|
||||
|
@ -472,6 +472,9 @@ class CV_EXPORTS RNG;
|
||||
class CV_EXPORTS Mat;
|
||||
class CV_EXPORTS MatExpr;
|
||||
|
||||
class CV_EXPORTS UMat;
|
||||
class CV_EXPORTS UMatExpr;
|
||||
|
||||
class CV_EXPORTS SparseMat;
|
||||
typedef Mat MatND;
|
||||
|
||||
|
@ -595,7 +595,7 @@ namespace cv {
|
||||
|
||||
inline
|
||||
Mat::Mat(const cuda::GpuMat& m)
|
||||
: flags(0), dims(0), rows(0), cols(0), data(0), refcount(0), datastart(0), dataend(0), datalimit(0), allocator(0), size(&rows)
|
||||
: flags(0), dims(0), rows(0), cols(0), data(0), datastart(0), dataend(0), datalimit(0), allocator(0), u(0), size(&rows)
|
||||
{
|
||||
m.download(*this);
|
||||
}
|
||||
|
@ -55,6 +55,9 @@
|
||||
namespace cv
|
||||
{
|
||||
|
||||
enum { ACCESS_READ=1<<24, ACCESS_WRITE=1<<25,
|
||||
ACCESS_RW=3<<24, ACCESS_MASK=ACCESS_RW, ACCESS_FAST=1<<26 };
|
||||
|
||||
//////////////////////// Input/Output Array Arguments /////////////////////////////////
|
||||
|
||||
/*!
|
||||
@ -67,7 +70,7 @@ public:
|
||||
KIND_SHIFT = 16,
|
||||
FIXED_TYPE = 0x8000 << KIND_SHIFT,
|
||||
FIXED_SIZE = 0x4000 << KIND_SHIFT,
|
||||
KIND_MASK = ~(FIXED_TYPE|FIXED_SIZE) - (1 << KIND_SHIFT) + 1,
|
||||
KIND_MASK = 31 << KIND_SHIFT,
|
||||
|
||||
NONE = 0 << KIND_SHIFT,
|
||||
MAT = 1 << KIND_SHIFT,
|
||||
@ -79,10 +82,14 @@ public:
|
||||
OPENGL_BUFFER = 7 << KIND_SHIFT,
|
||||
CUDA_MEM = 8 << KIND_SHIFT,
|
||||
GPU_MAT = 9 << KIND_SHIFT,
|
||||
OCL_MAT =10 << KIND_SHIFT
|
||||
OCL_MAT =10 << KIND_SHIFT,
|
||||
UMAT =11 << KIND_SHIFT,
|
||||
STD_VECTOR_UMAT =12 << KIND_SHIFT,
|
||||
UEXPR =13 << KIND_SHIFT
|
||||
};
|
||||
|
||||
_InputArray();
|
||||
_InputArray(int _flags, void* _obj);
|
||||
_InputArray(const Mat& m);
|
||||
_InputArray(const MatExpr& expr);
|
||||
_InputArray(const std::vector<Mat>& vec);
|
||||
@ -97,11 +104,16 @@ public:
|
||||
_InputArray(const ogl::Buffer& buf);
|
||||
_InputArray(const cuda::CudaMem& cuda_mem);
|
||||
template<typename _Tp> _InputArray(const cudev::GpuMat_<_Tp>& m);
|
||||
_InputArray(const UMat& um);
|
||||
_InputArray(const std::vector<UMat>& umv);
|
||||
_InputArray(const UMatExpr& uexpr);
|
||||
|
||||
virtual Mat getMat(int i=-1) const;
|
||||
virtual Mat getMat(int idx=-1) const;
|
||||
virtual UMat getUMat(int idx=-1) const;
|
||||
virtual void getMatVector(std::vector<Mat>& mv) const;
|
||||
virtual cuda::GpuMat getGpuMat() const;
|
||||
virtual ogl::Buffer getOGlBuffer() const;
|
||||
void* getObj() const;
|
||||
|
||||
virtual int kind() const;
|
||||
virtual Size size(int i=-1) const;
|
||||
@ -113,9 +125,13 @@ public:
|
||||
|
||||
virtual ~_InputArray();
|
||||
|
||||
protected:
|
||||
int flags;
|
||||
void* obj;
|
||||
Size sz;
|
||||
|
||||
void init(int _flags, const void* _obj);
|
||||
void init(int _flags, const void* _obj, Size _sz);
|
||||
};
|
||||
|
||||
|
||||
@ -140,6 +156,7 @@ public:
|
||||
};
|
||||
|
||||
_OutputArray();
|
||||
_OutputArray(int _flags, void* _obj);
|
||||
_OutputArray(Mat& m);
|
||||
_OutputArray(std::vector<Mat>& vec);
|
||||
_OutputArray(cuda::GpuMat& d_mat);
|
||||
@ -152,6 +169,8 @@ public:
|
||||
template<typename _Tp> _OutputArray(Mat_<_Tp>& m);
|
||||
template<typename _Tp> _OutputArray(_Tp* vec, int n);
|
||||
template<typename _Tp, int m, int n> _OutputArray(Matx<_Tp, m, n>& matx);
|
||||
_OutputArray(UMat& m);
|
||||
_OutputArray(std::vector<UMat>& vec);
|
||||
|
||||
_OutputArray(const Mat& m);
|
||||
_OutputArray(const std::vector<Mat>& vec);
|
||||
@ -165,6 +184,8 @@ public:
|
||||
template<typename _Tp> _OutputArray(const Mat_<_Tp>& m);
|
||||
template<typename _Tp> _OutputArray(const _Tp* vec, int n);
|
||||
template<typename _Tp, int m, int n> _OutputArray(const Matx<_Tp, m, n>& matx);
|
||||
_OutputArray(const UMat& m);
|
||||
_OutputArray(const std::vector<UMat>& vec);
|
||||
|
||||
virtual bool fixedSize() const;
|
||||
virtual bool fixedType() const;
|
||||
@ -178,23 +199,58 @@ public:
|
||||
virtual void create(int dims, const int* size, int type, int i=-1, bool allowTransposed=false, int fixedDepthMask=0) const;
|
||||
virtual void release() const;
|
||||
virtual void clear() const;
|
||||
};
|
||||
|
||||
virtual ~_OutputArray();
|
||||
|
||||
class CV_EXPORTS _InputOutputArray : public _OutputArray
|
||||
{
|
||||
public:
|
||||
_InputOutputArray();
|
||||
_InputOutputArray(int _flags, void* _obj);
|
||||
_InputOutputArray(Mat& m);
|
||||
_InputOutputArray(std::vector<Mat>& vec);
|
||||
_InputOutputArray(cuda::GpuMat& d_mat);
|
||||
_InputOutputArray(ogl::Buffer& buf);
|
||||
_InputOutputArray(cuda::CudaMem& cuda_mem);
|
||||
template<typename _Tp> _InputOutputArray(cudev::GpuMat_<_Tp>& m);
|
||||
template<typename _Tp> _InputOutputArray(std::vector<_Tp>& vec);
|
||||
template<typename _Tp> _InputOutputArray(std::vector<std::vector<_Tp> >& vec);
|
||||
template<typename _Tp> _InputOutputArray(std::vector<Mat_<_Tp> >& vec);
|
||||
template<typename _Tp> _InputOutputArray(Mat_<_Tp>& m);
|
||||
template<typename _Tp> _InputOutputArray(_Tp* vec, int n);
|
||||
template<typename _Tp, int m, int n> _InputOutputArray(Matx<_Tp, m, n>& matx);
|
||||
_InputOutputArray(UMat& m);
|
||||
_InputOutputArray(std::vector<UMat>& vec);
|
||||
|
||||
_InputOutputArray(const Mat& m);
|
||||
_InputOutputArray(const std::vector<Mat>& vec);
|
||||
_InputOutputArray(const cuda::GpuMat& d_mat);
|
||||
_InputOutputArray(const ogl::Buffer& buf);
|
||||
_InputOutputArray(const cuda::CudaMem& cuda_mem);
|
||||
template<typename _Tp> _InputOutputArray(const cudev::GpuMat_<_Tp>& m);
|
||||
template<typename _Tp> _InputOutputArray(const std::vector<_Tp>& vec);
|
||||
template<typename _Tp> _InputOutputArray(const std::vector<std::vector<_Tp> >& vec);
|
||||
template<typename _Tp> _InputOutputArray(const std::vector<Mat_<_Tp> >& vec);
|
||||
template<typename _Tp> _InputOutputArray(const Mat_<_Tp>& m);
|
||||
template<typename _Tp> _InputOutputArray(const _Tp* vec, int n);
|
||||
template<typename _Tp, int m, int n> _InputOutputArray(const Matx<_Tp, m, n>& matx);
|
||||
_InputOutputArray(const UMat& m);
|
||||
_InputOutputArray(const std::vector<UMat>& vec);
|
||||
};
|
||||
|
||||
typedef const _InputArray& InputArray;
|
||||
typedef InputArray InputArrayOfArrays;
|
||||
typedef const _OutputArray& OutputArray;
|
||||
typedef OutputArray OutputArrayOfArrays;
|
||||
typedef OutputArray InputOutputArray;
|
||||
typedef OutputArray InputOutputArrayOfArrays;
|
||||
|
||||
CV_EXPORTS OutputArray noArray();
|
||||
|
||||
typedef const _InputOutputArray& InputOutputArray;
|
||||
typedef InputOutputArray InputOutputArrayOfArrays;
|
||||
|
||||
CV_EXPORTS InputOutputArray noArray();
|
||||
|
||||
/////////////////////////////////// MatAllocator //////////////////////////////////////
|
||||
|
||||
struct CV_EXPORTS UMatData;
|
||||
|
||||
/*!
|
||||
Custom array allocator
|
||||
|
||||
@ -204,11 +260,27 @@ class CV_EXPORTS MatAllocator
|
||||
public:
|
||||
MatAllocator() {}
|
||||
virtual ~MatAllocator() {}
|
||||
virtual void allocate(int dims, const int* sizes, int type, int*& refcount,
|
||||
uchar*& datastart, uchar*& data, size_t* step) = 0;
|
||||
virtual void deallocate(int* refcount, uchar* datastart, uchar* data) = 0;
|
||||
};
|
||||
|
||||
// let's comment it off for now to detect and fix all the uses of allocator
|
||||
//virtual void allocate(int dims, const int* sizes, int type, int*& refcount,
|
||||
// uchar*& datastart, uchar*& data, size_t* step) = 0;
|
||||
//virtual void deallocate(int* refcount, uchar* datastart, uchar* data) = 0;
|
||||
virtual UMatData* allocate(int dims, const int* sizes,
|
||||
int type, size_t* step) const = 0;
|
||||
virtual bool allocate(UMatData* data, int accessflags) const = 0;
|
||||
virtual void deallocate(UMatData* data) const = 0;
|
||||
virtual void map(UMatData* data, int accessflags) const = 0;
|
||||
virtual void unmap(UMatData* data) const = 0;
|
||||
virtual void download(UMatData* data, void* dst, int dims, const size_t sz[],
|
||||
const size_t srcofs[], const size_t srcstep[],
|
||||
const size_t dststep[]) const = 0;
|
||||
virtual void upload(UMatData* data, const void* src, int dims, const size_t sz[],
|
||||
const size_t dstofs[], const size_t dststep[],
|
||||
const size_t srcstep[]) const = 0;
|
||||
virtual void copy(UMatData* srcdata, UMatData* dstdata, int dims, const size_t sz[],
|
||||
const size_t srcofs[], const size_t srcstep[],
|
||||
const size_t dstofs[], const size_t dststep[], bool sync) const = 0;
|
||||
};
|
||||
|
||||
|
||||
//////////////////////////////// MatCommaInitializer //////////////////////////////////
|
||||
@ -240,11 +312,81 @@ protected:
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
/////////////////////////////////////// Mat ///////////////////////////////////////////
|
||||
|
||||
/*!
|
||||
// note that umatdata might be allocated together
|
||||
// with the matrix data, not as a separate object.
|
||||
// therefore, it does not have constructor or destructor;
|
||||
// it should be explicitly initialized using init().
|
||||
struct CV_EXPORTS UMatData
|
||||
{
|
||||
enum { COPY_ON_MAP=1, HOST_COPY_OBSOLETE=2,
|
||||
DEVICE_COPY_OBSOLETE=4, TEMP_UMAT=8, TEMP_COPIED_UMAT=24 };
|
||||
UMatData(const MatAllocator* allocator);
|
||||
|
||||
// provide atomic access to the structure
|
||||
void lock();
|
||||
void unlock();
|
||||
|
||||
bool hostCopyObsolete() const;
|
||||
bool deviceCopyObsolete() const;
|
||||
bool copyOnMap() const;
|
||||
bool tempUMat() const;
|
||||
bool tempCopiedUMat() const;
|
||||
void markHostCopyObsolete(bool flag);
|
||||
void markDeviceCopyObsolete(bool flag);
|
||||
|
||||
const MatAllocator* prevAllocator;
|
||||
const MatAllocator* currAllocator;
|
||||
int urefcount;
|
||||
int refcount;
|
||||
uchar* data;
|
||||
uchar* origdata;
|
||||
size_t size;
|
||||
|
||||
int flags;
|
||||
void* handle;
|
||||
void* userdata;
|
||||
};
|
||||
|
||||
|
||||
struct CV_EXPORTS UMatDataAutoLock
|
||||
{
|
||||
UMatDataAutoLock(UMatData* u);
|
||||
~UMatDataAutoLock();
|
||||
UMatData* u;
|
||||
};
|
||||
|
||||
|
||||
struct CV_EXPORTS MatSize
|
||||
{
|
||||
MatSize(int* _p);
|
||||
Size operator()() const;
|
||||
const int& operator[](int i) const;
|
||||
int& operator[](int i);
|
||||
operator const int*() const;
|
||||
bool operator == (const MatSize& sz) const;
|
||||
bool operator != (const MatSize& sz) const;
|
||||
|
||||
int* p;
|
||||
};
|
||||
|
||||
struct CV_EXPORTS MatStep
|
||||
{
|
||||
MatStep();
|
||||
MatStep(size_t s);
|
||||
const size_t& operator[](int i) const;
|
||||
size_t& operator[](int i);
|
||||
operator size_t() const;
|
||||
MatStep& operator = (size_t s);
|
||||
|
||||
size_t* p;
|
||||
size_t buf[2];
|
||||
protected:
|
||||
MatStep& operator = (const MatStep&);
|
||||
};
|
||||
|
||||
/*!
|
||||
The n-dimensional matrix class.
|
||||
|
||||
The class represents an n-dimensional dense numerical array that can act as
|
||||
@ -497,14 +639,6 @@ public:
|
||||
//! builds matrix from comma initializer
|
||||
template<typename _Tp> explicit Mat(const MatCommaInitializer_<_Tp>& commaInitializer);
|
||||
|
||||
// //! converts old-style CvMat to the new matrix; the data is not copied by default
|
||||
// Mat(const CvMat* m, bool copyData=false);
|
||||
// //! converts old-style CvMatND to the new matrix; the data is not copied by default
|
||||
// Mat(const CvMatND* m, bool copyData=false);
|
||||
// //! converts old-style IplImage to the new matrix; the data is not copied by default
|
||||
// Mat(const IplImage* img, bool copyData=false);
|
||||
//Mat(const void* img, bool copyData=false);
|
||||
|
||||
//! download data from GpuMat
|
||||
explicit Mat(const cuda::GpuMat& m);
|
||||
|
||||
@ -514,6 +648,9 @@ public:
|
||||
Mat& operator = (const Mat& m);
|
||||
Mat& operator = (const MatExpr& expr);
|
||||
|
||||
//! retrieve UMat from Mat
|
||||
UMat getUMat(int accessFlags) const;
|
||||
|
||||
//! returns a new matrix header for the specified row
|
||||
Mat row(int y) const;
|
||||
//! returns a new matrix header for the specified column
|
||||
@ -737,10 +874,6 @@ public:
|
||||
//! pointer to the data
|
||||
uchar* data;
|
||||
|
||||
//! pointer to the reference counter;
|
||||
// when matrix points to user-allocated data, the pointer is NULL
|
||||
int* refcount;
|
||||
|
||||
//! helper fields used in locateROI and adjustROI
|
||||
uchar* datastart;
|
||||
uchar* dataend;
|
||||
@ -748,37 +881,14 @@ public:
|
||||
|
||||
//! custom allocator
|
||||
MatAllocator* allocator;
|
||||
//! and the standard allocator
|
||||
static MatAllocator* getStdAllocator();
|
||||
|
||||
struct CV_EXPORTS MSize
|
||||
{
|
||||
MSize(int* _p);
|
||||
Size operator()() const;
|
||||
const int& operator[](int i) const;
|
||||
int& operator[](int i);
|
||||
operator const int*() const;
|
||||
bool operator == (const MSize& sz) const;
|
||||
bool operator != (const MSize& sz) const;
|
||||
//! interaction with UMat
|
||||
UMatData* u;
|
||||
|
||||
int* p;
|
||||
};
|
||||
|
||||
struct CV_EXPORTS MStep
|
||||
{
|
||||
MStep();
|
||||
MStep(size_t s);
|
||||
const size_t& operator[](int i) const;
|
||||
size_t& operator[](int i);
|
||||
operator size_t() const;
|
||||
MStep& operator = (size_t s);
|
||||
|
||||
size_t* p;
|
||||
size_t buf[2];
|
||||
protected:
|
||||
MStep& operator = (const MStep&);
|
||||
};
|
||||
|
||||
MSize size;
|
||||
MStep step;
|
||||
MatSize size;
|
||||
MatStep step;
|
||||
|
||||
protected:
|
||||
};
|
||||
@ -1001,6 +1111,205 @@ typedef Mat_<Vec3d> Mat3d;
|
||||
typedef Mat_<Vec4d> Mat4d;
|
||||
|
||||
|
||||
class CV_EXPORTS UMatExpr;
|
||||
|
||||
class CV_EXPORTS UMat
|
||||
{
|
||||
public:
|
||||
//! default constructor
|
||||
UMat();
|
||||
//! constructs 2D matrix of the specified size and type
|
||||
// (_type is CV_8UC1, CV_64FC3, CV_32SC(12) etc.)
|
||||
UMat(int rows, int cols, int type);
|
||||
UMat(Size size, int type);
|
||||
//! constucts 2D matrix and fills it with the specified value _s.
|
||||
UMat(int rows, int cols, int type, const Scalar& s);
|
||||
UMat(Size size, int type, const Scalar& s);
|
||||
|
||||
//! constructs n-dimensional matrix
|
||||
UMat(int ndims, const int* sizes, int type);
|
||||
UMat(int ndims, const int* sizes, int type, const Scalar& s);
|
||||
|
||||
//! copy constructor
|
||||
UMat(const UMat& m);
|
||||
|
||||
//! creates a matrix header for a part of the bigger matrix
|
||||
UMat(const UMat& m, const Range& rowRange, const Range& colRange=Range::all());
|
||||
UMat(const UMat& m, const Rect& roi);
|
||||
UMat(const UMat& m, const 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
|
||||
template<typename _Tp, int m, int n> explicit UMat(const Matx<_Tp, m, n>& mtx, bool copyData=true);
|
||||
//! builds matrix from a 2D point
|
||||
template<typename _Tp> explicit UMat(const Point_<_Tp>& pt, bool copyData=true);
|
||||
//! builds matrix from a 3D point
|
||||
template<typename _Tp> explicit UMat(const Point3_<_Tp>& pt, bool copyData=true);
|
||||
//! builds matrix from comma initializer
|
||||
template<typename _Tp> explicit UMat(const MatCommaInitializer_<_Tp>& commaInitializer);
|
||||
|
||||
//! destructor - calls release()
|
||||
~UMat();
|
||||
//! assignment operators
|
||||
UMat& operator = (const UMat& m);
|
||||
UMat& operator = (const UMatExpr& expr);
|
||||
|
||||
Mat getMat(int flags) const;
|
||||
|
||||
//! returns a new matrix header for the specified row
|
||||
UMat row(int y) const;
|
||||
//! returns a new matrix header for the specified column
|
||||
UMat col(int x) const;
|
||||
//! ... for the specified row span
|
||||
UMat rowRange(int startrow, int endrow) const;
|
||||
UMat rowRange(const Range& r) const;
|
||||
//! ... for the specified column span
|
||||
UMat colRange(int startcol, int endcol) const;
|
||||
UMat colRange(const Range& r) const;
|
||||
//! ... for the specified diagonal
|
||||
// (d=0 - the main diagonal,
|
||||
// >0 - a diagonal from the lower half,
|
||||
// <0 - a diagonal from the upper half)
|
||||
UMat diag(int d=0) const;
|
||||
//! constructs a square diagonal matrix which main diagonal is vector "d"
|
||||
static UMat diag(const UMat& d);
|
||||
|
||||
//! returns deep copy of the matrix, i.e. the data is copied
|
||||
UMat clone() const;
|
||||
//! copies the matrix content to "m".
|
||||
// It calls m.create(this->size(), this->type()).
|
||||
void copyTo( OutputArray m ) const;
|
||||
//! copies those matrix elements to "m" that are marked with non-zero mask elements.
|
||||
void copyTo( OutputArray m, InputArray mask ) const;
|
||||
//! converts matrix to another datatype with optional scalng. See cvConvertScale.
|
||||
void convertTo( OutputArray m, int rtype, double alpha=1, double beta=0 ) const;
|
||||
|
||||
void assignTo( UMat& m, int type=-1 ) const;
|
||||
|
||||
//! sets every matrix element to s
|
||||
UMat& operator = (const Scalar& s);
|
||||
//! sets some of the matrix elements to s, according to the mask
|
||||
UMat& setTo(InputArray value, InputArray mask=noArray());
|
||||
//! creates alternative matrix header for the same data, with different
|
||||
// number of channels and/or different number of rows. see cvReshape.
|
||||
UMat reshape(int cn, int rows=0) const;
|
||||
UMat reshape(int cn, int newndims, const int* newsz) const;
|
||||
|
||||
//! matrix transposition by means of matrix expressions
|
||||
UMatExpr t() const;
|
||||
//! matrix inversion by means of matrix expressions
|
||||
UMatExpr inv(int method=DECOMP_LU) const;
|
||||
//! per-element matrix multiplication by means of matrix expressions
|
||||
UMatExpr mul(InputArray m, double scale=1) const;
|
||||
|
||||
//! computes cross-product of 2 3D vectors
|
||||
UMat cross(InputArray m) const;
|
||||
//! computes dot-product
|
||||
double dot(InputArray m) const;
|
||||
|
||||
//! Matlab-style matrix initialization
|
||||
static UMatExpr zeros(int rows, int cols, int type);
|
||||
static UMatExpr zeros(Size size, int type);
|
||||
static UMatExpr zeros(int ndims, const int* sz, int type);
|
||||
static UMatExpr ones(int rows, int cols, int type);
|
||||
static UMatExpr ones(Size size, int type);
|
||||
static UMatExpr ones(int ndims, const int* sz, int type);
|
||||
static UMatExpr eye(int rows, int cols, int type);
|
||||
static UMatExpr eye(Size size, int type);
|
||||
|
||||
//! allocates new matrix data unless the matrix already has specified size and type.
|
||||
// previous data is unreferenced if needed.
|
||||
void create(int rows, int cols, int type);
|
||||
void create(Size size, int type);
|
||||
void create(int ndims, const int* sizes, int type);
|
||||
|
||||
//! increases the reference counter; use with care to avoid memleaks
|
||||
void addref();
|
||||
//! decreases reference counter;
|
||||
// deallocates the data when reference counter reaches 0.
|
||||
void release();
|
||||
|
||||
//! deallocates the matrix data
|
||||
void deallocate();
|
||||
//! internal use function; properly re-allocates _size, _step arrays
|
||||
void copySize(const UMat& m);
|
||||
|
||||
//! locates matrix header within a parent matrix. See below
|
||||
void locateROI( Size& wholeSize, Point& ofs ) const;
|
||||
//! moves/resizes the current matrix ROI inside the parent matrix.
|
||||
UMat& adjustROI( int dtop, int dbottom, int dleft, int dright );
|
||||
//! extracts a rectangular sub-matrix
|
||||
// (this is a generalized form of row, rowRange etc.)
|
||||
UMat operator()( Range rowRange, Range colRange ) const;
|
||||
UMat operator()( const Rect& roi ) const;
|
||||
UMat operator()( const Range* ranges ) const;
|
||||
|
||||
//! returns true iff the matrix data is continuous
|
||||
// (i.e. when there are no gaps between successive rows).
|
||||
// similar to CV_IS_MAT_CONT(cvmat->type)
|
||||
bool isContinuous() const;
|
||||
|
||||
//! returns true if the matrix is a submatrix of another matrix
|
||||
bool isSubmatrix() const;
|
||||
|
||||
//! returns element size in bytes,
|
||||
// similar to CV_ELEM_SIZE(cvmat->type)
|
||||
size_t elemSize() const;
|
||||
//! returns the size of element channel in bytes.
|
||||
size_t elemSize1() const;
|
||||
//! returns element type, similar to CV_MAT_TYPE(cvmat->type)
|
||||
int type() const;
|
||||
//! returns element type, similar to CV_MAT_DEPTH(cvmat->type)
|
||||
int depth() const;
|
||||
//! returns element type, similar to CV_MAT_CN(cvmat->type)
|
||||
int channels() const;
|
||||
//! returns step/elemSize1()
|
||||
size_t step1(int i=0) const;
|
||||
//! returns true if matrix data is NULL
|
||||
bool empty() const;
|
||||
//! returns the total number of matrix elements
|
||||
size_t total() const;
|
||||
|
||||
//! returns N if the matrix is 1-channel (N x ptdim) or ptdim-channel (1 x N) or (N x 1); negative number otherwise
|
||||
int checkVector(int elemChannels, int depth=-1, bool requireContinuous=true) const;
|
||||
|
||||
void* handle(int accessFlags) const;
|
||||
void ndoffset(size_t* ofs) const;
|
||||
|
||||
enum { MAGIC_VAL = 0x42FF0000, AUTO_STEP = 0, CONTINUOUS_FLAG = CV_MAT_CONT_FLAG, SUBMATRIX_FLAG = CV_SUBMAT_FLAG };
|
||||
enum { MAGIC_MASK = 0xFFFF0000, TYPE_MASK = 0x00000FFF, DEPTH_MASK = 7 };
|
||||
|
||||
/*! includes several bit-fields:
|
||||
- the magic signature
|
||||
- continuity flag
|
||||
- depth
|
||||
- number of channels
|
||||
*/
|
||||
int flags;
|
||||
//! the matrix dimensionality, >= 2
|
||||
int dims;
|
||||
//! the number of rows and columns or (-1, -1) when the matrix has more than 2 dimensions
|
||||
int rows, cols;
|
||||
|
||||
//! custom allocator
|
||||
MatAllocator* allocator;
|
||||
//! and the standard allocator
|
||||
static MatAllocator* getStdAllocator();
|
||||
|
||||
// black-box container of UMat data
|
||||
UMatData* u;
|
||||
|
||||
// offset of the submatrix (or 0)
|
||||
size_t offset;
|
||||
|
||||
MatSize size;
|
||||
MatStep step;
|
||||
|
||||
protected:
|
||||
};
|
||||
|
||||
|
||||
/////////////////////////// multi-dimensional sparse matrix //////////////////////////
|
||||
|
||||
|
@ -52,127 +52,244 @@ namespace cv
|
||||
|
||||
//////////////////////// Input/Output Arrays ////////////////////////
|
||||
|
||||
inline void _InputArray::init(int _flags, const void* _obj)
|
||||
{ flags = _flags; obj = (void*)_obj; }
|
||||
|
||||
inline void _InputArray::init(int _flags, const void* _obj, Size _sz)
|
||||
{ flags = _flags; obj = (void*)_obj; sz = _sz; }
|
||||
|
||||
inline void* _InputArray::getObj() const { return obj; }
|
||||
|
||||
inline _InputArray::_InputArray() { init(0, 0); }
|
||||
inline _InputArray::_InputArray(int _flags, void* _obj) { init(_flags, _obj); }
|
||||
inline _InputArray::_InputArray(const Mat& m) { init(MAT+ACCESS_READ, &m); }
|
||||
inline _InputArray::_InputArray(const std::vector<Mat>& vec) { init(STD_VECTOR_MAT+ACCESS_READ, &vec); }
|
||||
inline _InputArray::_InputArray(const UMat& m) { init(UMAT+ACCESS_READ, &m); }
|
||||
inline _InputArray::_InputArray(const std::vector<UMat>& vec) { init(STD_VECTOR_UMAT+ACCESS_READ, &vec); }
|
||||
|
||||
template<typename _Tp> inline
|
||||
_InputArray::_InputArray(const std::vector<_Tp>& vec)
|
||||
: flags(FIXED_TYPE + STD_VECTOR + DataType<_Tp>::type), obj((void*)&vec)
|
||||
{}
|
||||
{ init(FIXED_TYPE + STD_VECTOR + DataType<_Tp>::type + ACCESS_READ, &vec); }
|
||||
|
||||
template<typename _Tp> inline
|
||||
_InputArray::_InputArray(const std::vector<std::vector<_Tp> >& vec)
|
||||
: flags(FIXED_TYPE + STD_VECTOR_VECTOR + DataType<_Tp>::type), obj((void*)&vec)
|
||||
{}
|
||||
{ init(FIXED_TYPE + STD_VECTOR_VECTOR + DataType<_Tp>::type + ACCESS_READ, &vec); }
|
||||
|
||||
template<typename _Tp> inline
|
||||
_InputArray::_InputArray(const std::vector<Mat_<_Tp> >& vec)
|
||||
: flags(FIXED_TYPE + STD_VECTOR_MAT + DataType<_Tp>::type), obj((void*)&vec)
|
||||
{}
|
||||
{ init(FIXED_TYPE + STD_VECTOR_MAT + DataType<_Tp>::type + ACCESS_READ, &vec); }
|
||||
|
||||
template<typename _Tp, int m, int n> inline
|
||||
_InputArray::_InputArray(const Matx<_Tp, m, n>& mtx)
|
||||
: flags(FIXED_TYPE + FIXED_SIZE + MATX + DataType<_Tp>::type), obj((void*)&mtx), sz(n, m)
|
||||
{}
|
||||
{ init(FIXED_TYPE + FIXED_SIZE + MATX + DataType<_Tp>::type + ACCESS_READ, &mtx, Size(n, m)); }
|
||||
|
||||
template<typename _Tp> inline
|
||||
_InputArray::_InputArray(const _Tp* vec, int n)
|
||||
: flags(FIXED_TYPE + FIXED_SIZE + MATX + DataType<_Tp>::type), obj((void*)vec), sz(n, 1)
|
||||
{}
|
||||
{ init(FIXED_TYPE + FIXED_SIZE + MATX + DataType<_Tp>::type + ACCESS_READ, vec, Size(n, 1)); }
|
||||
|
||||
template<typename _Tp> inline
|
||||
_InputArray::_InputArray(const Mat_<_Tp>& m)
|
||||
: flags(FIXED_TYPE + MAT + DataType<_Tp>::type), obj((void*)&m)
|
||||
{}
|
||||
{ init(FIXED_TYPE + MAT + DataType<_Tp>::type + ACCESS_READ, &m); }
|
||||
|
||||
inline _InputArray::_InputArray(const double& val)
|
||||
{ init(FIXED_TYPE + FIXED_SIZE + MATX + CV_64F + ACCESS_READ, &val, Size(1,1)); }
|
||||
|
||||
inline _InputArray::_InputArray(const MatExpr& expr)
|
||||
{ init(FIXED_TYPE + FIXED_SIZE + EXPR + ACCESS_READ, &expr); }
|
||||
|
||||
inline _InputArray::_InputArray(const cuda::GpuMat& d_mat)
|
||||
{ init(GPU_MAT + ACCESS_READ, &d_mat); }
|
||||
|
||||
inline _InputArray::_InputArray(const ogl::Buffer& buf)
|
||||
{ init(OPENGL_BUFFER + ACCESS_READ, &buf); }
|
||||
|
||||
inline _InputArray::_InputArray(const cuda::CudaMem& cuda_mem)
|
||||
{ init(CUDA_MEM + ACCESS_READ, &cuda_mem); }
|
||||
|
||||
inline _InputArray::~_InputArray() {}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
inline _OutputArray::_OutputArray() { init(ACCESS_WRITE, 0); }
|
||||
inline _OutputArray::_OutputArray(int _flags, void* _obj) { init(_flags|ACCESS_WRITE, _obj); }
|
||||
inline _OutputArray::_OutputArray(Mat& m) { init(MAT+ACCESS_WRITE, &m); }
|
||||
inline _OutputArray::_OutputArray(std::vector<Mat>& vec) { init(STD_VECTOR_MAT+ACCESS_WRITE, &vec); }
|
||||
inline _OutputArray::_OutputArray(UMat& m) { init(UMAT+ACCESS_WRITE, &m); }
|
||||
inline _OutputArray::_OutputArray(std::vector<UMat>& vec) { init(STD_VECTOR_UMAT+ACCESS_WRITE, &vec); }
|
||||
|
||||
template<typename _Tp> inline
|
||||
_OutputArray::_OutputArray(std::vector<_Tp>& vec)
|
||||
: _InputArray(vec)
|
||||
{}
|
||||
{ init(FIXED_TYPE + STD_VECTOR + DataType<_Tp>::type + ACCESS_WRITE, &vec); }
|
||||
|
||||
template<typename _Tp> inline
|
||||
_OutputArray::_OutputArray(std::vector<std::vector<_Tp> >& vec)
|
||||
: _InputArray(vec)
|
||||
{}
|
||||
{ init(FIXED_TYPE + STD_VECTOR_VECTOR + DataType<_Tp>::type + ACCESS_WRITE, &vec); }
|
||||
|
||||
template<typename _Tp> inline
|
||||
_OutputArray::_OutputArray(std::vector<Mat_<_Tp> >& vec)
|
||||
: _InputArray(vec)
|
||||
{}
|
||||
{ init(FIXED_TYPE + STD_VECTOR_MAT + DataType<_Tp>::type + ACCESS_WRITE, &vec); }
|
||||
|
||||
template<typename _Tp> inline
|
||||
_OutputArray::_OutputArray(Mat_<_Tp>& m)
|
||||
: _InputArray(m)
|
||||
{}
|
||||
{ init(FIXED_TYPE + MAT + DataType<_Tp>::type + ACCESS_WRITE, &m); }
|
||||
|
||||
template<typename _Tp, int m, int n> inline
|
||||
_OutputArray::_OutputArray(Matx<_Tp, m, n>& mtx)
|
||||
: _InputArray(mtx)
|
||||
{}
|
||||
{ init(FIXED_TYPE + FIXED_SIZE + MATX + DataType<_Tp>::type + ACCESS_WRITE, &mtx, Size(n, m)); }
|
||||
|
||||
template<typename _Tp> inline
|
||||
_OutputArray::_OutputArray(_Tp* vec, int n)
|
||||
: _InputArray(vec, n)
|
||||
{}
|
||||
{ init(FIXED_TYPE + FIXED_SIZE + MATX + DataType<_Tp>::type + ACCESS_WRITE, vec, Size(n, 1)); }
|
||||
|
||||
template<typename _Tp> inline
|
||||
_OutputArray::_OutputArray(const std::vector<_Tp>& vec)
|
||||
: _InputArray(vec)
|
||||
{
|
||||
flags |= FIXED_SIZE;
|
||||
}
|
||||
{ init(FIXED_TYPE + FIXED_SIZE + STD_VECTOR + DataType<_Tp>::type + ACCESS_WRITE, &vec); }
|
||||
|
||||
template<typename _Tp> inline
|
||||
_OutputArray::_OutputArray(const std::vector<std::vector<_Tp> >& vec)
|
||||
: _InputArray(vec)
|
||||
{
|
||||
flags |= FIXED_SIZE;
|
||||
}
|
||||
{ init(FIXED_TYPE + FIXED_SIZE + STD_VECTOR_VECTOR + DataType<_Tp>::type + ACCESS_WRITE, &vec); }
|
||||
|
||||
template<typename _Tp> inline
|
||||
_OutputArray::_OutputArray(const std::vector<Mat_<_Tp> >& vec)
|
||||
: _InputArray(vec)
|
||||
{
|
||||
flags |= FIXED_SIZE;
|
||||
}
|
||||
{ init(FIXED_TYPE + FIXED_SIZE + STD_VECTOR_MAT + DataType<_Tp>::type + ACCESS_WRITE, &vec); }
|
||||
|
||||
template<typename _Tp> inline
|
||||
_OutputArray::_OutputArray(const Mat_<_Tp>& m)
|
||||
: _InputArray(m)
|
||||
{
|
||||
flags |= FIXED_SIZE;
|
||||
}
|
||||
{ init(FIXED_TYPE + FIXED_SIZE + MAT + DataType<_Tp>::type + ACCESS_WRITE, &m); }
|
||||
|
||||
template<typename _Tp, int m, int n> inline
|
||||
_OutputArray::_OutputArray(const Matx<_Tp, m, n>& mtx)
|
||||
: _InputArray(mtx)
|
||||
{}
|
||||
{ init(FIXED_TYPE + FIXED_SIZE + MATX + DataType<_Tp>::type + ACCESS_WRITE, &mtx, Size(n, m)); }
|
||||
|
||||
template<typename _Tp> inline
|
||||
_OutputArray::_OutputArray(const _Tp* vec, int n)
|
||||
: _InputArray(vec, n)
|
||||
{}
|
||||
{ init(FIXED_TYPE + FIXED_SIZE + MATX + DataType<_Tp>::type + ACCESS_WRITE, vec, Size(n, 1)); }
|
||||
|
||||
inline _OutputArray::_OutputArray(cuda::GpuMat& d_mat)
|
||||
{ init(GPU_MAT + ACCESS_WRITE, &d_mat); }
|
||||
|
||||
inline _OutputArray::_OutputArray(ogl::Buffer& buf)
|
||||
{ init(OPENGL_BUFFER + ACCESS_WRITE, &buf); }
|
||||
|
||||
//////////////////////////////// Mat ////////////////////////////////
|
||||
inline _OutputArray::_OutputArray(cuda::CudaMem& cuda_mem)
|
||||
{ init(CUDA_MEM + ACCESS_WRITE, &cuda_mem); }
|
||||
|
||||
inline _OutputArray::_OutputArray(const Mat& m)
|
||||
{ init(FIXED_TYPE + FIXED_SIZE + MAT + ACCESS_WRITE, &m); }
|
||||
|
||||
inline _OutputArray::_OutputArray(const std::vector<Mat>& vec)
|
||||
{ init(FIXED_SIZE + STD_VECTOR_MAT + ACCESS_WRITE, &vec); }
|
||||
|
||||
inline _OutputArray::_OutputArray(const cuda::GpuMat& d_mat)
|
||||
{ init(FIXED_TYPE + FIXED_SIZE + GPU_MAT + ACCESS_WRITE, &d_mat); }
|
||||
|
||||
inline _OutputArray::_OutputArray(const ogl::Buffer& buf)
|
||||
{ init(FIXED_TYPE + FIXED_SIZE + OPENGL_BUFFER + ACCESS_WRITE, &buf); }
|
||||
|
||||
inline _OutputArray::_OutputArray(const cuda::CudaMem& cuda_mem)
|
||||
{ init(FIXED_TYPE + FIXED_SIZE + CUDA_MEM + ACCESS_WRITE, &cuda_mem); }
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
inline _InputOutputArray::_InputOutputArray() { init(ACCESS_RW, 0); }
|
||||
inline _InputOutputArray::_InputOutputArray(int _flags, void* _obj) { init(_flags|ACCESS_RW, _obj); }
|
||||
inline _InputOutputArray::_InputOutputArray(Mat& m) { init(MAT+ACCESS_RW, &m); }
|
||||
inline _InputOutputArray::_InputOutputArray(std::vector<Mat>& vec) { init(STD_VECTOR_MAT+ACCESS_RW, &vec); }
|
||||
inline _InputOutputArray::_InputOutputArray(UMat& m) { init(UMAT+ACCESS_RW, &m); }
|
||||
inline _InputOutputArray::_InputOutputArray(std::vector<UMat>& vec) { init(STD_VECTOR_UMAT+ACCESS_RW, &vec); }
|
||||
|
||||
template<typename _Tp> inline
|
||||
_InputOutputArray::_InputOutputArray(std::vector<_Tp>& vec)
|
||||
{ init(FIXED_TYPE + STD_VECTOR + DataType<_Tp>::type + ACCESS_RW, &vec); }
|
||||
|
||||
template<typename _Tp> inline
|
||||
_InputOutputArray::_InputOutputArray(std::vector<std::vector<_Tp> >& vec)
|
||||
{ init(FIXED_TYPE + STD_VECTOR_VECTOR + DataType<_Tp>::type + ACCESS_RW, &vec); }
|
||||
|
||||
template<typename _Tp> inline
|
||||
_InputOutputArray::_InputOutputArray(std::vector<Mat_<_Tp> >& vec)
|
||||
{ init(FIXED_TYPE + STD_VECTOR_MAT + DataType<_Tp>::type + ACCESS_RW, &vec); }
|
||||
|
||||
template<typename _Tp> inline
|
||||
_InputOutputArray::_InputOutputArray(Mat_<_Tp>& m)
|
||||
{ init(FIXED_TYPE + MAT + DataType<_Tp>::type + ACCESS_RW, &m); }
|
||||
|
||||
template<typename _Tp, int m, int n> inline
|
||||
_InputOutputArray::_InputOutputArray(Matx<_Tp, m, n>& mtx)
|
||||
{ init(FIXED_TYPE + FIXED_SIZE + MATX + DataType<_Tp>::type + ACCESS_RW, &mtx, Size(n, m)); }
|
||||
|
||||
template<typename _Tp> inline
|
||||
_InputOutputArray::_InputOutputArray(_Tp* vec, int n)
|
||||
{ init(FIXED_TYPE + FIXED_SIZE + MATX + DataType<_Tp>::type + ACCESS_RW, vec, Size(n, 1)); }
|
||||
|
||||
template<typename _Tp> inline
|
||||
_InputOutputArray::_InputOutputArray(const std::vector<_Tp>& vec)
|
||||
{ init(FIXED_TYPE + FIXED_SIZE + STD_VECTOR + DataType<_Tp>::type + ACCESS_RW, &vec); }
|
||||
|
||||
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); }
|
||||
|
||||
template<typename _Tp> inline
|
||||
_InputOutputArray::_InputOutputArray(const std::vector<Mat_<_Tp> >& vec)
|
||||
{ init(FIXED_TYPE + FIXED_SIZE + STD_VECTOR_MAT + DataType<_Tp>::type + ACCESS_RW, &vec); }
|
||||
|
||||
template<typename _Tp> inline
|
||||
_InputOutputArray::_InputOutputArray(const Mat_<_Tp>& m)
|
||||
{ init(FIXED_TYPE + FIXED_SIZE + MAT + DataType<_Tp>::type + ACCESS_RW, &m); }
|
||||
|
||||
template<typename _Tp, int m, int n> inline
|
||||
_InputOutputArray::_InputOutputArray(const Matx<_Tp, m, n>& mtx)
|
||||
{ init(FIXED_TYPE + FIXED_SIZE + MATX + DataType<_Tp>::type + ACCESS_RW, &mtx, Size(n, m)); }
|
||||
|
||||
template<typename _Tp> inline
|
||||
_InputOutputArray::_InputOutputArray(const _Tp* vec, int n)
|
||||
{ init(FIXED_TYPE + FIXED_SIZE + MATX + DataType<_Tp>::type + ACCESS_RW, vec, Size(n, 1)); }
|
||||
|
||||
inline _InputOutputArray::_InputOutputArray(cuda::GpuMat& d_mat)
|
||||
{ init(GPU_MAT + ACCESS_RW, &d_mat); }
|
||||
|
||||
inline _InputOutputArray::_InputOutputArray(ogl::Buffer& buf)
|
||||
{ init(OPENGL_BUFFER + ACCESS_RW, &buf); }
|
||||
|
||||
inline _InputOutputArray::_InputOutputArray(cuda::CudaMem& cuda_mem)
|
||||
{ init(CUDA_MEM + ACCESS_RW, &cuda_mem); }
|
||||
|
||||
inline _InputOutputArray::_InputOutputArray(const Mat& m)
|
||||
{ init(FIXED_TYPE + FIXED_SIZE + MAT + ACCESS_RW, &m); }
|
||||
|
||||
inline _InputOutputArray::_InputOutputArray(const std::vector<Mat>& vec)
|
||||
{ init(FIXED_SIZE + STD_VECTOR_MAT + ACCESS_RW, &vec); }
|
||||
|
||||
inline _InputOutputArray::_InputOutputArray(const cuda::GpuMat& d_mat)
|
||||
{ init(FIXED_TYPE + FIXED_SIZE + GPU_MAT + ACCESS_RW, &d_mat); }
|
||||
|
||||
inline _InputOutputArray::_InputOutputArray(const ogl::Buffer& buf)
|
||||
{ init(FIXED_TYPE + FIXED_SIZE + OPENGL_BUFFER + ACCESS_RW, &buf); }
|
||||
|
||||
inline _InputOutputArray::_InputOutputArray(const cuda::CudaMem& cuda_mem)
|
||||
{ init(FIXED_TYPE + FIXED_SIZE + CUDA_MEM + ACCESS_RW, &cuda_mem); }
|
||||
|
||||
//////////////////////////////////////////// Mat //////////////////////////////////////////
|
||||
|
||||
inline
|
||||
Mat::Mat()
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), refcount(0), datastart(0), dataend(0),
|
||||
datalimit(0), allocator(0), size(&rows)
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), datastart(0), dataend(0),
|
||||
datalimit(0), allocator(0), u(0), size(&rows)
|
||||
{}
|
||||
|
||||
inline
|
||||
Mat::Mat(int _rows, int _cols, int _type)
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), refcount(0), datastart(0), dataend(0),
|
||||
datalimit(0), allocator(0), size(&rows)
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), datastart(0), dataend(0),
|
||||
datalimit(0), allocator(0), u(0), size(&rows)
|
||||
{
|
||||
create(_rows, _cols, _type);
|
||||
}
|
||||
|
||||
inline
|
||||
Mat::Mat(int _rows, int _cols, int _type, const Scalar& _s)
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), refcount(0), datastart(0), dataend(0),
|
||||
datalimit(0), allocator(0), size(&rows)
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), datastart(0), dataend(0),
|
||||
datalimit(0), allocator(0), u(0), size(&rows)
|
||||
{
|
||||
create(_rows, _cols, _type);
|
||||
*this = _s;
|
||||
@ -180,16 +297,16 @@ Mat::Mat(int _rows, int _cols, int _type, const Scalar& _s)
|
||||
|
||||
inline
|
||||
Mat::Mat(Size _sz, int _type)
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), refcount(0), datastart(0), dataend(0),
|
||||
datalimit(0), allocator(0), size(&rows)
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), datastart(0), dataend(0),
|
||||
datalimit(0), allocator(0), u(0), size(&rows)
|
||||
{
|
||||
create( _sz.height, _sz.width, _type );
|
||||
}
|
||||
|
||||
inline
|
||||
Mat::Mat(Size _sz, int _type, const Scalar& _s)
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), refcount(0), datastart(0), dataend(0),
|
||||
datalimit(0), allocator(0), size(&rows)
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), datastart(0), dataend(0),
|
||||
datalimit(0), allocator(0), u(0), size(&rows)
|
||||
{
|
||||
create(_sz.height, _sz.width, _type);
|
||||
*this = _s;
|
||||
@ -197,16 +314,16 @@ Mat::Mat(Size _sz, int _type, const Scalar& _s)
|
||||
|
||||
inline
|
||||
Mat::Mat(int _dims, const int* _sz, int _type)
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), refcount(0), datastart(0), dataend(0),
|
||||
datalimit(0), allocator(0), size(&rows)
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), datastart(0), dataend(0),
|
||||
datalimit(0), allocator(0), u(0), size(&rows)
|
||||
{
|
||||
create(_dims, _sz, _type);
|
||||
}
|
||||
|
||||
inline
|
||||
Mat::Mat(int _dims, const int* _sz, int _type, const Scalar& _s)
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), refcount(0), datastart(0), dataend(0),
|
||||
datalimit(0), allocator(0), size(&rows)
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), datastart(0), dataend(0),
|
||||
datalimit(0), allocator(0), u(0), size(&rows)
|
||||
{
|
||||
create(_dims, _sz, _type);
|
||||
*this = _s;
|
||||
@ -214,12 +331,12 @@ Mat::Mat(int _dims, const int* _sz, int _type, const Scalar& _s)
|
||||
|
||||
inline
|
||||
Mat::Mat(const Mat& m)
|
||||
: flags(m.flags), dims(m.dims), rows(m.rows), cols(m.cols), data(m.data), refcount(m.refcount),
|
||||
: flags(m.flags), dims(m.dims), rows(m.rows), cols(m.cols), data(m.data),
|
||||
datastart(m.datastart), dataend(m.dataend), datalimit(m.datalimit), allocator(m.allocator),
|
||||
size(&rows)
|
||||
u(m.u), size(&rows)
|
||||
{
|
||||
if( refcount )
|
||||
CV_XADD(refcount, 1);
|
||||
if( u )
|
||||
CV_XADD(&u->refcount, 1);
|
||||
if( m.dims <= 2 )
|
||||
{
|
||||
step[0] = m.step[0]; step[1] = m.step[1];
|
||||
@ -234,8 +351,8 @@ Mat::Mat(const Mat& m)
|
||||
inline
|
||||
Mat::Mat(int _rows, int _cols, int _type, void* _data, size_t _step)
|
||||
: flags(MAGIC_VAL + (_type & TYPE_MASK)), dims(2), rows(_rows), cols(_cols),
|
||||
data((uchar*)_data), refcount(0), datastart((uchar*)_data), dataend(0), datalimit(0),
|
||||
allocator(0), size(&rows)
|
||||
data((uchar*)_data), datastart((uchar*)_data), dataend(0), datalimit(0),
|
||||
allocator(0), u(0), size(&rows)
|
||||
{
|
||||
size_t esz = CV_ELEM_SIZE(_type);
|
||||
size_t minstep = cols * esz;
|
||||
@ -259,8 +376,8 @@ Mat::Mat(int _rows, int _cols, int _type, void* _data, size_t _step)
|
||||
inline
|
||||
Mat::Mat(Size _sz, int _type, void* _data, size_t _step)
|
||||
: flags(MAGIC_VAL + (_type & TYPE_MASK)), dims(2), rows(_sz.height), cols(_sz.width),
|
||||
data((uchar*)_data), refcount(0), datastart((uchar*)_data), dataend(0), datalimit(0),
|
||||
allocator(0), size(&rows)
|
||||
data((uchar*)_data), datastart((uchar*)_data), dataend(0), datalimit(0),
|
||||
allocator(0), u(0), size(&rows)
|
||||
{
|
||||
size_t esz = CV_ELEM_SIZE(_type);
|
||||
size_t minstep = cols*esz;
|
||||
@ -284,7 +401,7 @@ Mat::Mat(Size _sz, int _type, void* _data, size_t _step)
|
||||
template<typename _Tp> inline
|
||||
Mat::Mat(const std::vector<_Tp>& vec, bool copyData)
|
||||
: flags(MAGIC_VAL | DataType<_Tp>::type | CV_MAT_CONT_FLAG), dims(2), rows((int)vec.size()),
|
||||
cols(1), data(0), refcount(0), datastart(0), dataend(0), allocator(0), size(&rows)
|
||||
cols(1), data(0), datastart(0), dataend(0), allocator(0), u(0), size(&rows)
|
||||
{
|
||||
if(vec.empty())
|
||||
return;
|
||||
@ -301,7 +418,7 @@ Mat::Mat(const std::vector<_Tp>& vec, bool copyData)
|
||||
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),
|
||||
refcount(0), datastart(0), dataend(0), allocator(0), size(&rows)
|
||||
datastart(0), dataend(0), allocator(0), u(0), size(&rows)
|
||||
{
|
||||
if( !copyData )
|
||||
{
|
||||
@ -317,7 +434,7 @@ Mat::Mat(const Vec<_Tp, n>& vec, bool copyData)
|
||||
template<typename _Tp, int m, int n> inline
|
||||
Mat::Mat(const Matx<_Tp,m,n>& M, bool copyData)
|
||||
: flags(MAGIC_VAL | DataType<_Tp>::type | CV_MAT_CONT_FLAG), dims(2), rows(m), cols(n), data(0),
|
||||
refcount(0), datastart(0), dataend(0), allocator(0), size(&rows)
|
||||
datastart(0), dataend(0), allocator(0), u(0), size(&rows)
|
||||
{
|
||||
if( !copyData )
|
||||
{
|
||||
@ -333,7 +450,7 @@ Mat::Mat(const Matx<_Tp,m,n>& M, bool copyData)
|
||||
template<typename _Tp> inline
|
||||
Mat::Mat(const Point_<_Tp>& pt, bool copyData)
|
||||
: flags(MAGIC_VAL | DataType<_Tp>::type | CV_MAT_CONT_FLAG), dims(2), rows(2), cols(1), data(0),
|
||||
refcount(0), datastart(0), dataend(0), allocator(0), size(&rows)
|
||||
datastart(0), dataend(0), allocator(0), u(0), size(&rows)
|
||||
{
|
||||
if( !copyData )
|
||||
{
|
||||
@ -352,7 +469,7 @@ Mat::Mat(const Point_<_Tp>& pt, bool copyData)
|
||||
template<typename _Tp> inline
|
||||
Mat::Mat(const Point3_<_Tp>& pt, bool copyData)
|
||||
: flags(MAGIC_VAL | DataType<_Tp>::type | CV_MAT_CONT_FLAG), dims(2), rows(3), cols(1), data(0),
|
||||
refcount(0), datastart(0), dataend(0), allocator(0), size(&rows)
|
||||
datastart(0), dataend(0), allocator(0), u(0), size(&rows)
|
||||
{
|
||||
if( !copyData )
|
||||
{
|
||||
@ -372,7 +489,7 @@ Mat::Mat(const Point3_<_Tp>& pt, bool copyData)
|
||||
template<typename _Tp> inline
|
||||
Mat::Mat(const MatCommaInitializer_<_Tp>& commaInitializer)
|
||||
: flags(MAGIC_VAL | DataType<_Tp>::type | CV_MAT_CONT_FLAG), dims(0), rows(0), cols(0), data(0),
|
||||
refcount(0), datastart(0), dataend(0), allocator(0), size(&rows)
|
||||
datastart(0), dataend(0), allocator(0), u(0), size(&rows)
|
||||
{
|
||||
*this = commaInitializer.operator Mat_<_Tp>();
|
||||
}
|
||||
@ -390,8 +507,8 @@ Mat& Mat::operator = (const Mat& m)
|
||||
{
|
||||
if( this != &m )
|
||||
{
|
||||
if( m.refcount )
|
||||
CV_XADD(m.refcount, 1);
|
||||
if( m.u )
|
||||
CV_XADD(&m.u->refcount, 1);
|
||||
release();
|
||||
flags = m.flags;
|
||||
if( dims <= 2 && m.dims <= 2 )
|
||||
@ -408,8 +525,8 @@ Mat& Mat::operator = (const Mat& m)
|
||||
datastart = m.datastart;
|
||||
dataend = m.dataend;
|
||||
datalimit = m.datalimit;
|
||||
refcount = m.refcount;
|
||||
allocator = m.allocator;
|
||||
u = m.u;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
@ -486,17 +603,17 @@ void Mat::create(Size _sz, int _type)
|
||||
inline
|
||||
void Mat::addref()
|
||||
{
|
||||
if( refcount )
|
||||
CV_XADD(refcount, 1);
|
||||
if( u )
|
||||
CV_XADD(&u->refcount, 1);
|
||||
}
|
||||
|
||||
inline void Mat::release()
|
||||
{
|
||||
if( refcount && CV_XADD(refcount, -1) == 1 )
|
||||
if( u && CV_XADD(&u->refcount, -1) == 1 )
|
||||
deallocate();
|
||||
data = datastart = dataend = datalimit = 0;
|
||||
size.p[0] = 0;
|
||||
refcount = 0;
|
||||
u = 0;
|
||||
}
|
||||
|
||||
inline
|
||||
@ -913,41 +1030,39 @@ void Mat::push_back(const Mat_<_Tp>& m)
|
||||
push_back((const Mat&)m);
|
||||
}
|
||||
|
||||
|
||||
|
||||
///////////////////////////// Mat::MSize ////////////////////////////
|
||||
///////////////////////////// MatSize ////////////////////////////
|
||||
|
||||
inline
|
||||
Mat::MSize::MSize(int* _p)
|
||||
MatSize::MatSize(int* _p)
|
||||
: p(_p) {}
|
||||
|
||||
inline
|
||||
Size Mat::MSize::operator()() const
|
||||
Size MatSize::operator()() const
|
||||
{
|
||||
CV_DbgAssert(p[-1] <= 2);
|
||||
return Size(p[1], p[0]);
|
||||
}
|
||||
|
||||
inline
|
||||
const int& Mat::MSize::operator[](int i) const
|
||||
const int& MatSize::operator[](int i) const
|
||||
{
|
||||
return p[i];
|
||||
}
|
||||
|
||||
inline
|
||||
int& Mat::MSize::operator[](int i)
|
||||
int& MatSize::operator[](int i)
|
||||
{
|
||||
return p[i];
|
||||
}
|
||||
|
||||
inline
|
||||
Mat::MSize::operator const int*() const
|
||||
MatSize::operator const int*() const
|
||||
{
|
||||
return p;
|
||||
}
|
||||
|
||||
inline
|
||||
bool Mat::MSize::operator == (const MSize& sz) const
|
||||
bool MatSize::operator == (const MatSize& sz) const
|
||||
{
|
||||
int d = p[-1];
|
||||
int dsz = sz.p[-1];
|
||||
@ -963,46 +1078,46 @@ bool Mat::MSize::operator == (const MSize& sz) const
|
||||
}
|
||||
|
||||
inline
|
||||
bool Mat::MSize::operator != (const MSize& sz) const
|
||||
bool MatSize::operator != (const MatSize& sz) const
|
||||
{
|
||||
return !(*this == sz);
|
||||
}
|
||||
|
||||
|
||||
|
||||
///////////////////////////// Mat::MStep ////////////////////////////
|
||||
///////////////////////////// MatStep ////////////////////////////
|
||||
|
||||
inline
|
||||
Mat::MStep::MStep()
|
||||
MatStep::MatStep()
|
||||
{
|
||||
p = buf; p[0] = p[1] = 0;
|
||||
}
|
||||
|
||||
inline
|
||||
Mat::MStep::MStep(size_t s)
|
||||
MatStep::MatStep(size_t s)
|
||||
{
|
||||
p = buf; p[0] = s; p[1] = 0;
|
||||
}
|
||||
|
||||
inline
|
||||
const size_t& Mat::MStep::operator[](int i) const
|
||||
const size_t& MatStep::operator[](int i) const
|
||||
{
|
||||
return p[i];
|
||||
}
|
||||
|
||||
inline
|
||||
size_t& Mat::MStep::operator[](int i)
|
||||
size_t& MatStep::operator[](int i)
|
||||
{
|
||||
return p[i];
|
||||
}
|
||||
|
||||
inline Mat::MStep::operator size_t() const
|
||||
inline MatStep::operator size_t() const
|
||||
{
|
||||
CV_DbgAssert( p == buf );
|
||||
return buf[0];
|
||||
}
|
||||
|
||||
inline Mat::MStep& Mat::MStep::operator = (size_t s)
|
||||
inline MatStep& MatStep::operator = (size_t s)
|
||||
{
|
||||
CV_DbgAssert( p == buf );
|
||||
buf[0] = s;
|
||||
@ -1438,43 +1553,6 @@ MatIterator_<_Tp> Mat_<_Tp>::end()
|
||||
}
|
||||
|
||||
|
||||
/*template<typename T1, typename T2, typename Op> inline
|
||||
void process( const Mat_<T1>& m1, Mat_<T2>& m2, Op op )
|
||||
{
|
||||
int y, x, rows = m1.rows, cols = m1.cols;
|
||||
|
||||
CV_DbgAssert( m1.size() == m2.size() );
|
||||
|
||||
for( y = 0; y < rows; y++ )
|
||||
{
|
||||
const T1* src = m1[y];
|
||||
T2* dst = m2[y];
|
||||
|
||||
for( x = 0; x < cols; x++ )
|
||||
dst[x] = op(src[x]);
|
||||
}
|
||||
}
|
||||
|
||||
template<typename T1, typename T2, typename T3, typename Op> inline
|
||||
void process( const Mat_<T1>& m1, const Mat_<T2>& m2, Mat_<T3>& m3, Op op )
|
||||
{
|
||||
int y, x, rows = m1.rows, cols = m1.cols;
|
||||
|
||||
CV_DbgAssert( m1.size() == m2.size() );
|
||||
|
||||
for( y = 0; y < rows; y++ )
|
||||
{
|
||||
const T1* src1 = m1[y];
|
||||
const T2* src2 = m2[y];
|
||||
T3* dst = m3[y];
|
||||
|
||||
for( x = 0; x < cols; x++ )
|
||||
dst[x] = op( src1[x], src2[x] );
|
||||
}
|
||||
}*/
|
||||
|
||||
|
||||
|
||||
///////////////////////////// SparseMat /////////////////////////////
|
||||
|
||||
inline
|
||||
@ -2956,6 +3034,320 @@ const Mat_<_Tp>& operator /= (const Mat_<_Tp>& a, const MatExpr& b)
|
||||
return a;
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////// UMat ////////////////////////////////
|
||||
|
||||
inline
|
||||
UMat::UMat()
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), allocator(0), u(0), offset(0), size(&rows)
|
||||
{}
|
||||
|
||||
inline
|
||||
UMat::UMat(int _rows, int _cols, int _type)
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), allocator(0), u(0), offset(0), size(&rows)
|
||||
{
|
||||
create(_rows, _cols, _type);
|
||||
}
|
||||
|
||||
inline
|
||||
UMat::UMat(int _rows, int _cols, int _type, const Scalar& _s)
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), allocator(0), u(0), offset(0), size(&rows)
|
||||
{
|
||||
create(_rows, _cols, _type);
|
||||
*this = _s;
|
||||
}
|
||||
|
||||
inline
|
||||
UMat::UMat(Size _sz, int _type)
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), allocator(0), u(0), offset(0), size(&rows)
|
||||
{
|
||||
create( _sz.height, _sz.width, _type );
|
||||
}
|
||||
|
||||
inline
|
||||
UMat::UMat(Size _sz, int _type, const Scalar& _s)
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), allocator(0), u(0), offset(0), size(&rows)
|
||||
{
|
||||
create(_sz.height, _sz.width, _type);
|
||||
*this = _s;
|
||||
}
|
||||
|
||||
inline
|
||||
UMat::UMat(int _dims, const int* _sz, int _type)
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), allocator(0), u(0), offset(0), size(&rows)
|
||||
{
|
||||
create(_dims, _sz, _type);
|
||||
}
|
||||
|
||||
inline
|
||||
UMat::UMat(int _dims, const int* _sz, int _type, const Scalar& _s)
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), allocator(0), u(0), offset(0), size(&rows)
|
||||
{
|
||||
create(_dims, _sz, _type);
|
||||
*this = _s;
|
||||
}
|
||||
|
||||
inline
|
||||
UMat::UMat(const UMat& m)
|
||||
: flags(m.flags), dims(m.dims), rows(m.rows), cols(m.cols), allocator(m.allocator),
|
||||
u(m.u), offset(m.offset), size(&rows)
|
||||
{
|
||||
if( u )
|
||||
CV_XADD(&(u->urefcount), 1);
|
||||
if( m.dims <= 2 )
|
||||
{
|
||||
step[0] = m.step[0]; step[1] = m.step[1];
|
||||
}
|
||||
else
|
||||
{
|
||||
dims = 0;
|
||||
copySize(m);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
template<typename _Tp> inline
|
||||
UMat::UMat(const std::vector<_Tp>& vec, bool copyData)
|
||||
: flags(MAGIC_VAL | DataType<_Tp>::type | CV_MAT_CONT_FLAG), dims(2), rows((int)vec.size()),
|
||||
cols(1), allocator(0), u(0), offset(0), size(&rows)
|
||||
{
|
||||
if(vec.empty())
|
||||
return;
|
||||
if( !copyData )
|
||||
{
|
||||
// !!!TODO!!!
|
||||
CV_Error(Error::StsNotImplemented, "");
|
||||
}
|
||||
else
|
||||
Mat((int)vec.size(), 1, DataType<_Tp>::type, (uchar*)&vec[0]).copyTo(*this);
|
||||
}
|
||||
|
||||
|
||||
inline
|
||||
UMat::~UMat()
|
||||
{
|
||||
release();
|
||||
if( step.p != step.buf )
|
||||
fastFree(step.p);
|
||||
}
|
||||
|
||||
inline
|
||||
UMat& UMat::operator = (const UMat& m)
|
||||
{
|
||||
if( this != &m )
|
||||
{
|
||||
if( m.u )
|
||||
CV_XADD(&(m.u->urefcount), 1);
|
||||
release();
|
||||
flags = m.flags;
|
||||
if( dims <= 2 && m.dims <= 2 )
|
||||
{
|
||||
dims = m.dims;
|
||||
rows = m.rows;
|
||||
cols = m.cols;
|
||||
step[0] = m.step[0];
|
||||
step[1] = m.step[1];
|
||||
}
|
||||
else
|
||||
copySize(m);
|
||||
allocator = m.allocator;
|
||||
u = m.u;
|
||||
offset = m.offset;
|
||||
}
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline
|
||||
UMat UMat::row(int y) const
|
||||
{
|
||||
return UMat(*this, Range(y, y + 1), Range::all());
|
||||
}
|
||||
|
||||
inline
|
||||
UMat UMat::col(int x) const
|
||||
{
|
||||
return UMat(*this, Range::all(), Range(x, x + 1));
|
||||
}
|
||||
|
||||
inline
|
||||
UMat UMat::rowRange(int startrow, int endrow) const
|
||||
{
|
||||
return UMat(*this, Range(startrow, endrow), Range::all());
|
||||
}
|
||||
|
||||
inline
|
||||
UMat UMat::rowRange(const Range& r) const
|
||||
{
|
||||
return UMat(*this, r, Range::all());
|
||||
}
|
||||
|
||||
inline
|
||||
UMat UMat::colRange(int startcol, int endcol) const
|
||||
{
|
||||
return UMat(*this, Range::all(), Range(startcol, endcol));
|
||||
}
|
||||
|
||||
inline
|
||||
UMat UMat::colRange(const Range& r) const
|
||||
{
|
||||
return UMat(*this, Range::all(), r);
|
||||
}
|
||||
|
||||
inline
|
||||
UMat UMat::clone() const
|
||||
{
|
||||
UMat m;
|
||||
copyTo(m);
|
||||
return m;
|
||||
}
|
||||
|
||||
inline
|
||||
void UMat::assignTo( UMat& m, int _type ) const
|
||||
{
|
||||
if( _type < 0 )
|
||||
m = *this;
|
||||
else
|
||||
convertTo(m, _type);
|
||||
}
|
||||
|
||||
inline
|
||||
void UMat::create(int _rows, int _cols, int _type)
|
||||
{
|
||||
_type &= TYPE_MASK;
|
||||
if( dims <= 2 && rows == _rows && cols == _cols && type() == _type && u )
|
||||
return;
|
||||
int sz[] = {_rows, _cols};
|
||||
create(2, sz, _type);
|
||||
}
|
||||
|
||||
inline
|
||||
void UMat::create(Size _sz, int _type)
|
||||
{
|
||||
create(_sz.height, _sz.width, _type);
|
||||
}
|
||||
|
||||
inline
|
||||
void UMat::addref()
|
||||
{
|
||||
if( u )
|
||||
CV_XADD(&(u->urefcount), 1);
|
||||
}
|
||||
|
||||
inline void UMat::release()
|
||||
{
|
||||
if( u && CV_XADD(&(u->urefcount), -1) == 1 )
|
||||
deallocate();
|
||||
size.p[0] = 0;
|
||||
u = 0;
|
||||
}
|
||||
|
||||
inline
|
||||
UMat UMat::operator()( Range _rowRange, Range _colRange ) const
|
||||
{
|
||||
return UMat(*this, _rowRange, _colRange);
|
||||
}
|
||||
|
||||
inline
|
||||
UMat UMat::operator()( const Rect& roi ) const
|
||||
{
|
||||
return UMat(*this, roi);
|
||||
}
|
||||
|
||||
inline
|
||||
UMat UMat::operator()(const Range* ranges) const
|
||||
{
|
||||
return UMat(*this, ranges);
|
||||
}
|
||||
|
||||
inline
|
||||
bool UMat::isContinuous() const
|
||||
{
|
||||
return (flags & CONTINUOUS_FLAG) != 0;
|
||||
}
|
||||
|
||||
inline
|
||||
bool UMat::isSubmatrix() const
|
||||
{
|
||||
return (flags & SUBMATRIX_FLAG) != 0;
|
||||
}
|
||||
|
||||
inline
|
||||
size_t UMat::elemSize() const
|
||||
{
|
||||
return dims > 0 ? step.p[dims - 1] : 0;
|
||||
}
|
||||
|
||||
inline
|
||||
size_t UMat::elemSize1() const
|
||||
{
|
||||
return CV_ELEM_SIZE1(flags);
|
||||
}
|
||||
|
||||
inline
|
||||
int UMat::type() const
|
||||
{
|
||||
return CV_MAT_TYPE(flags);
|
||||
}
|
||||
|
||||
inline
|
||||
int UMat::depth() const
|
||||
{
|
||||
return CV_MAT_DEPTH(flags);
|
||||
}
|
||||
|
||||
inline
|
||||
int UMat::channels() const
|
||||
{
|
||||
return CV_MAT_CN(flags);
|
||||
}
|
||||
|
||||
inline
|
||||
size_t UMat::step1(int i) const
|
||||
{
|
||||
return step.p[i] / elemSize1();
|
||||
}
|
||||
|
||||
inline
|
||||
bool UMat::empty() const
|
||||
{
|
||||
return u == 0 || total() == 0;
|
||||
}
|
||||
|
||||
inline
|
||||
size_t UMat::total() const
|
||||
{
|
||||
if( dims <= 2 )
|
||||
return (size_t)rows * cols;
|
||||
size_t p = 1;
|
||||
for( int i = 0; i < dims; i++ )
|
||||
p *= size[i];
|
||||
return p;
|
||||
}
|
||||
|
||||
inline bool UMatData::hostCopyObsolete() const { return (flags & HOST_COPY_OBSOLETE) != 0; }
|
||||
inline bool UMatData::deviceCopyObsolete() const { return (flags & DEVICE_COPY_OBSOLETE) != 0; }
|
||||
inline bool UMatData::copyOnMap() const { return (flags & COPY_ON_MAP) != 0; }
|
||||
inline bool UMatData::tempUMat() const { return (flags & TEMP_UMAT) != 0; }
|
||||
inline bool UMatData::tempCopiedUMat() const { return (flags & TEMP_COPIED_UMAT) == TEMP_COPIED_UMAT; }
|
||||
|
||||
inline void UMatData::markHostCopyObsolete(bool flag)
|
||||
{
|
||||
if(flag)
|
||||
flags |= HOST_COPY_OBSOLETE;
|
||||
else
|
||||
flags &= ~HOST_COPY_OBSOLETE;
|
||||
}
|
||||
inline void UMatData::markDeviceCopyObsolete(bool flag)
|
||||
{
|
||||
if(flag)
|
||||
flags |= DEVICE_COPY_OBSOLETE;
|
||||
else
|
||||
flags &= ~DEVICE_COPY_OBSOLETE;
|
||||
}
|
||||
|
||||
inline UMatDataAutoLock::UMatDataAutoLock(UMatData* _u) : u(_u) { u->lock(); }
|
||||
inline UMatDataAutoLock::~UMatDataAutoLock() { u->unlock(); }
|
||||
|
||||
} //cv
|
||||
|
||||
#endif
|
||||
|
451
modules/core/include/opencv2/core/ocl.hpp
Normal file
451
modules/core/include/opencv2/core/ocl.hpp
Normal file
@ -0,0 +1,451 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2013, OpenCV Foundation, all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the OpenCV Foundation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#ifndef __OPENCV_OPENCL_HPP__
|
||||
#define __OPENCV_OPENCL_HPP__
|
||||
|
||||
#include "opencv2/core.hpp"
|
||||
|
||||
namespace cv { namespace ocl {
|
||||
|
||||
CV_EXPORTS bool haveOpenCL();
|
||||
CV_EXPORTS bool useOpenCL();
|
||||
CV_EXPORTS void setUseOpenCL(bool flag);
|
||||
CV_EXPORTS void finish();
|
||||
|
||||
class CV_EXPORTS Context;
|
||||
class CV_EXPORTS Device;
|
||||
class CV_EXPORTS Kernel;
|
||||
class CV_EXPORTS Program;
|
||||
class CV_EXPORTS ProgramSource;
|
||||
class CV_EXPORTS Queue;
|
||||
|
||||
class CV_EXPORTS Device
|
||||
{
|
||||
public:
|
||||
Device();
|
||||
explicit Device(void* d);
|
||||
Device(const Device& d);
|
||||
Device& operator = (const Device& d);
|
||||
~Device();
|
||||
|
||||
void set(void* d);
|
||||
|
||||
enum
|
||||
{
|
||||
TYPE_DEFAULT = (1 << 0),
|
||||
TYPE_CPU = (1 << 1),
|
||||
TYPE_GPU = (1 << 2),
|
||||
TYPE_ACCELERATOR = (1 << 3),
|
||||
TYPE_DGPU = TYPE_GPU + (1 << 16),
|
||||
TYPE_IGPU = TYPE_GPU + (1 << 17),
|
||||
TYPE_ALL = 0xFFFFFFFF
|
||||
};
|
||||
|
||||
String name() const;
|
||||
String extensions() const;
|
||||
String vendor() const;
|
||||
String OpenCL_C_Version() const;
|
||||
String OpenCLVersion() const;
|
||||
String driverVersion() const;
|
||||
void* ptr() const;
|
||||
|
||||
int type() const;
|
||||
|
||||
int addressBits() const;
|
||||
bool available() const;
|
||||
bool compilerAvailable() const;
|
||||
bool linkerAvailable() const;
|
||||
|
||||
enum
|
||||
{
|
||||
FP_DENORM=(1 << 0),
|
||||
FP_INF_NAN=(1 << 1),
|
||||
FP_ROUND_TO_NEAREST=(1 << 2),
|
||||
FP_ROUND_TO_ZERO=(1 << 3),
|
||||
FP_ROUND_TO_INF=(1 << 4),
|
||||
FP_FMA=(1 << 5),
|
||||
FP_SOFT_FLOAT=(1 << 6),
|
||||
FP_CORRECTLY_ROUNDED_DIVIDE_SQRT=(1 << 7)
|
||||
};
|
||||
int doubleFPConfig() const;
|
||||
int singleFPConfig() const;
|
||||
int halfFPConfig() const;
|
||||
|
||||
bool endianLittle() const;
|
||||
bool errorCorrectionSupport() const;
|
||||
|
||||
enum
|
||||
{
|
||||
EXEC_KERNEL=(1 << 0),
|
||||
EXEC_NATIVE_KERNEL=(1 << 1)
|
||||
};
|
||||
int executionCapabilities() const;
|
||||
|
||||
size_t globalMemCacheSize() const;
|
||||
|
||||
enum
|
||||
{
|
||||
NO_CACHE=0,
|
||||
READ_ONLY_CACHE=1,
|
||||
READ_WRITE_CACHE=2
|
||||
};
|
||||
int globalMemCacheType() const;
|
||||
int globalMemCacheLineSize() const;
|
||||
size_t globalMemSize() const;
|
||||
|
||||
size_t localMemSize() const;
|
||||
enum
|
||||
{
|
||||
NO_LOCAL_MEM=0,
|
||||
LOCAL_IS_LOCAL=1,
|
||||
LOCAL_IS_GLOBAL=2
|
||||
};
|
||||
int localMemType() const;
|
||||
bool hostUnifiedMemory() const;
|
||||
|
||||
bool imageSupport() const;
|
||||
|
||||
size_t image2DMaxWidth() const;
|
||||
size_t image2DMaxHeight() const;
|
||||
|
||||
size_t image3DMaxWidth() const;
|
||||
size_t image3DMaxHeight() const;
|
||||
size_t image3DMaxDepth() const;
|
||||
|
||||
size_t imageMaxBufferSize() const;
|
||||
size_t imageMaxArraySize() const;
|
||||
|
||||
int maxClockFrequency() const;
|
||||
int maxComputeUnits() const;
|
||||
int maxConstantArgs() const;
|
||||
size_t maxConstantBufferSize() const;
|
||||
|
||||
size_t maxMemAllocSize() const;
|
||||
size_t maxParameterSize() const;
|
||||
|
||||
int maxReadImageArgs() const;
|
||||
int maxWriteImageArgs() const;
|
||||
int maxSamplers() const;
|
||||
|
||||
size_t maxWorkGroupSize() const;
|
||||
int maxWorkItemDims() const;
|
||||
void maxWorkItemSizes(size_t*) const;
|
||||
|
||||
int memBaseAddrAlign() const;
|
||||
|
||||
int nativeVectorWidthChar() const;
|
||||
int nativeVectorWidthShort() const;
|
||||
int nativeVectorWidthInt() const;
|
||||
int nativeVectorWidthLong() const;
|
||||
int nativeVectorWidthFloat() const;
|
||||
int nativeVectorWidthDouble() const;
|
||||
int nativeVectorWidthHalf() const;
|
||||
|
||||
int preferredVectorWidthChar() const;
|
||||
int preferredVectorWidthShort() const;
|
||||
int preferredVectorWidthInt() const;
|
||||
int preferredVectorWidthLong() const;
|
||||
int preferredVectorWidthFloat() const;
|
||||
int preferredVectorWidthDouble() const;
|
||||
int preferredVectorWidthHalf() const;
|
||||
|
||||
size_t printfBufferSize() const;
|
||||
size_t profilingTimerResolution() const;
|
||||
|
||||
static const Device& getDefault();
|
||||
|
||||
protected:
|
||||
struct Impl;
|
||||
Impl* p;
|
||||
};
|
||||
|
||||
|
||||
class CV_EXPORTS Context
|
||||
{
|
||||
public:
|
||||
Context();
|
||||
explicit Context(int dtype);
|
||||
~Context();
|
||||
Context(const Context& c);
|
||||
Context& operator = (const Context& c);
|
||||
|
||||
bool create(int dtype);
|
||||
size_t ndevices() const;
|
||||
const Device& device(size_t idx) const;
|
||||
Program getProg(const ProgramSource& prog,
|
||||
const String& buildopt, String& errmsg);
|
||||
|
||||
static Context& getDefault();
|
||||
void* ptr() const;
|
||||
protected:
|
||||
struct Impl;
|
||||
Impl* p;
|
||||
};
|
||||
|
||||
|
||||
class CV_EXPORTS Queue
|
||||
{
|
||||
public:
|
||||
Queue();
|
||||
explicit Queue(const Context& c, const Device& d=Device());
|
||||
~Queue();
|
||||
Queue(const Queue& q);
|
||||
Queue& operator = (const Queue& q);
|
||||
|
||||
bool create(const Context& c=Context(), const Device& d=Device());
|
||||
void finish();
|
||||
void* ptr() const;
|
||||
static Queue& getDefault();
|
||||
|
||||
protected:
|
||||
struct Impl;
|
||||
Impl* p;
|
||||
};
|
||||
|
||||
|
||||
class CV_EXPORTS KernelArg
|
||||
{
|
||||
public:
|
||||
enum { LOCAL=1, READ_ONLY=2, WRITE_ONLY=4, READ_WRITE=6, CONSTANT=8 };
|
||||
KernelArg(int _flags, UMat* _m, void* _obj=0, size_t _sz=0);
|
||||
|
||||
static KernelArg Local() { return KernelArg(LOCAL, 0); }
|
||||
static KernelArg ReadOnly(const UMat& m) { return KernelArg(READ_ONLY, (UMat*)&m); }
|
||||
static KernelArg WriteOnly(const UMat& m) { return KernelArg(WRITE_ONLY, (UMat*)&m); }
|
||||
static KernelArg Constant(const Mat& m);
|
||||
template<typename _Tp> static KernelArg Constant(const _Tp* arr, size_t n)
|
||||
{ return KernelArg(CONSTANT, 0, (void*)arr, n); }
|
||||
|
||||
int flags;
|
||||
UMat* m;
|
||||
void* obj;
|
||||
size_t sz;
|
||||
};
|
||||
|
||||
class CV_EXPORTS Kernel
|
||||
{
|
||||
public:
|
||||
Kernel();
|
||||
Kernel(const char* kname, const Program& prog);
|
||||
Kernel(const char* kname, const ProgramSource& prog,
|
||||
const String& buildopts, String& errmsg);
|
||||
~Kernel();
|
||||
Kernel(const Kernel& k);
|
||||
Kernel& operator = (const Kernel& k);
|
||||
|
||||
bool create(const char* kname, const Program& prog);
|
||||
bool create(const char* kname, const ProgramSource& prog,
|
||||
const String& buildopts, String& errmsg);
|
||||
|
||||
void set(int i, const void* value, size_t sz);
|
||||
void set(int i, const UMat& m);
|
||||
void set(int i, const KernelArg& arg);
|
||||
template<typename _Tp> void set(int i, const _Tp& value)
|
||||
{ return set(i, &value, sizeof(value)); }
|
||||
|
||||
template<typename _Tp0>
|
||||
Kernel& args(const _Tp0& a0)
|
||||
{
|
||||
set(0, a0); return *this;
|
||||
}
|
||||
|
||||
template<typename _Tp0, typename _Tp1>
|
||||
Kernel& args(const _Tp0& a0, const _Tp1& a1)
|
||||
{
|
||||
set(0, a0); set(1, a1); return *this;
|
||||
}
|
||||
|
||||
template<typename _Tp0, typename _Tp1, typename _Tp2>
|
||||
Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2)
|
||||
{
|
||||
set(0, a0); set(1, a1); set(2, a2); return *this;
|
||||
}
|
||||
|
||||
template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3>
|
||||
Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3)
|
||||
{
|
||||
set(0, a0); set(1, a1); set(2, a2); set(3, a3); return *this;
|
||||
}
|
||||
|
||||
template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4>
|
||||
Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2,
|
||||
const _Tp3& a3, const _Tp4& a4)
|
||||
{
|
||||
set(0, a0); set(1, a1); set(2, a2); set(3, a3); set(4, a4); return *this;
|
||||
}
|
||||
|
||||
template<typename _Tp0, typename _Tp1, typename _Tp2,
|
||||
typename _Tp3, typename _Tp4, typename _Tp5>
|
||||
Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2,
|
||||
const _Tp3& a3, const _Tp4& a4, const _Tp5& a5)
|
||||
{
|
||||
set(0, a0); set(1, a1); set(2, a2);
|
||||
set(3, a3); set(4, a4); set(5, a5); return *this;
|
||||
}
|
||||
|
||||
template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
|
||||
typename _Tp4, typename _Tp5, typename _Tp6>
|
||||
Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
|
||||
const _Tp4& a4, const _Tp5& a5, const _Tp6& a6)
|
||||
{
|
||||
set(0, a0); set(1, a1); set(2, a2); set(3, a3);
|
||||
set(4, a4); set(5, a5); set(6, a6); return *this;
|
||||
}
|
||||
|
||||
template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
|
||||
typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7>
|
||||
Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
|
||||
const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7)
|
||||
{
|
||||
set(0, a0); set(1, a1); set(2, a2); set(3, a3);
|
||||
set(4, a4); set(5, a5); set(6, a6); set(7, a7); return *this;
|
||||
}
|
||||
|
||||
template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4,
|
||||
typename _Tp5, typename _Tp6, typename _Tp7, typename _Tp8>
|
||||
Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
|
||||
const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
|
||||
const _Tp8& a8)
|
||||
{
|
||||
set(0, a0); set(1, a1); set(2, a2); set(3, a3); set(4, a4);
|
||||
set(5, a5); set(6, a6); set(7, a7); set(8, a8); return *this;
|
||||
}
|
||||
|
||||
template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4,
|
||||
typename _Tp5, typename _Tp6, typename _Tp7, typename _Tp8, typename _Tp9>
|
||||
Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
|
||||
const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
|
||||
const _Tp8& a8, const _Tp9& a9)
|
||||
{
|
||||
set(0, a0); set(1, a1); set(2, a2); set(3, a3); set(4, a4); set(5, a5);
|
||||
set(6, a6); set(7, a7); set(8, a8); set(9, a9); return *this;
|
||||
}
|
||||
|
||||
template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
|
||||
typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
|
||||
typename _Tp8, typename _Tp9, typename _Tp10>
|
||||
Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
|
||||
const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
|
||||
const _Tp8& a8, const _Tp9& a9, const _Tp10& a10)
|
||||
{
|
||||
set(0, a0); set(1, a1); set(2, a2); set(3, a3); set(4, a4); set(5, a5);
|
||||
set(6, a6); set(7, a7); set(8, a8); set(9, a9); set(10, a10); return *this;
|
||||
}
|
||||
|
||||
template<typename _Tp0, typename _Tp1, typename _Tp2, typename _Tp3,
|
||||
typename _Tp4, typename _Tp5, typename _Tp6, typename _Tp7,
|
||||
typename _Tp8, typename _Tp9, typename _Tp10, typename _Tp11>
|
||||
Kernel& args(const _Tp0& a0, const _Tp1& a1, const _Tp2& a2, const _Tp3& a3,
|
||||
const _Tp4& a4, const _Tp5& a5, const _Tp6& a6, const _Tp7& a7,
|
||||
const _Tp8& a8, const _Tp9& a9, const _Tp10& a10, const _Tp11& a11)
|
||||
{
|
||||
set(0, a0); set(1, a1); set(2, a2); set(3, a3); set(4, a4); set(5, a5);
|
||||
set(6, a6); set(7, a7); set(8, a8); set(9, a9); set(10, a10); set(11, a11); return *this;
|
||||
}
|
||||
|
||||
void run(int dims, size_t offset[], size_t globalsize[],
|
||||
size_t localsize[], bool sync, const Queue& q=Queue());
|
||||
void runTask(bool sync, const Queue& q=Queue());
|
||||
|
||||
size_t workGroupSize() const;
|
||||
bool compileWorkGroupSize(size_t wsz[]) const;
|
||||
size_t localMemSize() const;
|
||||
|
||||
void* ptr() const;
|
||||
struct Impl;
|
||||
|
||||
protected:
|
||||
Impl* p;
|
||||
};
|
||||
|
||||
class CV_EXPORTS Program
|
||||
{
|
||||
public:
|
||||
Program();
|
||||
Program(const ProgramSource& src,
|
||||
const String& buildflags, String& errmsg);
|
||||
explicit Program(const String& buf);
|
||||
Program(const Program& prog);
|
||||
|
||||
Program& operator = (const Program& prog);
|
||||
~Program();
|
||||
|
||||
bool create(const ProgramSource& src,
|
||||
const String& buildflags, String& errmsg);
|
||||
bool read(const String& buf, const String& buildflags);
|
||||
bool write(String& buf) const;
|
||||
|
||||
const ProgramSource& source() const;
|
||||
void* ptr() const;
|
||||
|
||||
String getPrefix() const;
|
||||
static String getPrefix(const String& buildflags);
|
||||
|
||||
protected:
|
||||
struct Impl;
|
||||
Impl* p;
|
||||
};
|
||||
|
||||
|
||||
class CV_EXPORTS ProgramSource
|
||||
{
|
||||
public:
|
||||
typedef uint64 hash_t;
|
||||
|
||||
ProgramSource();
|
||||
explicit ProgramSource(const String& prog);
|
||||
explicit ProgramSource(const char* prog);
|
||||
~ProgramSource();
|
||||
ProgramSource(const ProgramSource& prog);
|
||||
ProgramSource& operator = (const ProgramSource& prog);
|
||||
|
||||
const String& source() const;
|
||||
hash_t hash() const;
|
||||
|
||||
protected:
|
||||
struct Impl;
|
||||
Impl* p;
|
||||
};
|
||||
|
||||
}}
|
||||
|
||||
#endif
|
@ -271,7 +271,7 @@ void cv::split(InputArray _m, OutputArrayOfArrays _mv)
|
||||
_mv.release();
|
||||
return;
|
||||
}
|
||||
CV_Assert( !_mv.fixedType() || CV_MAT_TYPE(_mv.flags) == m.depth() );
|
||||
CV_Assert( !_mv.fixedType() || _mv.empty() || _mv.type() == m.depth() );
|
||||
_mv.create(m.channels(), 1, m.depth());
|
||||
Mat* dst = &_mv.getMatRef(0);
|
||||
split(m, dst);
|
||||
|
@ -1610,7 +1610,7 @@ MatExpr Mat::mul(InputArray m, double scale) const
|
||||
MatExpr e;
|
||||
if(m.kind() == _InputArray::EXPR)
|
||||
{
|
||||
const MatExpr& me = *(const MatExpr*)m.obj;
|
||||
const MatExpr& me = *(const MatExpr*)m.getObj();
|
||||
me.op->multiply(MatExpr(*this), me, e, scale);
|
||||
}
|
||||
else
|
||||
|
@ -48,6 +48,156 @@
|
||||
|
||||
namespace cv {
|
||||
|
||||
class StdMatAllocator : public MatAllocator
|
||||
{
|
||||
public:
|
||||
UMatData* allocate(int dims, const int* sizes, int type, size_t* step) const
|
||||
{
|
||||
size_t total = CV_ELEM_SIZE(type);
|
||||
for( int i = dims-1; i >= 0; i-- )
|
||||
{
|
||||
if( step )
|
||||
step[i] = total;
|
||||
total *= sizes[i];
|
||||
}
|
||||
uchar* data = (uchar*)fastMalloc(total);
|
||||
UMatData* u = new UMatData(this);
|
||||
u->data = u->origdata = data;
|
||||
u->size = total;
|
||||
u->refcount = 1;
|
||||
|
||||
return u;
|
||||
}
|
||||
|
||||
bool allocate(UMatData* u, int accessFlags) const
|
||||
{
|
||||
if(!u) return false;
|
||||
if(u->handle != 0)
|
||||
return true;
|
||||
return UMat::getStdAllocator()->allocate(u, accessFlags);
|
||||
}
|
||||
|
||||
void deallocate(UMatData* u) const
|
||||
{
|
||||
if(u)
|
||||
{
|
||||
fastFree(u->origdata);
|
||||
delete u;
|
||||
}
|
||||
}
|
||||
|
||||
void map(UMatData*, int) const
|
||||
{
|
||||
}
|
||||
|
||||
void unmap(UMatData* u) const
|
||||
{
|
||||
if(u->urefcount == 0)
|
||||
deallocate(u);
|
||||
}
|
||||
|
||||
void download(UMatData* u, void* dstptr,
|
||||
int dims, const size_t sz[],
|
||||
const size_t srcofs[], const size_t srcstep[],
|
||||
const size_t dststep[]) const
|
||||
{
|
||||
if(!u)
|
||||
return;
|
||||
int isz[CV_MAX_DIM];
|
||||
uchar* srcptr = u->data;
|
||||
for( int i = 0; i < dims; i++ )
|
||||
{
|
||||
CV_Assert( sz[i] <= (size_t)INT_MAX );
|
||||
if( sz[i] == 0 )
|
||||
return;
|
||||
if( srcofs )
|
||||
srcptr += srcofs[i]*(i <= dims-2 ? srcstep[i] : 1);
|
||||
isz[i] = (int)sz[i];
|
||||
}
|
||||
|
||||
Mat src(dims, isz, CV_8U, srcptr, srcstep);
|
||||
Mat dst(dims, isz, CV_8U, dstptr, dststep);
|
||||
|
||||
const Mat* arrays[] = { &src, &dst };
|
||||
uchar* ptrs[2];
|
||||
NAryMatIterator it(arrays, ptrs, 2);
|
||||
size_t j, planesz = it.size;
|
||||
|
||||
for( j = 0; j < it.nplanes; j++, ++it )
|
||||
memcpy(ptrs[1], ptrs[0], planesz);
|
||||
}
|
||||
|
||||
void upload(UMatData* u, const void* srcptr, int dims, const size_t sz[],
|
||||
const size_t dstofs[], const size_t dststep[],
|
||||
const size_t srcstep[]) const
|
||||
{
|
||||
if(!u)
|
||||
return;
|
||||
int isz[CV_MAX_DIM];
|
||||
uchar* dstptr = u->data;
|
||||
for( int i = 0; i < dims; i++ )
|
||||
{
|
||||
CV_Assert( sz[i] <= (size_t)INT_MAX );
|
||||
if( sz[i] == 0 )
|
||||
return;
|
||||
if( dstofs )
|
||||
dstptr += dstofs[i]*(i <= dims-2 ? dststep[i] : 1);
|
||||
isz[i] = (int)sz[i];
|
||||
}
|
||||
|
||||
Mat src(dims, isz, CV_8U, (void*)srcptr, srcstep);
|
||||
Mat dst(dims, isz, CV_8U, dstptr, dststep);
|
||||
|
||||
const Mat* arrays[] = { &src, &dst };
|
||||
uchar* ptrs[2];
|
||||
NAryMatIterator it(arrays, ptrs, 2);
|
||||
size_t j, planesz = it.size;
|
||||
|
||||
for( j = 0; j < it.nplanes; j++, ++it )
|
||||
memcpy(ptrs[1], ptrs[0], planesz);
|
||||
}
|
||||
|
||||
void copy(UMatData* usrc, UMatData* udst, int dims, const size_t sz[],
|
||||
const size_t srcofs[], const size_t srcstep[],
|
||||
const size_t dstofs[], const size_t dststep[], bool) const
|
||||
{
|
||||
if(!usrc || !udst)
|
||||
return;
|
||||
int isz[CV_MAX_DIM];
|
||||
uchar* srcptr = usrc->data;
|
||||
uchar* dstptr = udst->data;
|
||||
for( int i = 0; i < dims; i++ )
|
||||
{
|
||||
CV_Assert( sz[i] <= (size_t)INT_MAX );
|
||||
if( sz[i] == 0 )
|
||||
return;
|
||||
if( srcofs )
|
||||
srcptr += srcofs[i]*(i <= dims-2 ? srcstep[i] : 1);
|
||||
if( dstofs )
|
||||
dstptr += dstofs[i]*(i <= dims-2 ? dststep[i] : 1);
|
||||
isz[i] = (int)sz[i];
|
||||
}
|
||||
|
||||
Mat src(dims, isz, CV_8U, srcptr, srcstep);
|
||||
Mat dst(dims, isz, CV_8U, dstptr, dststep);
|
||||
|
||||
const Mat* arrays[] = { &src, &dst };
|
||||
uchar* ptrs[2];
|
||||
NAryMatIterator it(arrays, ptrs, 2);
|
||||
size_t j, planesz = it.size;
|
||||
|
||||
for( j = 0; j < it.nplanes; j++, ++it )
|
||||
memcpy(ptrs[1], ptrs[0], planesz);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
MatAllocator* Mat::getStdAllocator()
|
||||
{
|
||||
static StdMatAllocator allocator;
|
||||
return &allocator;
|
||||
}
|
||||
|
||||
void swap( Mat& a, Mat& b )
|
||||
{
|
||||
std::swap(a.flags, b.flags);
|
||||
@ -55,11 +205,11 @@ void swap( Mat& a, Mat& b )
|
||||
std::swap(a.rows, b.rows);
|
||||
std::swap(a.cols, b.cols);
|
||||
std::swap(a.data, b.data);
|
||||
std::swap(a.refcount, b.refcount);
|
||||
std::swap(a.datastart, b.datastart);
|
||||
std::swap(a.dataend, b.dataend);
|
||||
std::swap(a.datalimit, b.datalimit);
|
||||
std::swap(a.allocator, b.allocator);
|
||||
std::swap(a.u, b.u);
|
||||
|
||||
std::swap(a.size.p, b.size.p);
|
||||
std::swap(a.step.p, b.step.p);
|
||||
@ -161,6 +311,8 @@ static void finalizeHdr(Mat& m)
|
||||
int d = m.dims;
|
||||
if( d > 2 )
|
||||
m.rows = m.cols = -1;
|
||||
if(m.u)
|
||||
m.data = m.datastart = m.u->data;
|
||||
if( m.data )
|
||||
{
|
||||
m.datalimit = m.datastart + m.size[0]*m.step[0];
|
||||
@ -203,36 +355,25 @@ void Mat::create(int d, const int* _sizes, int _type)
|
||||
|
||||
if( total() > 0 )
|
||||
{
|
||||
MatAllocator *a = allocator, *a0 = getStdAllocator();
|
||||
#ifdef HAVE_TGPU
|
||||
if( !allocator || allocator == tegra::getAllocator() ) allocator = tegra::getAllocator(d, _sizes, _type);
|
||||
if( !a || a == tegra::getAllocator() )
|
||||
a = tegra::getAllocator(d, _sizes, _type);
|
||||
#endif
|
||||
if( !allocator )
|
||||
if(!a)
|
||||
a = a0;
|
||||
try
|
||||
{
|
||||
size_t totalsize = alignSize(step.p[0]*size.p[0], (int)sizeof(*refcount));
|
||||
data = datastart = (uchar*)fastMalloc(totalsize + (int)sizeof(*refcount));
|
||||
refcount = (int*)(data + totalsize);
|
||||
*refcount = 1;
|
||||
u = a->allocate(dims, size, _type, step.p);
|
||||
CV_Assert(u != 0);
|
||||
}
|
||||
else
|
||||
catch(...)
|
||||
{
|
||||
#ifdef HAVE_TGPU
|
||||
try
|
||||
{
|
||||
allocator->allocate(dims, size, _type, refcount, datastart, data, step.p);
|
||||
CV_Assert( step[dims-1] == (size_t)CV_ELEM_SIZE(flags) );
|
||||
}catch(...)
|
||||
{
|
||||
allocator = 0;
|
||||
size_t totalSize = alignSize(step.p[0]*size.p[0], (int)sizeof(*refcount));
|
||||
data = datastart = (uchar*)fastMalloc(totalSize + (int)sizeof(*refcount));
|
||||
refcount = (int*)(data + totalSize);
|
||||
*refcount = 1;
|
||||
}
|
||||
#else
|
||||
allocator->allocate(dims, size, _type, refcount, datastart, data, step.p);
|
||||
CV_Assert( step[dims-1] == (size_t)CV_ELEM_SIZE(flags) );
|
||||
#endif
|
||||
if(a != a0)
|
||||
u = a0->allocate(dims, size, _type, step.p);
|
||||
CV_Assert(u != 0);
|
||||
}
|
||||
CV_Assert( step[dims-1] == (size_t)CV_ELEM_SIZE(flags) );
|
||||
}
|
||||
|
||||
finalizeHdr(*this);
|
||||
@ -250,19 +391,13 @@ void Mat::copySize(const Mat& m)
|
||||
|
||||
void Mat::deallocate()
|
||||
{
|
||||
if( allocator )
|
||||
allocator->deallocate(refcount, datastart, data);
|
||||
else
|
||||
{
|
||||
CV_DbgAssert(refcount != 0);
|
||||
fastFree(datastart);
|
||||
}
|
||||
if(u)
|
||||
(u->currAllocator ? u->currAllocator : allocator ? allocator : getStdAllocator())->unmap(u);
|
||||
}
|
||||
|
||||
|
||||
Mat::Mat(const Mat& m, const Range& _rowRange, const Range& _colRange)
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), refcount(0), datastart(0), dataend(0),
|
||||
datalimit(0), allocator(0), size(&rows)
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), datastart(0), dataend(0),
|
||||
datalimit(0), allocator(0), u(0), size(&rows)
|
||||
{
|
||||
CV_Assert( m.dims >= 2 );
|
||||
if( m.dims > 2 )
|
||||
@ -307,9 +442,9 @@ Mat::Mat(const Mat& m, const Range& _rowRange, const Range& _colRange)
|
||||
|
||||
Mat::Mat(const Mat& m, const Rect& roi)
|
||||
: flags(m.flags), dims(2), rows(roi.height), cols(roi.width),
|
||||
data(m.data + roi.y*m.step[0]), refcount(m.refcount),
|
||||
data(m.data + roi.y*m.step[0]),
|
||||
datastart(m.datastart), dataend(m.dataend), datalimit(m.datalimit),
|
||||
allocator(m.allocator), size(&rows)
|
||||
allocator(m.allocator), u(m.u), size(&rows)
|
||||
{
|
||||
CV_Assert( m.dims <= 2 );
|
||||
flags &= roi.width < m.cols ? ~CONTINUOUS_FLAG : -1;
|
||||
@ -319,8 +454,8 @@ Mat::Mat(const Mat& m, const Rect& roi)
|
||||
data += roi.x*esz;
|
||||
CV_Assert( 0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols &&
|
||||
0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows );
|
||||
if( refcount )
|
||||
CV_XADD(refcount, 1);
|
||||
if( u )
|
||||
CV_XADD(&u->refcount, 1);
|
||||
if( roi.width < m.cols || roi.height < m.rows )
|
||||
flags |= SUBMATRIX_FLAG;
|
||||
|
||||
@ -335,8 +470,8 @@ Mat::Mat(const Mat& m, const Rect& roi)
|
||||
|
||||
|
||||
Mat::Mat(int _dims, const int* _sizes, int _type, void* _data, const size_t* _steps)
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), refcount(0), datastart(0), dataend(0),
|
||||
datalimit(0), allocator(0), size(&rows)
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), datastart(0), dataend(0),
|
||||
datalimit(0), allocator(0), u(0), size(&rows)
|
||||
{
|
||||
flags |= CV_MAT_TYPE(_type);
|
||||
data = datastart = (uchar*)_data;
|
||||
@ -346,8 +481,8 @@ Mat::Mat(int _dims, const int* _sizes, int _type, void* _data, const size_t* _st
|
||||
|
||||
|
||||
Mat::Mat(const Mat& m, const Range* ranges)
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), refcount(0), datastart(0), dataend(0),
|
||||
datalimit(0), allocator(0), size(&rows)
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), data(0), datastart(0), dataend(0),
|
||||
datalimit(0), allocator(0), u(0), size(&rows)
|
||||
{
|
||||
int i, d = m.dims;
|
||||
|
||||
@ -938,20 +1073,10 @@ void scalarToRawData(const Scalar& s, void* _buf, int type, int unroll_to)
|
||||
Input/Output Array
|
||||
\*************************************************************************************************/
|
||||
|
||||
_InputArray::_InputArray() : flags(0), obj(0) {}
|
||||
_InputArray::_InputArray(const Mat& m) : flags(MAT), obj((void*)&m) {}
|
||||
_InputArray::_InputArray(const std::vector<Mat>& vec) : flags(STD_VECTOR_MAT), obj((void*)&vec) {}
|
||||
_InputArray::_InputArray(const double& val) : flags(FIXED_TYPE + FIXED_SIZE + MATX + CV_64F), obj((void*)&val), sz(Size(1,1)) {}
|
||||
_InputArray::_InputArray(const MatExpr& expr) : flags(FIXED_TYPE + FIXED_SIZE + EXPR), obj((void*)&expr) {}
|
||||
_InputArray::_InputArray(const cuda::GpuMat& d_mat) : flags(GPU_MAT), obj((void*)&d_mat) {}
|
||||
_InputArray::_InputArray(const ogl::Buffer& buf) : flags(OPENGL_BUFFER), obj((void*)&buf) {}
|
||||
_InputArray::_InputArray(const cuda::CudaMem& cuda_mem) : flags(CUDA_MEM), obj((void*)&cuda_mem) {}
|
||||
|
||||
_InputArray::~_InputArray() {}
|
||||
|
||||
Mat _InputArray::getMat(int i) const
|
||||
{
|
||||
int k = kind();
|
||||
int accessFlags = flags & ACCESS_MASK;
|
||||
|
||||
if( k == MAT )
|
||||
{
|
||||
@ -961,6 +1086,14 @@ Mat _InputArray::getMat(int i) const
|
||||
return m->row(i);
|
||||
}
|
||||
|
||||
if( k == UMAT )
|
||||
{
|
||||
const UMat* m = (const UMat*)obj;
|
||||
if( i < 0 )
|
||||
return m->getMat(accessFlags);
|
||||
return m->getMat(accessFlags).row(i);
|
||||
}
|
||||
|
||||
if( k == EXPR )
|
||||
{
|
||||
CV_Assert( i < 0 );
|
||||
@ -995,11 +1128,6 @@ Mat _InputArray::getMat(int i) const
|
||||
return !v.empty() ? Mat(size(i), t, (void*)&v[0]) : Mat();
|
||||
}
|
||||
|
||||
if( k == OCL_MAT )
|
||||
{
|
||||
CV_Error(CV_StsNotImplemented, "This method is not implemented for oclMat yet");
|
||||
}
|
||||
|
||||
if( k == STD_VECTOR_MAT )
|
||||
{
|
||||
const std::vector<Mat>& v = *(const std::vector<Mat>*)obj;
|
||||
@ -1008,6 +1136,14 @@ Mat _InputArray::getMat(int i) const
|
||||
return v[i];
|
||||
}
|
||||
|
||||
if( k == STD_VECTOR_UMAT )
|
||||
{
|
||||
const std::vector<UMat>& v = *(const std::vector<UMat>*)obj;
|
||||
CV_Assert( 0 <= i && i < (int)v.size() );
|
||||
|
||||
return v[i].getMat(accessFlags);
|
||||
}
|
||||
|
||||
if( k == OPENGL_BUFFER )
|
||||
{
|
||||
CV_Assert( i < 0 );
|
||||
@ -1022,8 +1158,7 @@ Mat _InputArray::getMat(int i) const
|
||||
return Mat();
|
||||
}
|
||||
|
||||
CV_Assert( k == CUDA_MEM );
|
||||
//if( k == CUDA_MEM )
|
||||
if( k == CUDA_MEM )
|
||||
{
|
||||
CV_Assert( i < 0 );
|
||||
|
||||
@ -1031,12 +1166,49 @@ Mat _InputArray::getMat(int i) const
|
||||
|
||||
return cuda_mem->createMatHeader();
|
||||
}
|
||||
|
||||
CV_Error(Error::StsNotImplemented, "Unknown/unsupported array type");
|
||||
return Mat();
|
||||
}
|
||||
|
||||
|
||||
UMat _InputArray::getUMat(int i) const
|
||||
{
|
||||
int k = kind();
|
||||
int accessFlags = flags & ACCESS_MASK;
|
||||
|
||||
if( k == UMAT )
|
||||
{
|
||||
const UMat* m = (const UMat*)obj;
|
||||
if( i < 0 )
|
||||
return *m;
|
||||
return m->row(i);
|
||||
}
|
||||
|
||||
if( k == STD_VECTOR_UMAT )
|
||||
{
|
||||
const std::vector<UMat>& v = *(const std::vector<UMat>*)obj;
|
||||
CV_Assert( 0 <= i && i < (int)v.size() );
|
||||
|
||||
return v[i];
|
||||
}
|
||||
|
||||
if( k == MAT )
|
||||
{
|
||||
const Mat* m = (const Mat*)obj;
|
||||
if( i < 0 )
|
||||
return m->getUMat(accessFlags);
|
||||
return m->row(i).getUMat(accessFlags);
|
||||
}
|
||||
|
||||
return getMat(i).getUMat(accessFlags);
|
||||
}
|
||||
|
||||
|
||||
void _InputArray::getMatVector(std::vector<Mat>& mv) const
|
||||
{
|
||||
int k = kind();
|
||||
int accessFlags = flags & ACCESS_MASK;
|
||||
|
||||
if( k == MAT )
|
||||
{
|
||||
@ -1105,19 +1277,29 @@ void _InputArray::getMatVector(std::vector<Mat>& mv) const
|
||||
return;
|
||||
}
|
||||
|
||||
if( k == OCL_MAT )
|
||||
{
|
||||
CV_Error(CV_StsNotImplemented, "This method is not implemented for oclMat yet");
|
||||
}
|
||||
|
||||
CV_Assert( k == STD_VECTOR_MAT );
|
||||
//if( k == STD_VECTOR_MAT )
|
||||
if( k == STD_VECTOR_MAT )
|
||||
{
|
||||
const std::vector<Mat>& v = *(const std::vector<Mat>*)obj;
|
||||
mv.resize(v.size());
|
||||
std::copy(v.begin(), v.end(), mv.begin());
|
||||
size_t i, n = v.size();
|
||||
mv.resize(n);
|
||||
|
||||
for( 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;
|
||||
size_t i, n = v.size();
|
||||
mv.resize(n);
|
||||
|
||||
for( i = 0; i < n; i++ )
|
||||
mv[i] = v[i].getMat(accessFlags);
|
||||
return;
|
||||
}
|
||||
|
||||
CV_Error(Error::StsNotImplemented, "Unknown/unsupported array type");
|
||||
}
|
||||
|
||||
cuda::GpuMat _InputArray::getGpuMat() const
|
||||
@ -1180,6 +1362,12 @@ Size _InputArray::size(int i) const
|
||||
return ((const MatExpr*)obj)->size();
|
||||
}
|
||||
|
||||
if( k == UMAT )
|
||||
{
|
||||
CV_Assert( i < 0 );
|
||||
return ((const UMat*)obj)->size();
|
||||
}
|
||||
|
||||
if( k == MATX )
|
||||
{
|
||||
CV_Assert( i < 0 );
|
||||
@ -1258,6 +1446,12 @@ size_t _InputArray::total(int i) const
|
||||
return ((const Mat*)obj)->total();
|
||||
}
|
||||
|
||||
if( k == UMAT )
|
||||
{
|
||||
CV_Assert( i < 0 );
|
||||
return ((const UMat*)obj)->total();
|
||||
}
|
||||
|
||||
if( k == STD_VECTOR_MAT )
|
||||
{
|
||||
const std::vector<Mat>& vv = *(const std::vector<Mat>*)obj;
|
||||
@ -1278,6 +1472,9 @@ int _InputArray::type(int i) const
|
||||
if( k == MAT )
|
||||
return ((const Mat*)obj)->type();
|
||||
|
||||
if( k == UMAT )
|
||||
return ((const UMat*)obj)->type();
|
||||
|
||||
if( k == EXPR )
|
||||
return ((const MatExpr*)obj)->type();
|
||||
|
||||
@ -1290,8 +1487,12 @@ int _InputArray::type(int i) const
|
||||
if( k == STD_VECTOR_MAT )
|
||||
{
|
||||
const std::vector<Mat>& vv = *(const std::vector<Mat>*)obj;
|
||||
if( vv.empty() )
|
||||
{
|
||||
CV_Assert((flags & FIXED_TYPE) != 0);
|
||||
return CV_MAT_TYPE(flags);
|
||||
}
|
||||
CV_Assert( i < (int)vv.size() );
|
||||
|
||||
return vv[i >= 0 ? i : 0].type();
|
||||
}
|
||||
|
||||
@ -1323,6 +1524,9 @@ bool _InputArray::empty() const
|
||||
if( k == MAT )
|
||||
return ((const Mat*)obj)->empty();
|
||||
|
||||
if( k == UMAT )
|
||||
return ((const UMat*)obj)->empty();
|
||||
|
||||
if( k == EXPR )
|
||||
return false;
|
||||
|
||||
@ -1367,21 +1571,6 @@ bool _InputArray::empty() const
|
||||
}
|
||||
|
||||
|
||||
_OutputArray::_OutputArray() {}
|
||||
_OutputArray::_OutputArray(Mat& m) : _InputArray(m) {}
|
||||
_OutputArray::_OutputArray(std::vector<Mat>& vec) : _InputArray(vec) {}
|
||||
_OutputArray::_OutputArray(cuda::GpuMat& d_mat) : _InputArray(d_mat) {}
|
||||
_OutputArray::_OutputArray(ogl::Buffer& buf) : _InputArray(buf) {}
|
||||
_OutputArray::_OutputArray(cuda::CudaMem& cuda_mem) : _InputArray(cuda_mem) {}
|
||||
|
||||
_OutputArray::_OutputArray(const Mat& m) : _InputArray(m) {flags |= FIXED_SIZE|FIXED_TYPE;}
|
||||
_OutputArray::_OutputArray(const std::vector<Mat>& vec) : _InputArray(vec) {flags |= FIXED_SIZE;}
|
||||
_OutputArray::_OutputArray(const cuda::GpuMat& d_mat) : _InputArray(d_mat) {flags |= FIXED_SIZE|FIXED_TYPE;}
|
||||
_OutputArray::_OutputArray(const ogl::Buffer& buf) : _InputArray(buf) {flags |= FIXED_SIZE|FIXED_TYPE;}
|
||||
_OutputArray::_OutputArray(const cuda::CudaMem& cuda_mem) : _InputArray(cuda_mem) {flags |= FIXED_SIZE|FIXED_TYPE;}
|
||||
|
||||
_OutputArray::~_OutputArray() {}
|
||||
|
||||
bool _OutputArray::fixedSize() const
|
||||
{
|
||||
return (flags & FIXED_SIZE) == FIXED_SIZE;
|
||||
@ -1402,6 +1591,13 @@ void _OutputArray::create(Size _sz, int mtype, int i, bool allowTransposed, int
|
||||
((Mat*)obj)->create(_sz, mtype);
|
||||
return;
|
||||
}
|
||||
if( k == UMAT && i < 0 && !allowTransposed && fixedDepthMask == 0 )
|
||||
{
|
||||
CV_Assert(!fixedSize() || ((UMat*)obj)->size.operator()() == _sz);
|
||||
CV_Assert(!fixedType() || ((UMat*)obj)->type() == mtype);
|
||||
((UMat*)obj)->create(_sz, mtype);
|
||||
return;
|
||||
}
|
||||
if( k == GPU_MAT && i < 0 && !allowTransposed && fixedDepthMask == 0 )
|
||||
{
|
||||
CV_Assert(!fixedSize() || ((cuda::GpuMat*)obj)->size() == _sz);
|
||||
@ -1437,6 +1633,13 @@ void _OutputArray::create(int rows, int cols, int mtype, int i, bool allowTransp
|
||||
((Mat*)obj)->create(rows, cols, mtype);
|
||||
return;
|
||||
}
|
||||
if( k == UMAT && i < 0 && !allowTransposed && fixedDepthMask == 0 )
|
||||
{
|
||||
CV_Assert(!fixedSize() || ((UMat*)obj)->size.operator()() == Size(cols, rows));
|
||||
CV_Assert(!fixedType() || ((UMat*)obj)->type() == mtype);
|
||||
((UMat*)obj)->create(rows, cols, mtype);
|
||||
return;
|
||||
}
|
||||
if( k == GPU_MAT && i < 0 && !allowTransposed && fixedDepthMask == 0 )
|
||||
{
|
||||
CV_Assert(!fixedSize() || ((cuda::GpuMat*)obj)->size() == Size(cols, rows));
|
||||
@ -1462,7 +1665,8 @@ void _OutputArray::create(int rows, int cols, int mtype, int i, bool allowTransp
|
||||
create(2, sizes, mtype, i, allowTransposed, fixedDepthMask);
|
||||
}
|
||||
|
||||
void _OutputArray::create(int dims, const int* sizes, int mtype, int i, bool allowTransposed, int fixedDepthMask) const
|
||||
void _OutputArray::create(int dims, const int* sizes, int mtype, int i,
|
||||
bool allowTransposed, int fixedDepthMask) const
|
||||
{
|
||||
int k = kind();
|
||||
mtype = CV_MAT_TYPE(mtype);
|
||||
@ -1501,6 +1705,40 @@ void _OutputArray::create(int dims, const int* sizes, int mtype, int i, bool all
|
||||
return;
|
||||
}
|
||||
|
||||
if( k == UMAT )
|
||||
{
|
||||
CV_Assert( i < 0 );
|
||||
UMat& m = *(UMat*)obj;
|
||||
if( allowTransposed )
|
||||
{
|
||||
if( !m.isContinuous() )
|
||||
{
|
||||
CV_Assert(!fixedType() && !fixedSize());
|
||||
m.release();
|
||||
}
|
||||
|
||||
if( dims == 2 && m.dims == 2 && !m.empty() &&
|
||||
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 == dims);
|
||||
for(int j = 0; j < dims; ++j)
|
||||
CV_Assert(m.size[j] == sizes[j]);
|
||||
}
|
||||
m.create(dims, sizes, mtype);
|
||||
return;
|
||||
}
|
||||
|
||||
if( k == MATX )
|
||||
{
|
||||
CV_Assert( i < 0 );
|
||||
@ -1593,19 +1831,13 @@ void _OutputArray::create(int dims, const int* sizes, int mtype, int i, bool all
|
||||
return;
|
||||
}
|
||||
|
||||
if( k == OCL_MAT )
|
||||
{
|
||||
CV_Error(CV_StsNotImplemented, "This method is not implemented for oclMat yet");
|
||||
}
|
||||
|
||||
if( k == NONE )
|
||||
{
|
||||
CV_Error(CV_StsNullPtr, "create() called for the missing output array" );
|
||||
return;
|
||||
}
|
||||
|
||||
CV_Assert( k == STD_VECTOR_MAT );
|
||||
//if( k == STD_VECTOR_MAT )
|
||||
if( k == STD_VECTOR_MAT )
|
||||
{
|
||||
std::vector<Mat>& v = *(std::vector<Mat>*)obj;
|
||||
|
||||
@ -1661,7 +1893,10 @@ void _OutputArray::create(int dims, const int* sizes, int mtype, int i, bool all
|
||||
}
|
||||
|
||||
m.create(dims, sizes, mtype);
|
||||
return;
|
||||
}
|
||||
|
||||
CV_Error(Error::StsNotImplemented, "Unknown/unsupported array type");
|
||||
}
|
||||
|
||||
void _OutputArray::release() const
|
||||
@ -1709,16 +1944,13 @@ void _OutputArray::release() const
|
||||
return;
|
||||
}
|
||||
|
||||
if( k == OCL_MAT )
|
||||
{
|
||||
CV_Error(CV_StsNotImplemented, "This method is not implemented for oclMat yet");
|
||||
}
|
||||
|
||||
CV_Assert( k == STD_VECTOR_MAT );
|
||||
//if( k == STD_VECTOR_MAT )
|
||||
if( k == STD_VECTOR_MAT )
|
||||
{
|
||||
((std::vector<Mat>*)obj)->clear();
|
||||
return;
|
||||
}
|
||||
|
||||
CV_Error(Error::StsNotImplemented, "Unknown/unsupported array type");
|
||||
}
|
||||
|
||||
void _OutputArray::clear() const
|
||||
@ -1778,8 +2010,8 @@ cuda::CudaMem& _OutputArray::getCudaMemRef() const
|
||||
return *(cuda::CudaMem*)obj;
|
||||
}
|
||||
|
||||
static _OutputArray _none;
|
||||
OutputArray noArray() { return _none; }
|
||||
static _InputOutputArray _none;
|
||||
InputOutputArray noArray() { return _none; }
|
||||
|
||||
}
|
||||
|
||||
|
2972
modules/core/src/ocl.cpp
Normal file
2972
modules/core/src/ocl.cpp
Normal file
File diff suppressed because it is too large
Load Diff
@ -50,6 +50,7 @@
|
||||
|
||||
#include "opencv2/core/private.hpp"
|
||||
#include "opencv2/core/private.cuda.hpp"
|
||||
#include "opencv2/core/ocl.hpp"
|
||||
|
||||
#include <assert.h>
|
||||
#include <ctype.h>
|
||||
@ -105,7 +106,7 @@ extern const uchar g_Saturate8u[];
|
||||
|
||||
#if defined WIN32 || defined _WIN32
|
||||
void deleteThreadAllocData();
|
||||
void deleteThreadRNGData();
|
||||
void deleteThreadData();
|
||||
#endif
|
||||
|
||||
template<typename T1, typename T2=T1, typename T3=T1> struct OpAdd
|
||||
@ -215,6 +216,19 @@ inline bool checkScalar(const Mat& sc, int atype, int sckind, int akind)
|
||||
|
||||
void convertAndUnrollScalar( const Mat& sc, int buftype, uchar* scbuf, size_t blocksize );
|
||||
|
||||
struct TLSData
|
||||
{
|
||||
TLSData();
|
||||
RNG rng;
|
||||
int device;
|
||||
ocl::Queue oclQueue;
|
||||
int useOpenCL; // 1 - use, 0 - do not use, -1 - auto/not initialized
|
||||
|
||||
static TLSData* get();
|
||||
};
|
||||
|
||||
namespace ocl { MatAllocator* getOpenCLAllocator(); }
|
||||
|
||||
}
|
||||
|
||||
#endif /*_CXCORE_INTERNAL_H_*/
|
||||
|
@ -727,85 +727,11 @@ void RNG::fill( InputOutputArray _mat, int disttype,
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
|
||||
#ifdef HAVE_WINRT
|
||||
// using C++11 thread attribute for local thread data
|
||||
__declspec( thread ) RNG* rng = NULL;
|
||||
|
||||
void deleteThreadRNGData()
|
||||
{
|
||||
if (rng)
|
||||
delete rng;
|
||||
}
|
||||
|
||||
RNG& theRNG()
|
||||
cv::RNG& cv::theRNG()
|
||||
{
|
||||
if (!rng)
|
||||
{
|
||||
rng = new RNG;
|
||||
}
|
||||
return *rng;
|
||||
}
|
||||
#else
|
||||
#ifdef WINCE
|
||||
# define TLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF)
|
||||
#endif
|
||||
static DWORD tlsRNGKey = TLS_OUT_OF_INDEXES;
|
||||
|
||||
void deleteThreadRNGData()
|
||||
{
|
||||
if( tlsRNGKey != TLS_OUT_OF_INDEXES )
|
||||
delete (RNG*)TlsGetValue( tlsRNGKey );
|
||||
}
|
||||
|
||||
RNG& theRNG()
|
||||
{
|
||||
if( tlsRNGKey == TLS_OUT_OF_INDEXES )
|
||||
{
|
||||
tlsRNGKey = TlsAlloc();
|
||||
CV_Assert(tlsRNGKey != TLS_OUT_OF_INDEXES);
|
||||
}
|
||||
RNG* rng = (RNG*)TlsGetValue( tlsRNGKey );
|
||||
if( !rng )
|
||||
{
|
||||
rng = new RNG;
|
||||
TlsSetValue( tlsRNGKey, rng );
|
||||
}
|
||||
return *rng;
|
||||
}
|
||||
#endif //HAVE_WINRT
|
||||
#else
|
||||
|
||||
static pthread_key_t tlsRNGKey = 0;
|
||||
static pthread_once_t tlsRNGKeyOnce = PTHREAD_ONCE_INIT;
|
||||
|
||||
static void deleteRNG(void* data)
|
||||
{
|
||||
delete (RNG*)data;
|
||||
}
|
||||
|
||||
static void makeRNGKey()
|
||||
{
|
||||
int errcode = pthread_key_create(&tlsRNGKey, deleteRNG);
|
||||
CV_Assert(errcode == 0);
|
||||
}
|
||||
|
||||
RNG& theRNG()
|
||||
{
|
||||
pthread_once(&tlsRNGKeyOnce, makeRNGKey);
|
||||
RNG* rng = (RNG*)pthread_getspecific(tlsRNGKey);
|
||||
if( !rng )
|
||||
{
|
||||
rng = new RNG;
|
||||
pthread_setspecific(tlsRNGKey, rng);
|
||||
}
|
||||
return *rng;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
return TLSData::get()->rng;
|
||||
}
|
||||
|
||||
void cv::randu(InputOutputArray dst, InputArray low, InputArray high)
|
||||
|
@ -716,7 +716,7 @@ BOOL WINAPI DllMain( HINSTANCE, DWORD fdwReason, LPVOID )
|
||||
if( fdwReason == DLL_THREAD_DETACH || fdwReason == DLL_PROCESS_DETACH )
|
||||
{
|
||||
cv::deleteThreadAllocData();
|
||||
cv::deleteThreadRNGData();
|
||||
cv::deleteThreadData();
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
@ -830,4 +830,92 @@ bool Mutex::trylock() { return impl->trylock(); }
|
||||
|
||||
}
|
||||
|
||||
//////////////////////////////// thread-local storage ////////////////////////////////
|
||||
|
||||
namespace cv
|
||||
{
|
||||
|
||||
TLSData::TLSData()
|
||||
{
|
||||
device = 0;
|
||||
useOpenCL = -1;
|
||||
}
|
||||
|
||||
#ifdef WIN32
|
||||
|
||||
#ifdef HAVE_WINRT
|
||||
// using C++11 thread attribute for local thread data
|
||||
static __declspec( thread ) TLSData* g_tlsdata = NULL;
|
||||
|
||||
static void deleteThreadRNGData()
|
||||
{
|
||||
if (g_tlsdata)
|
||||
delete g_tlsdata;
|
||||
}
|
||||
|
||||
TLSData* TLSData::get()
|
||||
{
|
||||
if (!g_tlsdata)
|
||||
{
|
||||
g_tlsdata = new TLSData;
|
||||
}
|
||||
return g_tlsdata;
|
||||
}
|
||||
#else
|
||||
#ifdef WINCE
|
||||
# define TLS_OUT_OF_INDEXES ((DWORD)0xFFFFFFFF)
|
||||
#endif
|
||||
static DWORD tlsKey = TLS_OUT_OF_INDEXES;
|
||||
|
||||
void deleteThreadData()
|
||||
{
|
||||
if( tlsKey != TLS_OUT_OF_INDEXES )
|
||||
delete (TLSData*)TlsGetValue( tlsKey );
|
||||
}
|
||||
|
||||
TLSData* TLSData::get()
|
||||
{
|
||||
if( tlsKey == TLS_OUT_OF_INDEXES )
|
||||
{
|
||||
tlsKey = TlsAlloc();
|
||||
CV_Assert(tlsKey != TLS_OUT_OF_INDEXES);
|
||||
}
|
||||
TLSData* d = (TLSData*)TlsGetValue( tlsKey );
|
||||
if( !d )
|
||||
{
|
||||
d = new TLSData;
|
||||
TlsSetValue( tlsKey, d );
|
||||
}
|
||||
return d;
|
||||
}
|
||||
#endif //HAVE_WINRT
|
||||
#else
|
||||
static pthread_key_t tlsKey = 0;
|
||||
static pthread_once_t tlsKeyOnce = PTHREAD_ONCE_INIT;
|
||||
|
||||
static void deleteTLSData(void* data)
|
||||
{
|
||||
delete (TLSData*)data;
|
||||
}
|
||||
|
||||
static void makeKey()
|
||||
{
|
||||
int errcode = pthread_key_create(&tlsKey, deleteTLSData);
|
||||
CV_Assert(errcode == 0);
|
||||
}
|
||||
|
||||
TLSData* TLSData::get()
|
||||
{
|
||||
pthread_once(&tlsKeyOnce, makeKey);
|
||||
TLSData* d = (TLSData*)pthread_getspecific(tlsKey);
|
||||
if( !d )
|
||||
{
|
||||
d = new TLSData;
|
||||
pthread_setspecific(tlsKey, d);
|
||||
}
|
||||
return d;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* End of file. */
|
||||
|
644
modules/core/src/umatrix.cpp
Normal file
644
modules/core/src/umatrix.cpp
Normal file
@ -0,0 +1,644 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the Intel Corporation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#include "precomp.hpp"
|
||||
|
||||
///////////////////////////////// UMat implementation ///////////////////////////////
|
||||
|
||||
namespace cv {
|
||||
|
||||
// it should be a prime number for the best hash function
|
||||
enum { UMAT_NLOCKS = 31 };
|
||||
static Mutex umatLocks[UMAT_NLOCKS];
|
||||
|
||||
UMatData::UMatData(const MatAllocator* allocator)
|
||||
{
|
||||
prevAllocator = currAllocator = allocator;
|
||||
urefcount = refcount = 0;
|
||||
data = origdata = 0;
|
||||
size = 0;
|
||||
flags = 0;
|
||||
handle = 0;
|
||||
userdata = 0;
|
||||
}
|
||||
|
||||
void UMatData::lock()
|
||||
{
|
||||
umatLocks[(size_t)(void*)this % UMAT_NLOCKS].lock();
|
||||
}
|
||||
|
||||
void UMatData::unlock()
|
||||
{
|
||||
umatLocks[(size_t)(void*)this % UMAT_NLOCKS].unlock();
|
||||
}
|
||||
|
||||
|
||||
MatAllocator* UMat::getStdAllocator()
|
||||
{
|
||||
return ocl::getOpenCLAllocator();
|
||||
}
|
||||
|
||||
void swap( UMat& a, UMat& b )
|
||||
{
|
||||
std::swap(a.flags, b.flags);
|
||||
std::swap(a.dims, b.dims);
|
||||
std::swap(a.rows, b.rows);
|
||||
std::swap(a.cols, b.cols);
|
||||
std::swap(a.allocator, b.allocator);
|
||||
std::swap(a.u, b.u);
|
||||
std::swap(a.offset, b.offset);
|
||||
|
||||
std::swap(a.size.p, b.size.p);
|
||||
std::swap(a.step.p, b.step.p);
|
||||
std::swap(a.step.buf[0], b.step.buf[0]);
|
||||
std::swap(a.step.buf[1], b.step.buf[1]);
|
||||
|
||||
if( a.step.p == b.step.buf )
|
||||
{
|
||||
a.step.p = a.step.buf;
|
||||
a.size.p = &a.rows;
|
||||
}
|
||||
|
||||
if( b.step.p == a.step.buf )
|
||||
{
|
||||
b.step.p = b.step.buf;
|
||||
b.size.p = &b.rows;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static inline void setSize( UMat& m, int _dims, const int* _sz,
|
||||
const size_t* _steps, bool autoSteps=false )
|
||||
{
|
||||
CV_Assert( 0 <= _dims && _dims <= CV_MAX_DIM );
|
||||
if( m.dims != _dims )
|
||||
{
|
||||
if( m.step.p != m.step.buf )
|
||||
{
|
||||
fastFree(m.step.p);
|
||||
m.step.p = m.step.buf;
|
||||
m.size.p = &m.rows;
|
||||
}
|
||||
if( _dims > 2 )
|
||||
{
|
||||
m.step.p = (size_t*)fastMalloc(_dims*sizeof(m.step.p[0]) + (_dims+1)*sizeof(m.size.p[0]));
|
||||
m.size.p = (int*)(m.step.p + _dims) + 1;
|
||||
m.size.p[-1] = _dims;
|
||||
m.rows = m.cols = -1;
|
||||
}
|
||||
}
|
||||
|
||||
m.dims = _dims;
|
||||
if( !_sz )
|
||||
return;
|
||||
|
||||
size_t esz = CV_ELEM_SIZE(m.flags), total = esz;
|
||||
int i;
|
||||
for( i = _dims-1; i >= 0; i-- )
|
||||
{
|
||||
int s = _sz[i];
|
||||
CV_Assert( s >= 0 );
|
||||
m.size.p[i] = s;
|
||||
|
||||
if( _steps )
|
||||
m.step.p[i] = i < _dims-1 ? _steps[i] : esz;
|
||||
else if( autoSteps )
|
||||
{
|
||||
m.step.p[i] = total;
|
||||
int64 total1 = (int64)total*s;
|
||||
if( (uint64)total1 != (size_t)total1 )
|
||||
CV_Error( CV_StsOutOfRange, "The total matrix size does not fit to \"size_t\" type" );
|
||||
total = (size_t)total1;
|
||||
}
|
||||
}
|
||||
|
||||
if( _dims == 1 )
|
||||
{
|
||||
m.dims = 2;
|
||||
m.cols = 1;
|
||||
m.step[1] = esz;
|
||||
}
|
||||
}
|
||||
|
||||
static void updateContinuityFlag(UMat& m)
|
||||
{
|
||||
int i, j;
|
||||
for( i = 0; i < m.dims; i++ )
|
||||
{
|
||||
if( m.size[i] > 1 )
|
||||
break;
|
||||
}
|
||||
|
||||
for( j = m.dims-1; j > i; j-- )
|
||||
{
|
||||
if( m.step[j]*m.size[j] < m.step[j-1] )
|
||||
break;
|
||||
}
|
||||
|
||||
uint64 t = (uint64)m.step[0]*m.size[0];
|
||||
if( j <= i && t == (size_t)t )
|
||||
m.flags |= UMat::CONTINUOUS_FLAG;
|
||||
else
|
||||
m.flags &= ~UMat::CONTINUOUS_FLAG;
|
||||
}
|
||||
|
||||
|
||||
static void finalizeHdr(UMat& m)
|
||||
{
|
||||
updateContinuityFlag(m);
|
||||
int d = m.dims;
|
||||
if( d > 2 )
|
||||
m.rows = m.cols = -1;
|
||||
}
|
||||
|
||||
|
||||
UMat Mat::getUMat(int accessFlags) const
|
||||
{
|
||||
UMat hdr;
|
||||
if(!u)
|
||||
return hdr;
|
||||
UMat::getStdAllocator()->allocate(u, accessFlags);
|
||||
setSize(hdr, dims, size.p, step.p);
|
||||
finalizeHdr(hdr);
|
||||
hdr.u = u;
|
||||
hdr.offset = data - datastart;
|
||||
return hdr;
|
||||
}
|
||||
|
||||
void UMat::create(int d, const int* _sizes, int _type)
|
||||
{
|
||||
int i;
|
||||
CV_Assert(0 <= d && d <= CV_MAX_DIM && _sizes);
|
||||
_type = CV_MAT_TYPE(_type);
|
||||
|
||||
if( u && (d == dims || (d == 1 && dims <= 2)) && _type == type() )
|
||||
{
|
||||
if( d == 2 && rows == _sizes[0] && cols == _sizes[1] )
|
||||
return;
|
||||
for( i = 0; i < d; i++ )
|
||||
if( size[i] != _sizes[i] )
|
||||
break;
|
||||
if( i == d && (d > 1 || size[1] == 1))
|
||||
return;
|
||||
}
|
||||
|
||||
release();
|
||||
if( d == 0 )
|
||||
return;
|
||||
flags = (_type & CV_MAT_TYPE_MASK) | MAGIC_VAL;
|
||||
setSize(*this, d, _sizes, 0, true);
|
||||
offset = 0;
|
||||
|
||||
if( total() > 0 )
|
||||
{
|
||||
MatAllocator *a = allocator, *a0 = getStdAllocator();
|
||||
if(!a)
|
||||
a = a0;
|
||||
try
|
||||
{
|
||||
u = a->allocate(dims, size, _type, step.p);
|
||||
CV_Assert(u != 0);
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
if(a != a0)
|
||||
u = a0->allocate(dims, size, _type, step.p);
|
||||
CV_Assert(u != 0);
|
||||
}
|
||||
CV_Assert( step[dims-1] == (size_t)CV_ELEM_SIZE(flags) );
|
||||
}
|
||||
|
||||
finalizeHdr(*this);
|
||||
}
|
||||
|
||||
void UMat::copySize(const UMat& m)
|
||||
{
|
||||
setSize(*this, m.dims, 0, 0);
|
||||
for( int i = 0; i < dims; i++ )
|
||||
{
|
||||
size[i] = m.size[i];
|
||||
step[i] = m.step[i];
|
||||
}
|
||||
}
|
||||
|
||||
void UMat::deallocate()
|
||||
{
|
||||
u->currAllocator->deallocate(u);
|
||||
}
|
||||
|
||||
|
||||
UMat::UMat(const UMat& m, const Range& _rowRange, const Range& _colRange)
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), allocator(0), u(0), offset(0), size(&rows)
|
||||
{
|
||||
CV_Assert( m.dims >= 2 );
|
||||
if( m.dims > 2 )
|
||||
{
|
||||
AutoBuffer<Range> rs(m.dims);
|
||||
rs[0] = _rowRange;
|
||||
rs[1] = _colRange;
|
||||
for( int i = 2; i < m.dims; i++ )
|
||||
rs[i] = Range::all();
|
||||
*this = m(rs);
|
||||
return;
|
||||
}
|
||||
|
||||
*this = m;
|
||||
if( _rowRange != Range::all() && _rowRange != Range(0,rows) )
|
||||
{
|
||||
CV_Assert( 0 <= _rowRange.start && _rowRange.start <= _rowRange.end && _rowRange.end <= m.rows );
|
||||
rows = _rowRange.size();
|
||||
offset += step*_rowRange.start;
|
||||
flags |= SUBMATRIX_FLAG;
|
||||
}
|
||||
|
||||
if( _colRange != Range::all() && _colRange != Range(0,cols) )
|
||||
{
|
||||
CV_Assert( 0 <= _colRange.start && _colRange.start <= _colRange.end && _colRange.end <= m.cols );
|
||||
cols = _colRange.size();
|
||||
offset += _colRange.start*elemSize();
|
||||
flags &= cols < m.cols ? ~CONTINUOUS_FLAG : -1;
|
||||
flags |= SUBMATRIX_FLAG;
|
||||
}
|
||||
|
||||
if( rows == 1 )
|
||||
flags |= CONTINUOUS_FLAG;
|
||||
|
||||
if( rows <= 0 || cols <= 0 )
|
||||
{
|
||||
release();
|
||||
rows = cols = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
UMat::UMat(const UMat& m, const Rect& roi)
|
||||
: flags(m.flags), dims(2), rows(roi.height), cols(roi.width),
|
||||
allocator(m.allocator), u(m.u), offset(m.offset + roi.y*m.step[0]), size(&rows)
|
||||
{
|
||||
CV_Assert( m.dims <= 2 );
|
||||
flags &= roi.width < m.cols ? ~CONTINUOUS_FLAG : -1;
|
||||
flags |= roi.height == 1 ? CONTINUOUS_FLAG : 0;
|
||||
|
||||
size_t esz = CV_ELEM_SIZE(flags);
|
||||
offset += roi.x*esz;
|
||||
CV_Assert( 0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols &&
|
||||
0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows );
|
||||
if( u )
|
||||
CV_XADD(&(u->urefcount), 1);
|
||||
if( roi.width < m.cols || roi.height < m.rows )
|
||||
flags |= SUBMATRIX_FLAG;
|
||||
|
||||
step[0] = m.step[0]; step[1] = esz;
|
||||
|
||||
if( rows <= 0 || cols <= 0 )
|
||||
{
|
||||
release();
|
||||
rows = cols = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
UMat::UMat(const UMat& m, const Range* ranges)
|
||||
: flags(MAGIC_VAL), dims(0), rows(0), cols(0), allocator(0), u(0), offset(0), size(&rows)
|
||||
{
|
||||
int i, d = m.dims;
|
||||
|
||||
CV_Assert(ranges);
|
||||
for( i = 0; i < d; i++ )
|
||||
{
|
||||
Range r = ranges[i];
|
||||
CV_Assert( r == Range::all() || (0 <= r.start && r.start < r.end && r.end <= m.size[i]) );
|
||||
}
|
||||
*this = m;
|
||||
for( i = 0; i < d; i++ )
|
||||
{
|
||||
Range r = ranges[i];
|
||||
if( r != Range::all() && r != Range(0, size.p[i]))
|
||||
{
|
||||
size.p[i] = r.end - r.start;
|
||||
offset += r.start*step.p[i];
|
||||
flags |= SUBMATRIX_FLAG;
|
||||
}
|
||||
}
|
||||
updateContinuityFlag(*this);
|
||||
}
|
||||
|
||||
UMat UMat::diag(int d) const
|
||||
{
|
||||
CV_Assert( dims <= 2 );
|
||||
UMat m = *this;
|
||||
size_t esz = elemSize();
|
||||
int len;
|
||||
|
||||
if( d >= 0 )
|
||||
{
|
||||
len = std::min(cols - d, rows);
|
||||
m.offset += esz*d;
|
||||
}
|
||||
else
|
||||
{
|
||||
len = std::min(rows + d, cols);
|
||||
m.offset -= step[0]*d;
|
||||
}
|
||||
CV_DbgAssert( len > 0 );
|
||||
|
||||
m.size[0] = m.rows = len;
|
||||
m.size[1] = m.cols = 1;
|
||||
m.step[0] += (len > 1 ? esz : 0);
|
||||
|
||||
if( m.rows > 1 )
|
||||
m.flags &= ~CONTINUOUS_FLAG;
|
||||
else
|
||||
m.flags |= CONTINUOUS_FLAG;
|
||||
|
||||
if( size() != Size(1,1) )
|
||||
m.flags |= SUBMATRIX_FLAG;
|
||||
|
||||
return m;
|
||||
}
|
||||
|
||||
void UMat::locateROI( Size& wholeSize, Point& ofs ) const
|
||||
{
|
||||
CV_Assert( dims <= 2 && step[0] > 0 );
|
||||
size_t esz = elemSize(), minstep;
|
||||
ptrdiff_t delta1 = (ptrdiff_t)offset, delta2 = (ptrdiff_t)u->size;
|
||||
|
||||
if( delta1 == 0 )
|
||||
ofs.x = ofs.y = 0;
|
||||
else
|
||||
{
|
||||
ofs.y = (int)(delta1/step[0]);
|
||||
ofs.x = (int)((delta1 - step[0]*ofs.y)/esz);
|
||||
CV_DbgAssert( offset == (size_t)(ofs.y*step[0] + ofs.x*esz) );
|
||||
}
|
||||
minstep = (ofs.x + cols)*esz;
|
||||
wholeSize.height = (int)((delta2 - minstep)/step[0] + 1);
|
||||
wholeSize.height = std::max(wholeSize.height, ofs.y + rows);
|
||||
wholeSize.width = (int)((delta2 - step*(wholeSize.height-1))/esz);
|
||||
wholeSize.width = std::max(wholeSize.width, ofs.x + cols);
|
||||
}
|
||||
|
||||
|
||||
UMat& UMat::adjustROI( int dtop, int dbottom, int dleft, int dright )
|
||||
{
|
||||
CV_Assert( dims <= 2 && step[0] > 0 );
|
||||
Size wholeSize; Point ofs;
|
||||
size_t esz = elemSize();
|
||||
locateROI( wholeSize, ofs );
|
||||
int row1 = std::max(ofs.y - dtop, 0), row2 = std::min(ofs.y + rows + dbottom, wholeSize.height);
|
||||
int col1 = std::max(ofs.x - dleft, 0), col2 = std::min(ofs.x + cols + dright, wholeSize.width);
|
||||
offset += (row1 - ofs.y)*step + (col1 - ofs.x)*esz;
|
||||
rows = row2 - row1; cols = col2 - col1;
|
||||
size.p[0] = rows; size.p[1] = cols;
|
||||
if( esz*cols == step[0] || rows == 1 )
|
||||
flags |= CONTINUOUS_FLAG;
|
||||
else
|
||||
flags &= ~CONTINUOUS_FLAG;
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
UMat UMat::reshape(int new_cn, int new_rows) const
|
||||
{
|
||||
int cn = channels();
|
||||
UMat hdr = *this;
|
||||
|
||||
if( dims > 2 && new_rows == 0 && new_cn != 0 && size[dims-1]*cn % new_cn == 0 )
|
||||
{
|
||||
hdr.flags = (hdr.flags & ~CV_MAT_CN_MASK) | ((new_cn-1) << CV_CN_SHIFT);
|
||||
hdr.step[dims-1] = CV_ELEM_SIZE(hdr.flags);
|
||||
hdr.size[dims-1] = hdr.size[dims-1]*cn / new_cn;
|
||||
return hdr;
|
||||
}
|
||||
|
||||
CV_Assert( dims <= 2 );
|
||||
|
||||
if( new_cn == 0 )
|
||||
new_cn = cn;
|
||||
|
||||
int total_width = cols * cn;
|
||||
|
||||
if( (new_cn > total_width || total_width % new_cn != 0) && new_rows == 0 )
|
||||
new_rows = rows * total_width / new_cn;
|
||||
|
||||
if( new_rows != 0 && new_rows != rows )
|
||||
{
|
||||
int total_size = total_width * rows;
|
||||
if( !isContinuous() )
|
||||
CV_Error( CV_BadStep,
|
||||
"The matrix is not continuous, thus its number of rows can not be changed" );
|
||||
|
||||
if( (unsigned)new_rows > (unsigned)total_size )
|
||||
CV_Error( CV_StsOutOfRange, "Bad new number of rows" );
|
||||
|
||||
total_width = total_size / new_rows;
|
||||
|
||||
if( total_width * new_rows != total_size )
|
||||
CV_Error( CV_StsBadArg, "The total number of matrix elements "
|
||||
"is not divisible by the new number of rows" );
|
||||
|
||||
hdr.rows = new_rows;
|
||||
hdr.step[0] = total_width * elemSize1();
|
||||
}
|
||||
|
||||
int new_width = total_width / new_cn;
|
||||
|
||||
if( new_width * new_cn != total_width )
|
||||
CV_Error( CV_BadNumChannels,
|
||||
"The total width is not divisible by the new number of channels" );
|
||||
|
||||
hdr.cols = new_width;
|
||||
hdr.flags = (hdr.flags & ~CV_MAT_CN_MASK) | ((new_cn-1) << CV_CN_SHIFT);
|
||||
hdr.step[1] = CV_ELEM_SIZE(hdr.flags);
|
||||
return hdr;
|
||||
}
|
||||
|
||||
UMat UMat::diag(const UMat& d)
|
||||
{
|
||||
CV_Assert( d.cols == 1 || d.rows == 1 );
|
||||
int len = d.rows + d.cols - 1;
|
||||
UMat m(len, len, d.type(), Scalar(0));
|
||||
UMat md = m.diag();
|
||||
if( d.cols == 1 )
|
||||
d.copyTo(md);
|
||||
else
|
||||
transpose(d, md);
|
||||
return m;
|
||||
}
|
||||
|
||||
int UMat::checkVector(int _elemChannels, int _depth, bool _requireContinuous) const
|
||||
{
|
||||
return (depth() == _depth || _depth <= 0) &&
|
||||
(isContinuous() || !_requireContinuous) &&
|
||||
((dims == 2 && (((rows == 1 || cols == 1) && channels() == _elemChannels) ||
|
||||
(cols == _elemChannels && channels() == 1))) ||
|
||||
(dims == 3 && channels() == 1 && size.p[2] == _elemChannels && (size.p[0] == 1 || size.p[1] == 1) &&
|
||||
(isContinuous() || step.p[1] == step.p[2]*size.p[2])))
|
||||
? (int)(total()*channels()/_elemChannels) : -1;
|
||||
}
|
||||
|
||||
|
||||
UMat UMat::cross(InputArray) const
|
||||
{
|
||||
CV_Error(CV_StsNotImplemented, "");
|
||||
return UMat();
|
||||
}
|
||||
|
||||
|
||||
UMat UMat::reshape(int _cn, int _newndims, const int* _newsz) const
|
||||
{
|
||||
if(_newndims == dims)
|
||||
{
|
||||
if(_newsz == 0)
|
||||
return reshape(_cn);
|
||||
if(_newndims == 2)
|
||||
return reshape(_cn, _newsz[0]);
|
||||
}
|
||||
|
||||
CV_Error(CV_StsNotImplemented, "");
|
||||
// TBD
|
||||
return UMat();
|
||||
}
|
||||
|
||||
|
||||
Mat UMat::getMat(int accessFlags) const
|
||||
{
|
||||
if(!u)
|
||||
return Mat();
|
||||
u->currAllocator->map(u, accessFlags);
|
||||
CV_Assert(u->data != 0);
|
||||
Mat hdr(dims, size.p, type(), u->data + offset, step.p);
|
||||
hdr.u = u;
|
||||
hdr.datastart = hdr.data = u->data;
|
||||
hdr.datalimit = hdr.dataend = u->data + u->size;
|
||||
CV_XADD(&hdr.u->refcount, 1);
|
||||
return hdr;
|
||||
}
|
||||
|
||||
void* UMat::handle(int /*accessFlags*/) const
|
||||
{
|
||||
if( !u )
|
||||
return 0;
|
||||
|
||||
// check flags: if CPU copy is newer, copy it back to GPU.
|
||||
if( u->deviceCopyObsolete() )
|
||||
{
|
||||
CV_Assert(u->refcount == 0);
|
||||
u->currAllocator->unmap(u);
|
||||
}
|
||||
/*else if( u->refcount > 0 && (accessFlags & ACCESS_WRITE) )
|
||||
{
|
||||
CV_Error(Error::StsError,
|
||||
"it's not allowed to access UMat handle for writing "
|
||||
"while it's mapped; call Mat::release() first for all its mappings");
|
||||
}*/
|
||||
return u->handle;
|
||||
}
|
||||
|
||||
void UMat::ndoffset(size_t* ofs) const
|
||||
{
|
||||
// offset = step[0]*ofs[0] + step[1]*ofs[1] + step[2]*ofs[2] + ...;
|
||||
size_t val = offset;
|
||||
for( int i = 0; i < dims; i++ )
|
||||
{
|
||||
size_t s = step.p[i];
|
||||
ofs[i] = val / s;
|
||||
val -= ofs[i]*s;
|
||||
}
|
||||
}
|
||||
|
||||
void UMat::copyTo(OutputArray _dst) const
|
||||
{
|
||||
int dtype = _dst.type();
|
||||
if( _dst.fixedType() && dtype != type() )
|
||||
{
|
||||
CV_Assert( channels() == CV_MAT_CN(dtype) );
|
||||
convertTo( _dst, dtype );
|
||||
return;
|
||||
}
|
||||
|
||||
if( empty() )
|
||||
{
|
||||
_dst.release();
|
||||
return;
|
||||
}
|
||||
|
||||
size_t i, sz[CV_MAX_DIM], srcofs[CV_MAX_DIM], dstofs[CV_MAX_DIM], esz = elemSize();
|
||||
for( i = 0; i < (size_t)dims; i++ )
|
||||
sz[i] = size.p[i];
|
||||
sz[dims-1] *= esz;
|
||||
ndoffset(srcofs);
|
||||
srcofs[dims-1] *= esz;
|
||||
|
||||
_dst.create( dims, size.p, type() );
|
||||
if( _dst.kind() == _InputArray::UMAT )
|
||||
{
|
||||
UMat dst = _dst.getUMat();
|
||||
void* srchandle = handle(ACCESS_READ);
|
||||
void* dsthandle = dst.handle(ACCESS_WRITE);
|
||||
if( srchandle == dsthandle && dst.offset == offset )
|
||||
return;
|
||||
ndoffset(dstofs);
|
||||
CV_Assert(u->currAllocator == dst.u->currAllocator);
|
||||
u->currAllocator->copy(u, dst.u, dims, sz, srcofs, step.p, dstofs, dst.step.p, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
Mat dst = _dst.getMat();
|
||||
u->currAllocator->download(u, dst.data, dims, sz, srcofs, step.p, dst.step.p);
|
||||
}
|
||||
}
|
||||
|
||||
void UMat::convertTo(OutputArray, int, double, double) const
|
||||
{
|
||||
CV_Error(Error::StsNotImplemented, "");
|
||||
}
|
||||
|
||||
UMat& UMat::operator = (const Scalar&)
|
||||
{
|
||||
CV_Error(Error::StsNotImplemented, "");
|
||||
return *this;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* End of file. */
|
137
modules/core/test/test_umat.cpp
Normal file
137
modules/core/test/test_umat.cpp
Normal file
@ -0,0 +1,137 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// By downloading, copying, installing or using the software you agree to this license.
|
||||
// If you do not agree to this license, do not download, install,
|
||||
// copy or use the software.
|
||||
//
|
||||
//
|
||||
// License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2013, OpenCV Foundation, all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not be used to endorse or promote products
|
||||
// derived from this software without specific prior written permission.
|
||||
//
|
||||
// This software is provided by the copyright holders and contributors "as is" and
|
||||
// any express or implied warranties, including, but not limited to, the implied
|
||||
// warranties of merchantability and fitness for a particular purpose are disclaimed.
|
||||
// In no event shall the OpenCV Foundation or contributors be liable for any direct,
|
||||
// indirect, incidental, special, exemplary, or consequential damages
|
||||
// (including, but not limited to, procurement of substitute goods or services;
|
||||
// loss of use, data, or profits; or business interruption) however caused
|
||||
// and on any theory of liability, whether in contract, strict liability,
|
||||
// or tort (including negligence or otherwise) arising in any way out of
|
||||
// the use of this software, even if advised of the possibility of such damage.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#include "test_precomp.hpp"
|
||||
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <iterator>
|
||||
#include <limits>
|
||||
#include <numeric>
|
||||
#include "opencv2/core/ocl.hpp"
|
||||
|
||||
using namespace cv;
|
||||
using namespace std;
|
||||
|
||||
class CV_UMatTest : public cvtest::BaseTest
|
||||
{
|
||||
public:
|
||||
CV_UMatTest() {}
|
||||
~CV_UMatTest() {}
|
||||
protected:
|
||||
void run(int);
|
||||
|
||||
struct test_excep
|
||||
{
|
||||
test_excep(const string& _s=string("")) : s(_s) {};
|
||||
string s;
|
||||
};
|
||||
|
||||
bool TestUMat();
|
||||
|
||||
void checkDiff(const Mat& m1, const Mat& m2, const string& s)
|
||||
{
|
||||
if (norm(m1, m2, NORM_INF) != 0)
|
||||
throw test_excep(s);
|
||||
}
|
||||
void checkDiffF(const Mat& m1, const Mat& m2, const string& s)
|
||||
{
|
||||
if (norm(m1, m2, NORM_INF) > 1e-5)
|
||||
throw test_excep(s);
|
||||
}
|
||||
};
|
||||
|
||||
#define STR(a) STR2(a)
|
||||
#define STR2(a) #a
|
||||
|
||||
#define CHECK_DIFF(a, b) checkDiff(a, b, "(" #a ") != (" #b ") at l." STR(__LINE__))
|
||||
#define CHECK_DIFF_FLT(a, b) checkDiffF(a, b, "(" #a ") !=(eps) (" #b ") at l." STR(__LINE__))
|
||||
|
||||
|
||||
bool CV_UMatTest::TestUMat()
|
||||
{
|
||||
try
|
||||
{
|
||||
Mat a(100, 100, CV_16S), b;
|
||||
randu(a, Scalar::all(-100), Scalar::all(100));
|
||||
Rect roi(1, 3, 10, 20);
|
||||
Mat ra(a, roi), rb;
|
||||
UMat ua, ura;
|
||||
a.copyTo(ua);
|
||||
ua.copyTo(b);
|
||||
CHECK_DIFF(a, b);
|
||||
|
||||
ura = ua(roi);
|
||||
ura.copyTo(rb);
|
||||
|
||||
CHECK_DIFF(ra, rb);
|
||||
|
||||
ra += Scalar::all(1.f);
|
||||
{
|
||||
Mat temp = ura.getMat(ACCESS_RW);
|
||||
temp += Scalar::all(1.f);
|
||||
}
|
||||
ra.copyTo(rb);
|
||||
CHECK_DIFF(ra, rb);
|
||||
}
|
||||
catch (const test_excep& e)
|
||||
{
|
||||
ts->printf(cvtest::TS::LOG, "%s\n", e.s.c_str());
|
||||
ts->set_failed_test_info(cvtest::TS::FAIL_MISMATCH);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void CV_UMatTest::run( int /* start_from */)
|
||||
{
|
||||
printf("Use OpenCL: %s\nHave OpenCL: %s\n",
|
||||
ocl::useOpenCL() ? "TRUE" : "FALSE",
|
||||
ocl::haveOpenCL() ? "TRUE" : "FALSE" );
|
||||
|
||||
if (!TestUMat())
|
||||
return;
|
||||
|
||||
ts->set_failed_test_info(cvtest::TS::OK);
|
||||
}
|
||||
|
||||
TEST(Core_UMat, base) { CV_UMatTest test; test.safe_run(); }
|
@ -9,7 +9,7 @@ using std::tr1::get;
|
||||
|
||||
typedef tr1::tuple<Size, MatType> Size_Source_t;
|
||||
typedef TestBaseWithParam<Size_Source_t> Size_Source;
|
||||
typedef TestBaseWithParam<Size> MatSize;
|
||||
typedef TestBaseWithParam<Size> TestMatSize;
|
||||
|
||||
static const float rangeHight = 256.0f;
|
||||
static const float rangeLow = 0.0f;
|
||||
@ -99,6 +99,7 @@ PERF_TEST_P(Size_Source, calcHist3d,
|
||||
SANITY_CHECK(hist);
|
||||
}
|
||||
|
||||
#define MatSize TestMatSize
|
||||
PERF_TEST_P(MatSize, equalizeHist,
|
||||
testing::Values(TYPICAL_MAT_SIZES)
|
||||
)
|
||||
@ -115,6 +116,7 @@ PERF_TEST_P(MatSize, equalizeHist,
|
||||
|
||||
SANITY_CHECK(destination);
|
||||
}
|
||||
#undef MatSize
|
||||
|
||||
typedef tr1::tuple<Size, double> Sz_ClipLimit_t;
|
||||
typedef TestBaseWithParam<Sz_ClipLimit_t> Sz_ClipLimit;
|
||||
|
@ -102,7 +102,8 @@ float
|
||||
CvEM::predict( const CvMat* _sample, CvMat* _probs ) const
|
||||
{
|
||||
Mat prbs0 = cvarrToMat(_probs), prbs = prbs0, sample = cvarrToMat(_sample);
|
||||
int cls = static_cast<int>(emObj.predict(sample, _probs ? _OutputArray(prbs) : cv::noArray())[1]);
|
||||
int cls = static_cast<int>(emObj.predict(sample, _probs ? _OutputArray(prbs) :
|
||||
(OutputArray)cv::noArray())[1]);
|
||||
if(_probs)
|
||||
{
|
||||
if( prbs.data != prbs0.data )
|
||||
@ -208,13 +209,16 @@ bool CvEM::train( const Mat& _samples, const Mat& _sample_idx,
|
||||
bool isOk = false;
|
||||
if( _params.start_step == EM::START_AUTO_STEP )
|
||||
isOk = emObj.train(_samples,
|
||||
logLikelihoods, _labels ? _OutputArray(*_labels) : cv::noArray(), probs);
|
||||
logLikelihoods, _labels ? _OutputArray(*_labels) :
|
||||
(OutputArray)cv::noArray(), probs);
|
||||
else if( _params.start_step == EM::START_E_STEP )
|
||||
isOk = emObj.trainE(_samples, means, covshdrs, weights,
|
||||
logLikelihoods, _labels ? _OutputArray(*_labels) : cv::noArray(), probs);
|
||||
logLikelihoods, _labels ? _OutputArray(*_labels) :
|
||||
(OutputArray)cv::noArray(), probs);
|
||||
else if( _params.start_step == EM::START_M_STEP )
|
||||
isOk = emObj.trainM(_samples, prbs,
|
||||
logLikelihoods, _labels ? _OutputArray(*_labels) : cv::noArray(), probs);
|
||||
logLikelihoods, _labels ? _OutputArray(*_labels) :
|
||||
(OutputArray)cv::noArray(), probs);
|
||||
else
|
||||
CV_Error(CV_StsBadArg, "Bad start type of EM algorithm");
|
||||
|
||||
@ -230,7 +234,9 @@ bool CvEM::train( const Mat& _samples, const Mat& _sample_idx,
|
||||
float
|
||||
CvEM::predict( const Mat& _sample, Mat* _probs ) const
|
||||
{
|
||||
return static_cast<float>(emObj.predict(_sample, _probs ? _OutputArray(*_probs) : cv::noArray())[1]);
|
||||
return static_cast<float>(emObj.predict(_sample, _probs ?
|
||||
_OutputArray(*_probs) :
|
||||
(OutputArray)cv::noArray())[1]);
|
||||
}
|
||||
|
||||
int CvEM::getNClusters() const
|
||||
|
@ -82,7 +82,7 @@ cvExtractSURF( const CvArr* _img, const CvArr* _mask,
|
||||
surf->set("upright", params.upright != 0);
|
||||
surf->set("extended", params.extended != 0);
|
||||
|
||||
surf->operator()(img, mask, kpt, _descriptors ? _OutputArray(descr) : noArray(),
|
||||
surf->operator()(img, mask, kpt, _descriptors ? _OutputArray(descr) : (OutputArray)noArray(),
|
||||
useProvidedKeyPts != 0);
|
||||
|
||||
if( _keypoints )
|
||||
|
@ -154,30 +154,24 @@ void cv::ocl::oclMat::upload(const Mat &m)
|
||||
|
||||
cv::ocl::oclMat::operator cv::_InputArray()
|
||||
{
|
||||
_InputArray newInputArray;
|
||||
newInputArray.flags = cv::_InputArray::OCL_MAT;
|
||||
newInputArray.obj = reinterpret_cast<void *>(this);
|
||||
return newInputArray;
|
||||
return _InputArray(cv::_InputArray::OCL_MAT, this);
|
||||
}
|
||||
|
||||
cv::ocl::oclMat::operator cv::_OutputArray()
|
||||
{
|
||||
_OutputArray newOutputArray;
|
||||
newOutputArray.flags = cv::_InputArray::OCL_MAT;
|
||||
newOutputArray.obj = reinterpret_cast<void *>(this);
|
||||
return newOutputArray;
|
||||
return _OutputArray(cv::_InputArray::OCL_MAT, this);
|
||||
}
|
||||
|
||||
cv::ocl::oclMat& cv::ocl::getOclMatRef(InputArray src)
|
||||
{
|
||||
CV_Assert(src.flags & cv::_InputArray::OCL_MAT);
|
||||
return *reinterpret_cast<oclMat*>(src.obj);
|
||||
CV_Assert(src.kind() == cv::_InputArray::OCL_MAT);
|
||||
return *(oclMat*)src.getObj();
|
||||
}
|
||||
|
||||
cv::ocl::oclMat& cv::ocl::getOclMatRef(OutputArray src)
|
||||
{
|
||||
CV_Assert(src.flags & cv::_InputArray::OCL_MAT);
|
||||
return *reinterpret_cast<oclMat*>(src.obj);
|
||||
CV_Assert(src.kind() == cv::_InputArray::OCL_MAT);
|
||||
return *(oclMat*)src.getObj();
|
||||
}
|
||||
|
||||
void cv::ocl::oclMat::download(cv::Mat &m) const
|
||||
|
@ -175,27 +175,27 @@ static PyObject* failmsgp(const char *fmt, ...)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static size_t REFCOUNT_OFFSET = (size_t)&(((PyObject*)0)->ob_refcnt) +
|
||||
(0x12345678 != *(const size_t*)"\x78\x56\x34\x12\0\0\0\0\0")*sizeof(int);
|
||||
|
||||
static inline PyObject* pyObjectFromRefcount(const int* refcount)
|
||||
{
|
||||
return (PyObject*)((size_t)refcount - REFCOUNT_OFFSET);
|
||||
}
|
||||
|
||||
static inline int* refcountFromPyObject(const PyObject* obj)
|
||||
{
|
||||
return (int*)((size_t)obj + REFCOUNT_OFFSET);
|
||||
}
|
||||
|
||||
class NumpyAllocator : public MatAllocator
|
||||
{
|
||||
public:
|
||||
NumpyAllocator() {}
|
||||
NumpyAllocator() { stdAllocator = Mat::getStdAllocator(); }
|
||||
~NumpyAllocator() {}
|
||||
|
||||
void allocate(int dims, const int* sizes, int type, int*& refcount,
|
||||
uchar*& datastart, uchar*& data, size_t* step)
|
||||
UMatData* allocate(PyObject* o, int dims, const int* sizes, int type, size_t* step) const
|
||||
{
|
||||
UMatData* u = new UMatData(this);
|
||||
u->refcount = 1;
|
||||
u->data = u->origdata = (uchar*)PyArray_DATA((PyArrayObject*) o);
|
||||
npy_intp* _strides = PyArray_STRIDES((PyArrayObject*) o);
|
||||
for( int i = 0; i < dims - 1; i++ )
|
||||
step[i] = (size_t)_strides[i];
|
||||
step[dims-1] = CV_ELEM_SIZE(type);
|
||||
u->size = sizes[0]*step[0];
|
||||
u->userdata = o;
|
||||
return u;
|
||||
}
|
||||
|
||||
UMatData* allocate(int dims0, const int* sizes, int type, size_t* step) const
|
||||
{
|
||||
PyEnsureGIL gil;
|
||||
|
||||
@ -203,10 +203,10 @@ public:
|
||||
int cn = CV_MAT_CN(type);
|
||||
const int f = (int)(sizeof(size_t)/8);
|
||||
int typenum = depth == CV_8U ? NPY_UBYTE : depth == CV_8S ? NPY_BYTE :
|
||||
depth == CV_16U ? NPY_USHORT : depth == CV_16S ? NPY_SHORT :
|
||||
depth == CV_32S ? NPY_INT : depth == CV_32F ? NPY_FLOAT :
|
||||
depth == CV_64F ? NPY_DOUBLE : f*NPY_ULONGLONG + (f^1)*NPY_UINT;
|
||||
int i;
|
||||
depth == CV_16U ? NPY_USHORT : depth == CV_16S ? NPY_SHORT :
|
||||
depth == CV_32S ? NPY_INT : depth == CV_32F ? NPY_FLOAT :
|
||||
depth == CV_64F ? NPY_DOUBLE : f*NPY_ULONGLONG + (f^1)*NPY_UINT;
|
||||
int i, dims = dims0;
|
||||
cv::AutoBuffer<npy_intp> _sizes(dims + 1);
|
||||
for( i = 0; i < dims; i++ )
|
||||
_sizes[i] = sizes[i];
|
||||
@ -215,22 +215,58 @@ public:
|
||||
PyObject* o = PyArray_SimpleNew(dims, _sizes, typenum);
|
||||
if(!o)
|
||||
CV_Error_(Error::StsError, ("The numpy array of typenum=%d, ndims=%d can not be created", typenum, dims));
|
||||
refcount = refcountFromPyObject(o);
|
||||
npy_intp* _strides = PyArray_STRIDES((PyArrayObject*) o);
|
||||
for( i = 0; i < dims - (cn > 1); i++ )
|
||||
step[i] = (size_t)_strides[i];
|
||||
datastart = data = (uchar*)PyArray_DATA((PyArrayObject*) o);
|
||||
return allocate(o, dims0, sizes, type, step);
|
||||
}
|
||||
|
||||
void deallocate(int* refcount, uchar*, uchar*)
|
||||
bool allocate(UMatData* u, int accessFlags) const
|
||||
{
|
||||
PyEnsureGIL gil;
|
||||
if( !refcount )
|
||||
return;
|
||||
PyObject* o = pyObjectFromRefcount(refcount);
|
||||
Py_INCREF(o);
|
||||
Py_DECREF(o);
|
||||
return stdAllocator->allocate(u, accessFlags);
|
||||
}
|
||||
|
||||
void deallocate(UMatData* u) const
|
||||
{
|
||||
if(u)
|
||||
{
|
||||
PyEnsureGIL gil;
|
||||
PyObject* o = (PyObject*)u->userdata;
|
||||
Py_DECREF(o);
|
||||
delete u;
|
||||
}
|
||||
}
|
||||
|
||||
void map(UMatData*, int) const
|
||||
{
|
||||
}
|
||||
|
||||
void unmap(UMatData* u) const
|
||||
{
|
||||
if(u->urefcount == 0)
|
||||
deallocate(u);
|
||||
}
|
||||
|
||||
void download(UMatData* u, void* dstptr,
|
||||
int dims, const size_t sz[],
|
||||
const size_t srcofs[], const size_t srcstep[],
|
||||
const size_t dststep[]) const
|
||||
{
|
||||
stdAllocator->download(u, dstptr, dims, sz, srcofs, srcstep, dststep);
|
||||
}
|
||||
|
||||
void upload(UMatData* u, const void* srcptr, int dims, const size_t sz[],
|
||||
const size_t dstofs[], const size_t dststep[],
|
||||
const size_t srcstep[]) const
|
||||
{
|
||||
stdAllocator->upload(u, srcptr, dims, sz, dstofs, dststep, srcstep);
|
||||
}
|
||||
|
||||
void copy(UMatData* usrc, UMatData* udst, int dims, const size_t sz[],
|
||||
const size_t srcofs[], const size_t srcstep[],
|
||||
const size_t dstofs[], const size_t dststep[], bool sync) const
|
||||
{
|
||||
stdAllocator->copy(usrc, udst, dims, sz, srcofs, srcstep, dstofs, dststep, sync);
|
||||
}
|
||||
|
||||
const MatAllocator* stdAllocator;
|
||||
};
|
||||
|
||||
NumpyAllocator g_numpyAllocator;
|
||||
@ -400,16 +436,12 @@ static bool pyopencv_to(PyObject* o, Mat& m, const ArgInfo info)
|
||||
}
|
||||
|
||||
m = Mat(ndims, size, type, PyArray_DATA(oarr), step);
|
||||
m.u = g_numpyAllocator.allocate(o, ndims, size, type, step);
|
||||
|
||||
if( m.data )
|
||||
if( !needcopy )
|
||||
{
|
||||
m.refcount = refcountFromPyObject(o);
|
||||
if (!needcopy)
|
||||
{
|
||||
m.addref(); // protect the original numpy array from deallocation
|
||||
// (since Mat destructor will decrement the reference counter)
|
||||
}
|
||||
};
|
||||
Py_INCREF(o);
|
||||
}
|
||||
m.allocator = &g_numpyAllocator;
|
||||
|
||||
return true;
|
||||
@ -421,14 +453,15 @@ PyObject* pyopencv_from(const Mat& m)
|
||||
if( !m.data )
|
||||
Py_RETURN_NONE;
|
||||
Mat temp, *p = (Mat*)&m;
|
||||
if(!p->refcount || p->allocator != &g_numpyAllocator)
|
||||
if(!p->u || p->allocator != &g_numpyAllocator)
|
||||
{
|
||||
temp.allocator = &g_numpyAllocator;
|
||||
ERRWRAP2(m.copyTo(temp));
|
||||
p = &temp;
|
||||
}
|
||||
p->addref();
|
||||
return pyObjectFromRefcount(p->refcount);
|
||||
PyObject* o = (PyObject*)p->u->userdata;
|
||||
Py_INCREF(o);
|
||||
return o;
|
||||
}
|
||||
|
||||
template<>
|
||||
|
@ -163,7 +163,9 @@ namespace
|
||||
|
||||
void Farneback::impl(const Mat& input0, const Mat& input1, OutputArray dst)
|
||||
{
|
||||
calcOpticalFlowFarneback(input0, input1, dst, pyrScale_, numLevels_, winSize_, numIters_, polyN_, polySigma_, flags_);
|
||||
calcOpticalFlowFarneback(input0, input1, (InputOutputArray)dst, pyrScale_,
|
||||
numLevels_, winSize_, numIters_,
|
||||
polyN_, polySigma_, flags_);
|
||||
}
|
||||
}
|
||||
|
||||
@ -325,7 +327,7 @@ namespace
|
||||
alg_->set("iterations", iterations_);
|
||||
alg_->set("useInitialFlow", useInitialFlow_);
|
||||
|
||||
alg_->calc(input0, input1, dst);
|
||||
alg_->calc(input0, input1, (InputOutputArray)dst);
|
||||
}
|
||||
|
||||
void DualTVL1::collectGarbage()
|
||||
|
@ -352,7 +352,7 @@ cvCalcOpticalFlowPyrLK( const void* arrA, const void* arrB,
|
||||
if( error )
|
||||
err = cv::Mat(count, 1, CV_32F, (void*)error);
|
||||
cv::calcOpticalFlowPyrLK( A, B, ptA, ptB, st,
|
||||
error ? cv::_OutputArray(err) : cv::noArray(),
|
||||
error ? cv::_OutputArray(err) : (cv::_OutputArray)cv::noArray(),
|
||||
winSize, level, criteria, flags);
|
||||
}
|
||||
|
||||
|
@ -564,7 +564,7 @@ FarnebackUpdateFlow_GaussianBlur( const Mat& _R0, const Mat& _R1,
|
||||
}
|
||||
|
||||
void cv::calcOpticalFlowFarneback( InputArray _prev0, InputArray _next0,
|
||||
OutputArray _flow0, double pyr_scale, int levels, int winsize,
|
||||
InputOutputArray _flow0, double pyr_scale, int levels, int winsize,
|
||||
int iterations, int poly_n, double poly_sigma, int flags )
|
||||
{
|
||||
Mat prev0 = _prev0.getMat(), next0 = _next0.getMat();
|
||||
|
Loading…
x
Reference in New Issue
Block a user