所以,我即将训练一个分类器,需要在mexopencv中保存分类器的结果。
hello = cv.SVM;
hello.save('foo.xml')
My Matlab编译器由于分段错误而崩溃。 As far as I know这应该是OpenCV中的方式。还有其他方法可以保存SVM
中通过mexopencv
训练的文件;或者这与Matlab文件写入选项有关。感谢。
答案 0 :(得分:1)
您可以尝试使用具有Matlab界面的libsvm。它有两个在svm中读写的函数(libsvmwrite
和libsvmread
)。
答案 1 :(得分:1)
这实际上是OpenCV本身的一个错误,而不是mexopencv。你应该report it ......
这是一个重现错误的最小C ++程序:
#include "opencv2/opencv.hpp"
#include "opencv2/ml/ml.hpp"
using namespace cv;
int main()
{
Ptr<SVM> svm = new SVM();
svm->save("svm.xml");
return 0;
}
在调试器下运行它,我located违规代码:
df_count = class_count > 1 ? class_count*(class_count-1)/2 : 1;
df = decision_func;
cvStartWriteStruct( fs, "decision_functions", CV_NODE_SEQ );
for( i = 0; i < df_count; i++ )
{
int sv_count = df[i].sv_count;
...
}
此时,SVM模型未经过培训,df
是未初始化的指针。 class_count
等于0
,但df_count
设置为1
,因此df[i]
(i=0
}会导致访问违规...
我认为这可以修复为:
df_count = class_count > 1 ? class_count*(class_count-1)/2 : 1;
if (class_count == 0) df_count = 0;
在调试期间将df_count
更改为0
,程序正常运行,我得到以下XML文件:
<?xml version="1.0"?>
<opencv_storage>
<my_svm type_id="opencv-ml-svm">
<svm_type>C_SVC</svm_type>
<kernel>
<type>RBF</type>
<gamma>1.</gamma>
</kernel>
<C>1.</C>
<term_criteria>
<epsilon>1.1920928955078125e-007</epsilon>
<iterations>1000</iterations>
</term_criteria>
<var_all>0</var_all>
<var_count>0</var_count>
<sv_total>0</sv_total>
<support_vectors></support_vectors>
<decision_functions></decision_functions>
</my_svm>
</opencv_storage>
现在,您可以先将培训模型首先避免错误,然后再将其保存到文件中:)