[英]C++ OpenCV svm train crashes
我有两个向量:
vector<int> features;
vector<int> labels;
在某些时候,我在程序中填充了一些值。 (两个向量大小相同)然后,当我想训练svm
,将向量复制到2个新的cv::Mat
如下所示:
Mat trainMat(features.size(), 1, CV_32FC1);
Mat labelsMat(labels.size(), 1, CV_32FC1);
for (int i = 0; i < features.size(); i++) {
trainMat.at<int>(i, 1) = features.at(i);
labelsMat.at<int>(i, 1) = labels.at(i);
}
然后我创建svm
及其params
:
cv::SVMParams params;
params.svm_type = cv::SVM::C_SVC;
params.kernel_type = cv::SVM::POLY;
params.gamma = 3;
cv::SVM svm;
最后我训练它:
svm.train(trainMat, labelsMat, Mat(), Mat(), params);
但是,程序崩溃并给出以下错误:
Unhandled exception at 0x7484D928 in cvtest.exe: Microsoft C++ exception: cv::Exception at memory location 0x0017F04.
起初,我认为问题出在数据的大小(因为我是在32位上编译的)。 因此,我仅使用了20个甚至4个样本进行了测试。 但是,仍然崩溃。 还有什么可能导致内存错误?
最后,我发现了问题。 svm.train()
仅接受float
类型的功能,而不接受int
。 我只是改变了vector<int> features;
vector<float> features;
而且有效。
您正在使用CV_32FC1将trainMat和labelMat创建为浮点矩阵,但使用trainMat.at<int>
设置值是错误的。 它必须是trainMat.at<float>
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.