OpenCV: как скопировать NormalBayesClassifier?

#c #opencv

#c #opencv

Вопрос:

Я обучаю и тестирую больше классификаторов и хочу сохранить только лучшие из них. Я пытался использовать if и =

 // for each train/eval
if (smallestError > errorRate)
{
  best_Classifier = classifier;
}
// end for
best_Classifier.save("name");
  

но, похоже, это дает мне некоторую ошибку нулевого указателя:

 OpenCV Error: Null pointer (Null pointer to the written object) in cvWrite, file /home/me/opencv/modules/core/src/persistence.cpp, line 5011
terminate called after throwing an instance of 'cv::Exception'
  what():  /home/me/opencv/modules/core/src/persistence.cpp:5011: error: (-27) Null pointer to the written object in function cvWrite
  

Редактировать:

Код, который работает, используя std::vector :

 std::vector< cv::NormalBayesClassifier> classifiers(10);
int classifierPosition = 0;
double smallestError = 2.;
for (int i = 0; i < 10; i  )
{
  // extract vocabulary from X images chosen randomly
  // extract BOW descriptors for the X images used for training
  // extract BOW descriptors for the N-X images used for testing (the ground truth)
  classifiers[i].train(trainingData, labels);
  classifiers[i].predict(evalData, amp;results);
  double errorRate = (double) cv::countNonZero(groundTruth - results) / evalData.rows;
  if (smallestError > errorRate)
  {
    smallestError = errorRate;
    classifierPosition = i;
  }
}
classifier[classifierPosition].save("name.yaml");
  

Если я использую cv::Ptr , это не сработает:

 cv::Ptr< cv::NormalBayesClassifier> bestClassifier;
double smallestError = 2.;
for (int i = 0; i < 10; i  )
{
  // extract vocabulary from X images chosen randomly
  // extract BOW descriptors for the X images used for training
  // extract BOW descriptors for the N-X images used for testing (the ground truth)
  cv::NormalBayesClassifier classifier;
  classifier.train(trainingData, labels);
  classifier.predict(evalData, amp;results);
  double errorRate = (double) cv::countNonZero(groundTruth - results) / evalData.rows;
  if (smallestError > errorRate)
  {
    smallestError = errorRate;
    bestClassifier = amp;classifier;
  }
}
bestClassifier->save("name.yaml"); // here it gives me that error
  

Комментарии:

1. сомнительно, сможете ли вы вообще его скопировать.

2. Можете ли вы предложить мне способ сделать это? Я не хочу сохранять много классификаторов, а затем искать лучшие из них

3. может быть, у вас есть массив из них и сохранить индекс лучшего?

Ответ №1:

лучше всего использовать указатель

один из них должен быть в порядке

     // opencv shared ptr
    cv::Ptr<cv::NormalBayesClassifier> best_Classifier;
    //or c  11 shared
    shared_ptr<cv::NormalBayesClassifier> best_Classifier;
    //or C raw ptr
    cv::NormalBayesClassifier * best_Classifier;



    if (smallestError > errorRate)
    {
            //raw ptr example 
            best_Classifier = amp;classifier;
    }
    // end for
    best_Classifier->save("name");
  

хотя я не вижу ничего плохого в том, чтобы сохранить их все или использовать трюк с индексом @berak

редактировать писать комментарии, без std::vector :

     cv::Ptr< cv::NormalBayesClassifier> bestClassifier;
    double smallestError = 2.;
    for (int i = 0; i < 10; i  )
    {

        cv::Ptr< cv::NormalBayesClassifier> classifier = new cv::NormalBayesClassifier;
        classifier->train(trainingData, labels);
        classifier->predict(evalData, amp;results);
        double errorRate = (double) cv::countNonZero(groundTruth - results) / evalData.rows;
        if (smallestError > errorRate)
        {
             smallestError = errorRate;
             bestClassifier = classifier;
      }
   }
   bestClassifier->save("name.yaml"); // no more error
  

Комментарии:

1. Таким образом, я получил OpenCV Error: The function/feature is not implemented () in CvStatModel::write, file /home/me/opencv/modules/ml/src/inner_functions.cpp, line 114 terminate called after throwing an instance of 'cv::Exception' what(): /home/me/opencv/modules/ml/src/inner_functions.cpp:114: error: (-213) in function CvStatModel::write

2. хорошо, итак, вам удалось сохранить какой-либо NormalBayesClassifier вообще? потому что эта ошибка выглядит так, как будто у нее нет определения :/

3. На самом деле, если я делаю best_Classifier = amp;classifier; (для cv::Ptr ), это выдает мне эту ошибку, почему? Должен ли я сделать classifier cv::Ptr тоже?

4. не уверен, это работает здесь, может быть, опубликовать более полный код. Если вы создаете классификатор указателем, вам также не нужен amp; раньше. но если он не работает с необработанным указателем, то cvPtr, вероятно, не поможет (если вы не удалили объект где-нибудь)

5. Я добавил код: использование std::vector и использование cv::Ptr