簡體   English   中英

OpenCV:如何復制NormalBayesClassifier?

[英]OpenCV: How to copy a NormalBayesClassifier?

我正在訓練和測試更多分類器,我只想保存其中最好的分類器。 我嘗試使用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, &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, &results);
  double errorRate = (double) cv::countNonZero(groundTruth - results) / evalData.rows;
  if (smallestError > errorRate)
  {
    smallestError = errorRate;
    bestClassifier = &classifier;
  }
}
bestClassifier->save("name.yaml"); // here it gives me that error

最好的選擇是使用指針

其中之一應該可以

    // 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 = &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, &results);
        double errorRate = (double) cv::countNonZero(groundTruth - results) / evalData.rows;
        if (smallestError > errorRate)
        {
             smallestError = errorRate;
             bestClassifier = classifier;
      }
   }
   bestClassifier->save("name.yaml"); // no more error

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM