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 is
Dieser 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