[英]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.