Merge branch 'master' of code.opencv.org:opencv
This commit is contained in:
commit
a717b7cbed
@ -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
|
||||||
|
@ -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)))
|
||||||
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user