Erkennen von Objekten aus Videos mithilfe von SVM

Dies ist mein Code zum Trainieren des Datensatzes von beispielsweise Fahrzeugen. Wenn er vollständig trainiert, soll er die Daten (Fahrzeuge) aus Video (.avi) vorhersagen.how to predict trained data from video and how to add that part in it ? Ich möchte, dass wenn das Fahrzeug im Video gezeigt wird, es als 1 gezählt wird und wenn das Objekt erkannt wird und wenn das zweite Fahrzeug kommt, es als 2 gezählt wird

    IplImage *img2;
    cout<<"Vector quantization..."<<endl;
    collectclasscentroids();
    vector<Mat> descriptors = bowTrainer.getDescriptors();
    int count=0;
    for(vector<Mat>::iterator iter=descriptors.begin();iter!=descriptors.end();iter++)
    {
       count += iter->rows;
    }
    cout<<"Clustering "<<count<<" features"<<endl;
    //choosing cluster's centroids as dictionary's words
    Mat dictionary = bowTrainer.cluster();
    bowDE.setVocabulary(dictionary);
    cout<<"extracting histograms in the form of BOW for each image "<<endl;
    Mat labels(0, 1, CV_32FC1);
    Mat trainingData(0, dictionarySize, CV_32FC1);
    int k = 0;
    vector<KeyPoint> keypoint1;
    Mat bowDescriptor1;
    //extracting histogram in the form of bow for each image 
   for(j = 1; j <= 4; j++)
    for(i = 1; i <= 60; i++)
            {
              sprintf( ch,"%s%d%s%d%s","train/",j," (",i,").jpg");
              const char* imageName = ch;
              img2 = cvLoadImage(imageName, 0); 
              detector.detect(img2, keypoint1);
              bowDE.compute(img2, keypoint1, bowDescriptor1);
              trainingData.push_back(bowDescriptor1);
              labels.push_back((float) j);
             }
    //Setting up SVM parameters
    CvSVMParams params;
    params.kernel_type = CvSVM::RBF;
    params.svm_type = CvSVM::C_SVC;
    params.gamma = 0.50625000000000009;
    params.C = 312.50000000000000;
    params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, 0.000001);
    CvSVM svm;



    printf("%s\n", "Training SVM classifier");

    bool res = svm.train(trainingData, labels, cv::Mat(), cv::Mat(), params);

    cout<<"Processing evaluation data..."<<endl;


    Mat groundTruth(0, 1, CV_32FC1);
    Mat evalData(0, dictionarySize, CV_32FC1);
    k = 0;
    vector<KeyPoint> keypoint2;
    Mat bowDescriptor2;


    Mat results(0, 1, CV_32FC1);;
    for(j = 1; j <= 4; j++)
      for(i = 1; i <= 60; i++)
         {
           sprintf( ch, "%s%d%s%d%s", "eval/", j, " (",i,").jpg");
           const char* imageName = ch;
           img2 = cvLoadImage(imageName,0);
           detector.detect(img2, keypoint2);
           bowDE.compute(img2, keypoint2, bowDescriptor2);
           evalData.push_back(bowDescriptor2);
           groundTruth.push_back((float) j);
           float response = svm.predict(bowDescriptor2);
           results.push_back(response);
         }



    //calculate the number of unmatched classes 
    double errorRate = (double) countNonZero(groundTruth- results) / evalData.rows;

The question isDieser Code sagt nicht aus dem Video voraus, ich möchte wissen, wie ich ihn aus dem Video vorhersagen kann, also wie ich das Fahrzeug aus dem Film erkennen möchte, wie es 1 anzeigen soll, wenn es das Fahrzeug aus dem Film findet

Für diejenigen, die die Frage nicht verstanden haben:

Ich möchte einen Film im obigen Code abspielen

VideoCapture cap("movie.avi"); //movie.avi is with deleted background

Angenommen, ich habe trainierte Daten, die Fahrzeuge enthalten, und "movie.avi" enthält 5 Fahrzeuge, so sollte es Fahrzeuge aus der movie.avi erkennen und mir geben5 als Ausgabe

Wie Sie dies tun, erfahren Sie im obigen Code

Antworten auf die Frage(4)

Ihre Antwort auf die Frage