// 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<int> 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)
{
~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);
Mat _eigenvectors;
Mat _eigenvalues;
- void lda(InputArray src, InputArray labels);
+ void lda(InputArrayOfArrays src, InputArray labels);
};
class CV_EXPORTS_W FaceRecognizer : public Algorithm
// 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<int> ll;
- labels.copyTo(ll);
+ for(unsigned int i = 0; i < labels.total(); i++) {
+ ll.push_back(labels.at<int>(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)))
fs["eigenvectors"] >> _eigenvectors;
}
-void LDA::lda(InputArray _src, InputArray _lbls) {
+void LDA::lda(InputArrayOfArrays _src, InputArray _lbls) {
// get data
Mat src = _src.getMat();
- vector<int> labels = _lbls.getMat();
+ vector<int> labels;
+ // safely copy the labels
+ {
+ Mat tmp = _lbls.getMat();
+ for(unsigned int i = 0; i < tmp.total(); i++) {
+ labels.push_back(tmp.at<int>(i));
+ }
+ }
// turn into row sampled matrix
Mat data;
// ensure working matrix is double precision
_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);