#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