diff --git a/modules/contrib/include/opencv2/contrib/contrib.hpp b/modules/contrib/include/opencv2/contrib/contrib.hpp index 9f8ed9d52c..049c82211e 100644 --- a/modules/contrib/include/opencv2/contrib/contrib.hpp +++ b/modules/contrib/include/opencv2/contrib/contrib.hpp @@ -861,18 +861,7 @@ namespace cv // 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(const Mat& src, vector labels, - int num_components = 0) : - _num_components(num_components) - { - this->compute(src, labels); //! compute eigenvectors and eigenvalues - } - - // 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(InputArray src, InputArray labels, + LDA(InputArrayOfArrays src, InputArray labels, int num_components = 0) : _num_components(num_components) { @@ -895,7 +884,7 @@ namespace cv ~LDA() {} //! Compute the discriminants for data in src and labels. - void compute(InputArray src, InputArray labels); + void compute(InputArrayOfArrays src, InputArray labels); // Projects samples into the LDA subspace. Mat project(InputArray src); @@ -915,7 +904,7 @@ namespace cv Mat _eigenvectors; Mat _eigenvalues; - void lda(InputArray src, InputArray labels); + void lda(InputArrayOfArrays src, InputArray labels); }; class CV_EXPORTS_W FaceRecognizer : public Algorithm diff --git a/modules/contrib/src/facerec.cpp b/modules/contrib/src/facerec.cpp index 6ff51fe89a..8c93906b42 100644 --- a/modules/contrib/src/facerec.cpp +++ b/modules/contrib/src/facerec.cpp @@ -464,9 +464,12 @@ void Fisherfaces::train(InputArrayOfArrays src, InputArray _lbls) { // clear existing model data _labels.release(); _projections.clear(); - // get the number of unique classes (provide a cv::Mat overloaded version?) + // safely copy from cv::Mat to std::vector vector ll; - labels.copyTo(ll); + for(unsigned int i = 0; i < labels.total(); i++) { + ll.push_back(labels.at(i)); + } + // get the number of unique classes int C = (int) remove_dups(ll).size(); // clip number of components to be a valid number if((_num_components <= 0) || (_num_components > (C-1))) diff --git a/modules/contrib/src/lda.cpp b/modules/contrib/src/lda.cpp index 22ca97c8f6..b099177dff 100644 --- a/modules/contrib/src/lda.cpp +++ b/modules/contrib/src/lda.cpp @@ -975,10 +975,17 @@ void LDA::load(const FileStorage& fs) { fs["eigenvectors"] >> _eigenvectors; } -void LDA::lda(InputArray _src, InputArray _lbls) { +void LDA::lda(InputArrayOfArrays _src, InputArray _lbls) { // get data Mat src = _src.getMat(); - vector labels = _lbls.getMat(); + vector labels; + // safely copy the labels + { + Mat tmp = _lbls.getMat(); + for(unsigned int i = 0; i < tmp.total(); i++) { + labels.push_back(tmp.at(i)); + } + } // turn into row sampled matrix Mat data; // ensure working matrix is double precision @@ -1078,7 +1085,7 @@ void LDA::lda(InputArray _src, InputArray _lbls) { _eigenvectors = Mat(_eigenvectors, Range::all(), Range(0, _num_components)); } -void LDA::compute(InputArray _src, InputArray _lbls) { +void LDA::compute(InputArrayOfArrays _src, InputArray _lbls) { switch(_src.kind()) { case _InputArray::STD_VECTOR_MAT: lda(asRowMatrix(_src, CV_64FC1), _lbls);