c++ - Bad argument in LDA constructor call in face recognition using LDA with SIFT -


i trying implement face recognition using lda sift. have existing code of pca sift uses sift determine keypoints , extract descriptors , pca project descriptors in pca sub-space. trying achieve similar functionality using lda sift.

i trying create lda object in turn call member function 'project' following error:

opencv error: bad argument (the number of samples must equal number of labels. given 0 labels, 45 samples. ) in lda, file /home/shaurya/opencv-2.4.9/modules/contrib/src/lda.cpp, line 1015 terminate called after throwing instance of 'cv::exception'   what():  /home/mypath/opencv-2.4.9/modules/contrib/src/lda.cpp:1015: error: (-5) number of samples must equal number of labels. given 0 labels, 45 samples.  in function lda aborted (core dumped) 

the following pca sift code have executed:

#include <iostream> #include <stdio.h> #include <dirent.h> #include <fstream> #include <string> #include <vector> #include <iterator> #include <opencv2/opencv.hpp> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/nonfree/features2d.hpp> #include <opencv2/features2d/features2d.hpp>  using namespace std; using namespace cv;  int main(int argc, char** argv) {     if(argc != 3)     {         cout << "usage: ./output <training database path> <test image>" << endl;         return -1;     }      // reading training images paths     vector<string> namestrainingimages;     vector<string>::iterator stringit;      dir *dir;     struct dirent *ent;     if ((dir = opendir (argv[1])) != null)      {            while ((ent = readdir (dir)) != null)          {             if((strcmp(ent -> d_name, ".") == 0) || (strcmp(ent -> d_name, "..") == 0))             {                 continue;             }             string tempname(string(argv[1]) + string(ent -> d_name));             namestrainingimages.push_back(tempname);         }     }     closedir(dir);      vector<mat> trainingimages;     vector<mat>::iterator imageit;      // reading training images     for(stringit = namestrainingimages.begin(); stringit != namestrainingimages.end(); ++stringit)     {         mat tempimage;         tempimage = imread(*stringit, cv_load_image_grayscale);         waitkey(5000);         if(!tempimage.data )                                       {             cout <<  "could not open or find image" << std::endl ;             continue;         }         else         {             trainingimages.push_back(tempimage);         }     }      vector< vector<keypoint> > keypoints;     vector<mat> descriptor;     vector<mat>::iterator descriptorit;     sift sift;      double percentage = 0.95;      for(imageit = trainingimages.begin(); imageit != trainingimages.end(); ++imageit)     {         vector<keypoint> tempkeypoints;         mat tempdescriptor1, tempdescriptor2, tempdescriptor3;          // generating keypoints , descriptors training images         sift.operator()(*imageit, *imageit, tempkeypoints, tempdescriptor1, false);         keypoints.push_back(tempkeypoints);          // using pca project , backproject descriptors of training images         pca pca(tempdescriptor1, mat(), cv_pca_data_as_row, percentage);         pca.pca::project(tempdescriptor1, tempdescriptor2);         tempdescriptor3 = pca.pca::backproject(tempdescriptor2);         descriptor.push_back(tempdescriptor3);           }       // reading test image     mat testimage;     testimage = imread(argv[2], cv_load_image_grayscale);     waitkey(5000);     if(!testimage.data)     {         cout <<  "could not open or find image" << std::endl ;         return -1;     }      vector<keypoint> testkeypoints;     mat testdescriptor, testdescriptor1, testdescriptor2;      // generating teh keypoints , descriptor of test image     sift.operator()(testimage, testimage, testkeypoints, testdescriptor1, false);      // using pca project , backproject descriptor of test image     pca pca(testdescriptor1, mat(), cv_pca_data_as_row, percentage);     pca.pca::project(testdescriptor1, testdescriptor2);     testdescriptor = pca.pca::backproject(testdescriptor2);      // flann based matching determine best matching training image     flannbasedmatcher matcher;     vector<dmatch> matches;     vector<dmatch> good_matches;         int goodmatchesctr = -1, tempctr = -1, ctr = -1;      for(descriptorit = descriptor.begin(); descriptorit != descriptor.end(); ++descriptorit)     {         ++tempctr;         vector<dmatch> tempmatches;         vector<dmatch> temp_good_matches;         int tempgoodmatchesctr = 0;         double min_dist = 100;          matcher.match(testdescriptor, *descriptorit, tempmatches);          for(int = 0; < testdescriptor.rows && < (*descriptorit).rows; ++i)         {             double dist = tempmatches[i].distance;             if(dist < min_dist)             {                 min_dist = dist;             }         }          for(int = 0; < testdescriptor.rows && < (*descriptorit).rows; ++i)         {              if(tempmatches[i].distance <= max(2 * min_dist, 0.02))             {                 temp_good_matches.push_back(tempmatches[i]);                 ++tempgoodmatchesctr;             }         }          if(tempgoodmatchesctr > goodmatchesctr)         {             goodmatchesctr = tempgoodmatchesctr;             matches = tempmatches;             good_matches = temp_good_matches;             ctr = tempctr;         }     }      // displaying test image alongside best matching training image     mat img_matches;      drawmatches(testimage, testkeypoints, trainingimages[ctr], keypoints[ctr], good_matches, img_matches, scalar ::all(-1), scalar ::all(-1), vector<char>(), drawmatchesflags::not_draw_single_points);     for( int = 0; < (int)good_matches.size(); ++i )     {          printf( "-- match [%d] keypoint 1: %d  -- keypoint 2: %d  \n", i, good_matches[i].queryidx, good_matches[i].trainidx );      }     imshow("good matches", img_matches);     waitkey(0);      cout << "executed!" << '\n';     return 0; } 

