Merge remote-tracking branch 'master' into stitch-fix
* 'master' of github.com:itseez/opencv: (82 commits) moved part of video to contrib/{outflow, bgsegm}; moved matlab to contrib added some basic functionality needed by the new face module (moved from the old "contrib") moved to the new opencv_contrib/face module fixed various warnings and obvious errors reported by clang compiler and the coverity tool. Fixed review comment from Vadim Pisarevsky modified farneback sample to use T-API ECC patch by the author (G. Evangelidis); fixed some OCL Farneback optical flow test failures on Mac small fix for GaussianBlur ocl test fix binary package build small fix for ocl_resize fix IOS framework fixed test ocl_MatchTemplate for sparse matrix Fixed typos fixing error, wrong template method param. fixing Mac build some formal changes (generally adding constness) Fixed choice of kercn and rowsPerWI for non-Intel device. fixed nDiffs for CalcBackProject fixed tests for ocl_filter2d, ocl_matchTemplate, ocl_histogram.cpp Fixed issue: Mat::copyTo(UMat) if device copy is obsolete. Added test. ... Conflicts: modules/core/include/opencv2/core/mat.inl.hpp
This commit is contained in:
@@ -690,7 +690,61 @@ public:
|
||||
Mat mean; //!< mean value subtracted before the projection and added after the back projection
|
||||
};
|
||||
|
||||
// Linear Discriminant Analysis
|
||||
class CV_EXPORTS LDA
|
||||
{
|
||||
public:
|
||||
// Initializes a LDA with num_components (default 0) and specifies how
|
||||
// samples are aligned (default dataAsRow=true).
|
||||
explicit LDA(int num_components = 0);
|
||||
|
||||
// Initializes and performs a Discriminant Analysis with Fisher's
|
||||
// Optimization Criterion on given data in src and corresponding labels
|
||||
// in labels. If 0 (or less) number of components are given, they are
|
||||
// automatically determined for given data in computation.
|
||||
LDA(InputArrayOfArrays src, InputArray labels, int num_components = 0);
|
||||
|
||||
// Serializes this object to a given filename.
|
||||
void save(const String& filename) const;
|
||||
|
||||
// Deserializes this object from a given filename.
|
||||
void load(const String& filename);
|
||||
|
||||
// Serializes this object to a given cv::FileStorage.
|
||||
void save(FileStorage& fs) const;
|
||||
|
||||
// Deserializes this object from a given cv::FileStorage.
|
||||
void load(const FileStorage& node);
|
||||
|
||||
// Destructor.
|
||||
~LDA();
|
||||
|
||||
//! Compute the discriminants for data in src and labels.
|
||||
void compute(InputArrayOfArrays src, InputArray labels);
|
||||
|
||||
// Projects samples into the LDA subspace.
|
||||
Mat project(InputArray src);
|
||||
|
||||
// Reconstructs projections from the LDA subspace.
|
||||
Mat reconstruct(InputArray src);
|
||||
|
||||
// Returns the eigenvectors of this LDA.
|
||||
Mat eigenvectors() const { return _eigenvectors; }
|
||||
|
||||
// Returns the eigenvalues of this LDA.
|
||||
Mat eigenvalues() const { return _eigenvalues; }
|
||||
|
||||
static Mat subspaceProject(InputArray W, InputArray mean, InputArray src);
|
||||
static Mat subspaceReconstruct(InputArray W, InputArray mean, InputArray src);
|
||||
|
||||
protected:
|
||||
bool _dataAsRow;
|
||||
int _num_components;
|
||||
Mat _eigenvectors;
|
||||
Mat _eigenvalues;
|
||||
|
||||
void lda(InputArrayOfArrays src, InputArray labels);
|
||||
};
|
||||
|
||||
/*!
|
||||
Singular Value Decomposition class
|
||||
|
@@ -261,8 +261,8 @@ public:
|
||||
int* refcount;
|
||||
|
||||
//! helper fields used in locateROI and adjustROI
|
||||
uchar* datastart;
|
||||
uchar* dataend;
|
||||
const uchar* datastart;
|
||||
const uchar* dataend;
|
||||
|
||||
//! allocator
|
||||
Allocator* allocator;
|
||||
@@ -349,8 +349,8 @@ public:
|
||||
uchar* data;
|
||||
int* refcount;
|
||||
|
||||
uchar* datastart;
|
||||
uchar* dataend;
|
||||
const uchar* datastart;
|
||||
const uchar* dataend;
|
||||
|
||||
AllocType alloc_type;
|
||||
};
|
||||
|
@@ -395,7 +395,7 @@ struct CV_EXPORTS UMatData
|
||||
|
||||
struct CV_EXPORTS UMatDataAutoLock
|
||||
{
|
||||
UMatDataAutoLock(UMatData* u);
|
||||
explicit UMatDataAutoLock(UMatData* u);
|
||||
~UMatDataAutoLock();
|
||||
UMatData* u;
|
||||
};
|
||||
@@ -403,7 +403,7 @@ struct CV_EXPORTS UMatDataAutoLock
|
||||
|
||||
struct CV_EXPORTS MatSize
|
||||
{
|
||||
MatSize(int* _p);
|
||||
explicit MatSize(int* _p);
|
||||
Size operator()() const;
|
||||
const int& operator[](int i) const;
|
||||
int& operator[](int i);
|
||||
@@ -417,7 +417,7 @@ struct CV_EXPORTS MatSize
|
||||
struct CV_EXPORTS MatStep
|
||||
{
|
||||
MatStep();
|
||||
MatStep(size_t s);
|
||||
explicit MatStep(size_t s);
|
||||
const size_t& operator[](int i) const;
|
||||
size_t& operator[](int i);
|
||||
operator size_t() const;
|
||||
@@ -900,6 +900,11 @@ public:
|
||||
template<typename _Tp> MatConstIterator_<_Tp> begin() const;
|
||||
template<typename _Tp> MatConstIterator_<_Tp> end() const;
|
||||
|
||||
//! template methods for for operation over all matrix elements.
|
||||
// the operations take care of skipping gaps in the end of rows (if any)
|
||||
template<typename _Tp, typename Functor> void forEach(const Functor& operation);
|
||||
template<typename _Tp, typename Functor> void forEach(const Functor& operation) 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 };
|
||||
|
||||
@@ -918,9 +923,9 @@ public:
|
||||
uchar* data;
|
||||
|
||||
//! helper fields used in locateROI and adjustROI
|
||||
uchar* datastart;
|
||||
uchar* dataend;
|
||||
uchar* datalimit;
|
||||
const uchar* datastart;
|
||||
const uchar* dataend;
|
||||
const uchar* datalimit;
|
||||
|
||||
//! custom allocator
|
||||
MatAllocator* allocator;
|
||||
@@ -934,6 +939,7 @@ public:
|
||||
MatStep step;
|
||||
|
||||
protected:
|
||||
template<typename _Tp, typename Functor> void forEach_impl(const Functor& operation);
|
||||
};
|
||||
|
||||
|
||||
@@ -1043,6 +1049,11 @@ public:
|
||||
const_iterator begin() const;
|
||||
const_iterator end() const;
|
||||
|
||||
//! template methods for for operation over all matrix elements.
|
||||
// the operations take care of skipping gaps in the end of rows (if any)
|
||||
template<typename Functor> void forEach(const Functor& operation);
|
||||
template<typename Functor> void forEach(const Functor& operation) const;
|
||||
|
||||
//! equivalent to Mat::create(_rows, _cols, DataType<_Tp>::type)
|
||||
void create(int _rows, int _cols);
|
||||
//! equivalent to Mat::create(_size, DataType<_Tp>::type)
|
||||
@@ -1804,9 +1815,9 @@ public:
|
||||
//! copy operator
|
||||
MatConstIterator& operator = (const MatConstIterator& it);
|
||||
//! returns the current matrix element
|
||||
uchar* operator *() const;
|
||||
const uchar* operator *() const;
|
||||
//! returns the i-th matrix element, relative to the current
|
||||
uchar* operator [](ptrdiff_t i) const;
|
||||
const uchar* operator [](ptrdiff_t i) const;
|
||||
|
||||
//! shifts the iterator forward by the specified number of elements
|
||||
MatConstIterator& operator += (ptrdiff_t ofs);
|
||||
@@ -1831,9 +1842,9 @@ public:
|
||||
|
||||
const Mat* m;
|
||||
size_t elemSize;
|
||||
uchar* ptr;
|
||||
uchar* sliceStart;
|
||||
uchar* sliceEnd;
|
||||
const uchar* ptr;
|
||||
const uchar* sliceStart;
|
||||
const uchar* sliceEnd;
|
||||
};
|
||||
|
||||
|
||||
@@ -1917,9 +1928,9 @@ public:
|
||||
//! constructor that sets the iterator to the specified element of the matrix
|
||||
MatIterator_(Mat_<_Tp>* _m, int _row, int _col=0);
|
||||
//! constructor that sets the iterator to the specified element of the matrix
|
||||
MatIterator_(const Mat_<_Tp>* _m, Point _pt);
|
||||
MatIterator_(Mat_<_Tp>* _m, Point _pt);
|
||||
//! constructor that sets the iterator to the specified element of the matrix
|
||||
MatIterator_(const Mat_<_Tp>* _m, const int* _idx);
|
||||
MatIterator_(Mat_<_Tp>* _m, const int* _idx);
|
||||
//! copy constructor
|
||||
MatIterator_(const MatIterator_& it);
|
||||
//! copy operator
|
||||
|
@@ -438,7 +438,7 @@ Mat::Mat(const std::vector<_Tp>& vec, bool copyData)
|
||||
if( !copyData )
|
||||
{
|
||||
step[0] = step[1] = sizeof(_Tp);
|
||||
data = datastart = (uchar*)&vec[0];
|
||||
datastart = data = (uchar*)&vec[0];
|
||||
datalimit = dataend = datastart + rows * step[0];
|
||||
}
|
||||
else
|
||||
@@ -453,7 +453,7 @@ Mat::Mat(const Vec<_Tp, n>& vec, bool copyData)
|
||||
if( !copyData )
|
||||
{
|
||||
step[0] = step[1] = sizeof(_Tp);
|
||||
data = datastart = (uchar*)vec.val;
|
||||
datastart = data = (uchar*)vec.val;
|
||||
datalimit = dataend = datastart + rows * step[0];
|
||||
}
|
||||
else
|
||||
@@ -470,7 +470,7 @@ Mat::Mat(const Matx<_Tp,m,n>& M, bool copyData)
|
||||
{
|
||||
step[0] = cols * sizeof(_Tp);
|
||||
step[1] = sizeof(_Tp);
|
||||
data = datastart = (uchar*)M.val;
|
||||
datastart = data = (uchar*)M.val;
|
||||
datalimit = dataend = datastart + rows * step[0];
|
||||
}
|
||||
else
|
||||
@@ -485,7 +485,7 @@ Mat::Mat(const Point_<_Tp>& pt, bool copyData)
|
||||
if( !copyData )
|
||||
{
|
||||
step[0] = step[1] = sizeof(_Tp);
|
||||
data = datastart = (uchar*)&pt.x;
|
||||
datastart = data = (uchar*)&pt.x;
|
||||
datalimit = dataend = datastart + rows * step[0];
|
||||
}
|
||||
else
|
||||
@@ -504,7 +504,7 @@ Mat::Mat(const Point3_<_Tp>& pt, bool copyData)
|
||||
if( !copyData )
|
||||
{
|
||||
step[0] = step[1] = sizeof(_Tp);
|
||||
data = datastart = (uchar*)&pt.x;
|
||||
datastart = data = (uchar*)&pt.x;
|
||||
datalimit = dataend = datastart + rows * step[0];
|
||||
}
|
||||
else
|
||||
@@ -642,7 +642,7 @@ inline void Mat::release()
|
||||
if( u && CV_XADD(&u->refcount, -1) == 1 )
|
||||
deallocate();
|
||||
u = NULL;
|
||||
data = datastart = dataend = datalimit = 0;
|
||||
datastart = dataend = datalimit = data = 0;
|
||||
for(int i = 0; i < dims; i++)
|
||||
size.p[i] = 0;
|
||||
}
|
||||
@@ -1000,6 +1000,17 @@ MatIterator_<_Tp> Mat::end()
|
||||
return it;
|
||||
}
|
||||
|
||||
template<typename _Tp, typename Functor> inline
|
||||
void Mat::forEach(const Functor& operation) {
|
||||
this->forEach_impl<_Tp>(operation);
|
||||
};
|
||||
|
||||
template<typename _Tp, typename Functor> inline
|
||||
void Mat::forEach(const Functor& operation) const {
|
||||
// call as not const
|
||||
(const_cast<Mat*>(this))->forEach<const _Tp>(operation);
|
||||
};
|
||||
|
||||
template<typename _Tp> inline
|
||||
Mat::operator std::vector<_Tp>() const
|
||||
{
|
||||
@@ -1045,7 +1056,7 @@ void Mat::push_back(const _Tp& elem)
|
||||
}
|
||||
CV_Assert(DataType<_Tp>::type == type() && cols == 1
|
||||
/* && dims == 2 (cols == 1 implies dims == 2) */);
|
||||
uchar* tmp = dataend + step[0];
|
||||
const uchar* tmp = dataend + step[0];
|
||||
if( !isSubmatrix() && isContinuous() && tmp <= datalimit )
|
||||
{
|
||||
*(_Tp*)(data + (size.p[0]++) * step.p[0]) = elem;
|
||||
@@ -1585,6 +1596,15 @@ MatIterator_<_Tp> Mat_<_Tp>::end()
|
||||
return Mat::end<_Tp>();
|
||||
}
|
||||
|
||||
template<typename _Tp> template<typename Functor> inline
|
||||
void Mat_<_Tp>::forEach(const Functor& operation) {
|
||||
Mat::forEach<_Tp, Functor>(operation);
|
||||
}
|
||||
|
||||
template<typename _Tp> template<typename Functor> inline
|
||||
void Mat_<_Tp>::forEach(const Functor& operation) const {
|
||||
Mat::forEach<_Tp, Functor>(operation);
|
||||
}
|
||||
|
||||
///////////////////////////// SparseMat /////////////////////////////
|
||||
|
||||
@@ -2149,7 +2169,7 @@ MatConstIterator& MatConstIterator::operator = (const MatConstIterator& it )
|
||||
}
|
||||
|
||||
inline
|
||||
uchar* MatConstIterator::operator *() const
|
||||
const uchar* MatConstIterator::operator *() const
|
||||
{
|
||||
return ptr;
|
||||
}
|
||||
@@ -2282,7 +2302,7 @@ MatConstIterator operator - (const MatConstIterator& a, ptrdiff_t ofs)
|
||||
|
||||
|
||||
inline
|
||||
uchar* MatConstIterator::operator [](ptrdiff_t i) const
|
||||
const uchar* MatConstIterator::operator [](ptrdiff_t i) const
|
||||
{
|
||||
return *(*this + i);
|
||||
}
|
||||
@@ -2454,12 +2474,12 @@ MatIterator_<_Tp>::MatIterator_(Mat_<_Tp>* _m, int _row, int _col)
|
||||
{}
|
||||
|
||||
template<typename _Tp> inline
|
||||
MatIterator_<_Tp>::MatIterator_(const Mat_<_Tp>* _m, Point _pt)
|
||||
MatIterator_<_Tp>::MatIterator_(Mat_<_Tp>* _m, Point _pt)
|
||||
: MatConstIterator_<_Tp>(_m, _pt)
|
||||
{}
|
||||
|
||||
template<typename _Tp> inline
|
||||
MatIterator_<_Tp>::MatIterator_(const Mat_<_Tp>* _m, const int* _idx)
|
||||
MatIterator_<_Tp>::MatIterator_(Mat_<_Tp>* _m, const int* _idx)
|
||||
: MatConstIterator_<_Tp>(_m, _idx)
|
||||
{}
|
||||
|
||||
@@ -2593,7 +2613,7 @@ inline SparseMatConstIterator& SparseMatConstIterator::operator = (const SparseM
|
||||
template<typename _Tp> inline
|
||||
const _Tp& SparseMatConstIterator::value() const
|
||||
{
|
||||
return *(_Tp*)ptr;
|
||||
return *(const _Tp*)ptr;
|
||||
}
|
||||
|
||||
inline
|
||||
|
@@ -636,6 +636,9 @@ protected:
|
||||
|
||||
CV_EXPORTS MatAllocator* getOpenCLAllocator();
|
||||
|
||||
CV_EXPORTS_W bool isPerformanceCheckBypassed();
|
||||
#define OCL_PERFORMANCE_CHECK(condition) (cv::ocl::isPerformanceCheckBypassed() || (condition))
|
||||
|
||||
}}
|
||||
|
||||
#endif
|
||||
|
@@ -274,6 +274,102 @@ public:
|
||||
|
||||
CV_EXPORTS void parallel_for_(const Range& range, const ParallelLoopBody& body, double nstripes=-1.);
|
||||
|
||||
/////////////////////////////// forEach method of cv::Mat ////////////////////////////
|
||||
template<typename _Tp, typename Functor> inline
|
||||
void Mat::forEach_impl(const Functor& operation) {
|
||||
if (false) {
|
||||
operation(*reinterpret_cast<_Tp*>(0), reinterpret_cast<int*>(NULL));
|
||||
// If your compiler fail in this line.
|
||||
// Please check that your functor signature is
|
||||
// (_Tp&, const int*) <- multidimential
|
||||
// or (_Tp&, void*) <- in case of you don't need current idx.
|
||||
}
|
||||
|
||||
CV_Assert(this->total() / this->size[this->dims - 1] <= INT_MAX);
|
||||
const int LINES = static_cast<int>(this->total() / this->size[this->dims - 1]);
|
||||
|
||||
class PixelOperationWrapper :public ParallelLoopBody
|
||||
{
|
||||
public:
|
||||
PixelOperationWrapper(Mat_<_Tp>* const frame, const Functor& _operation)
|
||||
: mat(frame), op(_operation) {};
|
||||
virtual ~PixelOperationWrapper(){};
|
||||
// ! Overloaded virtual operator
|
||||
// convert range call to row call.
|
||||
virtual void operator()(const Range &range) const {
|
||||
const int DIMS = mat->dims;
|
||||
const int COLS = mat->size[DIMS - 1];
|
||||
if (DIMS <= 2) {
|
||||
for (int row = range.start; row < range.end; ++row) {
|
||||
this->rowCall2(row, COLS);
|
||||
}
|
||||
} else {
|
||||
std::vector<int> idx(COLS); /// idx is modified in this->rowCall
|
||||
idx[DIMS - 2] = range.start - 1;
|
||||
|
||||
for (int line_num = range.start; line_num < range.end; ++line_num) {
|
||||
idx[DIMS - 2]++;
|
||||
for (int i = DIMS - 2; i >= 0; --i) {
|
||||
if (idx[i] >= mat->size[i]) {
|
||||
idx[i - 1] += idx[i] / mat->size[i];
|
||||
idx[i] %= mat->size[i];
|
||||
continue; // carry-over;
|
||||
}
|
||||
else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
this->rowCall(&idx[0], COLS, DIMS);
|
||||
}
|
||||
}
|
||||
};
|
||||
private:
|
||||
Mat_<_Tp>* const mat;
|
||||
const Functor op;
|
||||
// ! Call operator for each elements in this row.
|
||||
inline void rowCall(int* const idx, const int COLS, const int DIMS) const {
|
||||
int &col = idx[DIMS - 1];
|
||||
col = 0;
|
||||
_Tp* pixel = &(mat->template at<_Tp>(idx));
|
||||
|
||||
while (col < COLS) {
|
||||
op(*pixel, const_cast<const int*>(idx));
|
||||
pixel++; col++;
|
||||
}
|
||||
col = 0;
|
||||
}
|
||||
// ! Call operator for each elements in this row. 2d mat special version.
|
||||
inline void rowCall2(const int row, const int COLS) const {
|
||||
union Index{
|
||||
int body[2];
|
||||
operator const int*() const {
|
||||
return reinterpret_cast<const int*>(this);
|
||||
}
|
||||
int& operator[](const int i) {
|
||||
return body[i];
|
||||
}
|
||||
} idx = {{row, 0}};
|
||||
// Special union is needed to avoid
|
||||
// "error: array subscript is above array bounds [-Werror=array-bounds]"
|
||||
// when call the functor `op` such that access idx[3].
|
||||
|
||||
_Tp* pixel = &(mat->template at<_Tp>(idx));
|
||||
const _Tp* const pixel_end = pixel + COLS;
|
||||
while(pixel < pixel_end) {
|
||||
op(*pixel++, static_cast<const int*>(idx));
|
||||
idx[1]++;
|
||||
}
|
||||
};
|
||||
PixelOperationWrapper& operator=(const PixelOperationWrapper &) {
|
||||
CV_Assert(false);
|
||||
// We can not remove this implementation because Visual Studio warning C4822.
|
||||
return *this;
|
||||
};
|
||||
};
|
||||
|
||||
parallel_for_(cv::Range(0, LINES), PixelOperationWrapper(reinterpret_cast<Mat_<_Tp>*>(this), operation));
|
||||
};
|
||||
|
||||
/////////////////////////// Synchronization Primitives ///////////////////////////////
|
||||
|
||||
class CV_EXPORTS Mutex
|
||||
|
Reference in New Issue
Block a user