C++中的对象序列化,用于存储 OpenCV 的 SVM 对象 [OpenCV 3.1.0]

Object Serialization in C++ for storing the OpenCV's SVM object [OpenCV 3.1.0]

本文关键字:对象 OpenCV SVM 存储 序列化 用于 C++      更新时间:2023-10-16

所以众所周知,由于OpenCV中的错误,当您在保存非线性内核SVM后尝试加载它时,您会得到错误。

请参阅此处了解更多信息: OpenCV 3.1.0:保存和加载经过训练的 SVM

人们已经加载了 SVM,但无法获得相同的结果(分类器数据在加载后已损坏)。我尝试通过编写自己的 svmloader 函数来测试这一点。

Ptr<SVM> svmloader(const String& filepath)
{
FileStorage fs;
fs.open(filepath, FileStorage::READ);
Ptr<SVM> svm = Algorithm::read<SVM>(fs.getFirstTopLevelNode());
return svm;
}

这有效,但到目前为止,我可以确认我已经在加载前和加载后测试了模型,加载后的结果似乎更糟。也就是说,在你训练一个分类器并测试它之后,它会很好,但如果你保存它并再次加载它,它就会被激活。

所以我想我想使用 C++ 的对象序列化来解决这个问题。如何将任意对象写入文件,然后从该文件读取?

也可以确认上述错误是否已在OpenCV 3.2.0中修复 我在发行说明中找不到任何内容

任何帮助都非常感谢人们

https://github.com/opencv/opencv/blob/master/modules/ml/src/svm.cpp#L1611

你会发现每次调用 cv::ml::SVM::trainAuto 或 cv::ml::SVM::train() 时都会调用一个 clear()