Merge branch 'master' of code.opencv.org:opencv

This commit is contained in:
Alexander Mordvintesv 2012-08-06 17:17:13 +03:00
commit a717b7cbed
3 changed files with 18 additions and 19 deletions

View File

@ -861,18 +861,7 @@ namespace cv
// Optimization Criterion on given data in src and corresponding labels // Optimization Criterion on given data in src and corresponding labels
// in labels. If 0 (or less) number of components are given, they are // in labels. If 0 (or less) number of components are given, they are
// automatically determined for given data in computation. // automatically determined for given data in computation.
LDA(const Mat& src, vector<int> labels, LDA(InputArrayOfArrays src, InputArray 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,
int num_components = 0) : int num_components = 0) :
_num_components(num_components) _num_components(num_components)
{ {
@ -895,7 +884,7 @@ namespace cv
~LDA() {} ~LDA() {}
//! Compute the discriminants for data in src and labels. //! 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. // Projects samples into the LDA subspace.
Mat project(InputArray src); Mat project(InputArray src);
@ -915,7 +904,7 @@ namespace cv
Mat _eigenvectors; Mat _eigenvectors;
Mat _eigenvalues; Mat _eigenvalues;
void lda(InputArray src, InputArray labels); void lda(InputArrayOfArrays src, InputArray labels);
}; };
class CV_EXPORTS_W FaceRecognizer : public Algorithm class CV_EXPORTS_W FaceRecognizer : public Algorithm

View File

@ -464,9 +464,12 @@ void Fisherfaces::train(InputArrayOfArrays src, InputArray _lbls) {
// clear existing model data // clear existing model data
_labels.release(); _labels.release();
_projections.clear(); _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; 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(); int C = (int) remove_dups(ll).size();
// clip number of components to be a valid number // clip number of components to be a valid number
if((_num_components <= 0) || (_num_components > (C-1))) if((_num_components <= 0) || (_num_components > (C-1)))

View File

@ -975,10 +975,17 @@ void LDA::load(const FileStorage& fs) {
fs["eigenvectors"] >> _eigenvectors; fs["eigenvectors"] >> _eigenvectors;
} }
void LDA::lda(InputArray _src, InputArray _lbls) { void LDA::lda(InputArrayOfArrays _src, InputArray _lbls) {
// get data // get data
Mat src = _src.getMat(); 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 // turn into row sampled matrix
Mat data; Mat data;
// ensure working matrix is double precision // 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)); _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()) { switch(_src.kind()) {
case _InputArray::STD_VECTOR_MAT: case _InputArray::STD_VECTOR_MAT:
lda(asRowMatrix(_src, CV_64FC1), _lbls); lda(asRowMatrix(_src, CV_64FC1), _lbls);