从字符串加载OpenCV的ML(SVM)

时间:2014-09-16 09:47:46

标签: android c++ ios opencv machine-learning

我目前正在开发一种基于机器学习的纹理分类算法,主要是支持向量机(SVM)。我能够在测试数据上获得一些非常好的结果,现在想在生产环境中使用SVM。

在我的情况下,生产力意味着它将在多个桌面和移动平台(即Android,iOS)上运行,并且总是在本机线程的深处。由于软件结构和平台访问策略的原因,我无法从使用SVM的位置访问文件系统。但是,我的框架支持在访问文件系统的环境中读取文件,并将文件的内容作为 std :: string 引导到我的应用程序的SVM部分。

如何配置SVM的标准过程是使用文件名和OpenCV直接从文件中读取:

cv::SVM _svm;
_svm.load("/home/<usrname>/DEV/TrainSoftware/trained.cfg", "<trainSetName>");

我想要这个(基本上从其他地方读取文件并将文件的内容作为字符串传递给SVM):

cv::SVM _svm;
std::string trainedCfgContentStr="<get the content here>";
_svm.loadFromString(trainedCfgContentStr, "<trainSetName>") // This method is desired

我在OpenCV的文档或源代码中找不到任何可能的方式,但它不会是第一个OpenCV-Feature,而且没有记录或广为人知。当然,我可以破解OpenCV源代码并交叉编译到我的每个目标平台,但我会尽量避免这种情况,因为这是一项很多工作,除了我相信我不是第一个有这个问题。

所有想法(也非常规)和/或提示都受到高度赞赏!

1 个答案:

答案 0 :(得分:1)

只要你坚持使用c ++ api就很容易,FileStorage 可以从内存中读取:

string data_string; //containing xml/yml data
FileStorage fs( data_string, FileStorage::READ | FileStorage::MEMORY);
svm.read(fs.getFirstTopLevelNode()); // or the node with your trainset

(遗憾的是没有暴露给java)