Unsupported format or combination of formats while running face recognition from video.
Each time I am trying to run programm I got this error. Can anyone help me with that? What may cause the issu?
OpenCV Error: Unsupported format or combination of formats (In the Fisherfaces method all input samples (training images) must be of equal size! Expected 76800 pixels, but was 0 pixels.) in train, file /hdd1/software/opencv/opencv-2.4.6.1/modules/contrib/src/facerec.cpp, line 455 terminate called after throwing an instance of 'cv::Exception' what(): /hdd1/software/opencv/opencv-2.4.6.1/modules/contrib/src/facerec.cpp:455: error: (-210) In the Fisherfaces method all input samples (training images) must be of equal size! Expected 76800 pixels, but was 0 pixels. in function train
And below is my source code:
> #include "/usr/local/include/opencv2/core/core.hpp"
> #include "/usr/local/include/opencv2/contrib/contrib.hpp"
> #include "/usr/local/include/opencv2/highgui/highgui.hpp"
> #include "/usr/local/include/opencv2/imgproc/imgproc.hpp"
> #include "/usr/local/include/opencv2/objdetect/objdetect.hpp"
>
> #include <iostream>
> #include <fstream>
> #include <sstream>
> #include <string>
>
> using namespace cv;
> using namespace std;
>
> int WriteLabel(int prediction) {
> ofstream label;
> label.open("/home/lbobrek/public_html/FaceToLog/src/facerecognizer/label.txt");
> if (label.fail())
> {
> return 1;
> }
> label << prediction;
> label.close();
> return 0;
> }
>
> static void read_csv(const string& filename, vector<Mat>& images,
> vector<int>& labels, char separator =
> ';') {
> std::ifstream file(filename.c_str(), ifstream::in);
> if (!file) {
> string error_message = "No valid input file was given, please
> check the given filename.";
> CV_Error(CV_StsBadArg, error_message);
> }
> string line, path, classlabel;
> while (getline(file, line)) {
> stringstream liness(line);
> getline(liness, path, separator);
> getline(liness, classlabel);
> if(!path.empty() && !classlabel.empty()) {
> images.push_back(imread(path, 0));
> labels.push_back(atoi(classlabel.c_str()));
> }
> }
> }
>
> int main() {
> //if (argc != 4) {
> // cout << "usage: " << argv[0] << " </path/to/haar_cascade>
> </path/to/csv.ext> </path/to/device
> id>" << endl;
> // cout << "\t </path/to/haar_cascade> -- Path to the
> Haar Cascade for face detection." <<
> endl;
> // cout << "\t </path/to/csv.ext> -- Path to the CSV
> file with the face database." << endl;
> // cout << "\t <device id> -- The webcam device id to grab frames from." << endl;
> // exit(1);
> //}
> // Get the path to your CSV:
> remove("/home/lbobrek/public_html/FaceToLog/src/facerecognizer/label.txt");
> string fn_haar = ("/home/lbobrek/public_html/FaceToLog/src/facerecognizer/haarcascade_frontalface_default.xml");
> string fn_csv = ("/home/lbobrek/public_html/FaceToLog/src/database.csv");
> string deviceId = ("/home/lbobrek/public_html/FaceToLog/src/video/login.webm");
> // These vectors hold the images and corresponding labels:
> vector<Mat> images;
> vector<int> labels;
> // Read in the data (fails if no valid input filename is given, but
> you'll get an error message):
> try {
> read_csv(fn_csv, images, labels);
> } catch (cv::Exception& e) {
> cerr << "Error opening file \"" << fn_csv << "\". Reason: "
> << e.msg << endl;
> // nothing more we can do
> exit(1);
> }
> int im_width = images[0].cols;
> int im_height = images[0].rows;
> // Create a FaceRecognizer and train it on the given images:
> Ptr<FaceRecognizer> model = createFisherFaceRecognizer();
> model->train(images, labels);
> CascadeClassifier haar_cascade;
> haar_cascade.load(fn_haar);
> // Get a handle to the Video device:
> VideoCapture cap(deviceId);
> // Check if we can use this device at all:
> if(!cap.isOpened ...
check your training images, one of them is invalid.
maybe your image dir already contains files, that are not images (like a readme.txt). your csv file generated from that might already contain non-images.
Thanks a lot! Problem solved, I've got a couple of empty.png files which I had just for testing befor. So thanks to #berak I made step forward, but another problem occured. Now I am receiven "Segmentation fault" error. Any ideas?
oh dear.
go with a debugger at it. if you don't know how to do that, learn it now.
sprinkle the code with print statements, try to circle it in