因此,我要训练一个分类器,并且需要将分类器的结果保存在mexopencv中。
hello = cv.SVM;
hello.save('foo.xml')
我的Matlab编译器由于分段错误而崩溃。据我所知,这应该是OpenCV的方式。还有其他方法可以保存通过SVM
in训练的文件吗mexopencv
?还是与Matlab文件写入选项有关。谢谢。
实际上,这是OpenCV本身的错误,而不是mexopencv。您应该举报...
这是最小化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;
}
在调试器下运行此命令,我找到了有问题的代码:
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>
现在,您可以通过在将模型保存到文件之前先训练模型来避免该错误:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句