the following lda sift code trying execute:

#include <iostream> #include <stdio.h> #include <dirent.h> #include <fstream> #include <string> #include <vector> #include <iterator> #include <opencv2/opencv.hpp> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/nonfree/features2d.hpp> #include <opencv2/features2d/features2d.hpp>  using namespace std; using namespace cv;  int main(int argc, char** argv) {     if(argc != 3)     {         cout << "usage: ./output <training database path> <test image>" << endl;         return -1;     }      // reading training images paths     vector<string> namestrainingimages;     vector<string>::iterator stringit;      dir *dir;     struct dirent *ent;     if ((dir = opendir (argv[1])) != null)      {            while ((ent = readdir (dir)) != null)          {             if((strcmp(ent -> d_name, ".") == 0) || (strcmp(ent -> d_name, "..") == 0))             {                 continue;             }             string tempname(string(argv[1]) + string(ent -> d_name));             namestrainingimages.push_back(tempname);         }     }     closedir(dir);      vector<mat> trainingimages;     vector<mat>::iterator imageit;      // reading training images     for(stringit = namestrainingimages.begin(); stringit != namestrainingimages.end(); ++stringit)     {         mat tempimage;         tempimage = imread(*stringit, cv_load_image_grayscale);         waitkey(5000);         if(!tempimage.data )                                       {             cout <<  "could not open or find training image" << std::endl ;             continue;         }         else         {             trainingimages.push_back(tempimage);         }     }      vector< vector<keypoint> > keypoints;     vector<mat> descriptor;     vector<mat>::iterator descriptorit;     sift sift;      for(imageit = trainingimages.begin(); imageit != trainingimages.end(); ++imageit)     {         vector<keypoint> tempkeypoints;         mat tempdescriptor;          // generating keypoints , descriptors training images         sift.operator()(*imageit, *imageit, tempkeypoints, tempdescriptor, false);         keypoints.push_back(tempkeypoints);          // trying use lda project descriptors of training images         lda lda(tempdescriptor, mat());         lda.lda::project(tempdescriptor);         descriptor.push_back(tempdescriptor);            }      // reading test image     mat testimage;     testimage = imread(argv[2], cv_load_image_grayscale);     waitkey(5000);     if(!testimage.data)     {         cout <<  "could not open or find image" << std::endl ;         return -1;     }      vector<keypoint> testkeypoints;     mat testdescriptor;      // generating keypoints , descriptor of test image     sift.operator()(testimage, testimage, testkeypoints, testdescriptor, false);      // trying use lda project descriptor of test image     lda lda(testdescriptor, mat());     lda.lda::project(testdescriptor);      // flann based matching determine best matching training image     flannbasedmatcher matcher;     vector<dmatch> matches;     vector<dmatch> good_matches;         int goodmatchesctr = -1, tempctr = -1, ctr = -1;      for(descriptorit = descriptor.begin(); descriptorit != descriptor.end(); ++descriptorit)     {         ++tempctr;         vector<dmatch> tempmatches;         vector<dmatch> temp_good_matches;         int tempgoodmatchesctr = 0;         double min_dist = 100;          matcher.match(testdescriptor, *descriptorit, tempmatches);          for(int = 0; < testdescriptor.rows && < (*descriptorit).rows; ++i)         {             double dist = tempmatches[i].distance;             if(dist < min_dist)             {                 min_dist = dist;             }         }          for(int = 0; < testdescriptor.rows && < (*descriptorit).rows; ++i)         {              if(tempmatches[i].distance <= max(2 * min_dist, 0.02))             {                 temp_good_matches.push_back(tempmatches[i]);                 ++tempgoodmatchesctr;             }         }          if(tempgoodmatchesctr > goodmatchesctr)         {             goodmatchesctr = tempgoodmatchesctr;             matches = tempmatches;             good_matches = temp_good_matches;             ctr = tempctr;         }     }      // displaying test image alogside best matching training image     mat img_matches;      drawmatches(testimage, testkeypoints, trainingimages[ctr], keypoints[ctr], good_matches, img_matches, scalar ::all(-1), scalar ::all(-1), vector<char>(), drawmatchesflags::not_draw_single_points);     for( int = 0; < (int)good_matches.size(); ++i )     {          printf( "-- match [%d] keypoint 1: %d  -- keypoint 2: %d  \n", i, good_matches[i].queryidx, good_matches[i].trainidx );      }     imshow("good matches", img_matches);     waitkey(0);      cout << "executed!" << '\n';     return 0; } 

i write these programs on gedit text editor , execute these programs on ubuntu 12.04 opencv 2.4.9.

edit: want way convert below given lines of sift-pca code sift-lda

    pca pca(testdescriptor1, mat(), cv_pca_data_as_row, percentage);     pca.pca::project(testdescriptor1, testdescriptor2);     testdescriptor = pca.pca::backproject(testdescriptor2); 

i tried substitue pca constructor lda constuctor in following way:

    lda lda(testdescriptor, mat());     lda.lda::project(testdescriptor); 

but got above mentioned error. guess passing incorrect arguments lda constructor. have gone through documentation of lda class given here, had no luck in finding mistake.

any regarding above problem appreciated.

thanks in advance!