我正在使用OpenCV 3.0的Visual Studio 2010。我正在尝试训练SVM并将其保存到文件中,但我遇到了问题。
我的目的是提取一些图像的HOG特征并用它们训练SVM。一切似乎都是正确的,但是当我尝试将模型保存在xml文件中时,我得到以下错误:
TrainSVM.exe中0x000007fefd9bb16d(KernelBase.dll)中的未处理异常:异常de MICROSOFT C ++:cv ::内存位置0x0026e1b0处的异常。
然后在控制台中显示:
OpenCV错误:解析错误(SVM模型数据无效,请检查sv_count,var_ * an d class_count tags)在cv :: ml :: SVMImpl :: write中,文件C:\ builds \ master_PackSlave -w in64-vc12-shared \ opencv \ modules \ ml \ src \ svm.cpp,第2027行
当SVM没有经过适当的训练时,似乎出现错误,但我不明白我失败的地方,因为这行
svm->列车(auxResult)
结果为“true”。
我已经检查了图像并且它们已正确加载,有人可以帮助我吗?
提前致谢。
以下是代码:
String imagesPathPos = "Positivas/*.jpg"; // it has filters, too !
vector<String> fp;
glob(imagesPathPos, fp);
int tamaño = fp.size();
std::vector<cv::Point> positions;
positions.push_back(cv::Point(0,0));
std::vector<float> descriptor;
Ptr<TrainData> auxResult;
for (size_t i=0; i<fp.size(); ++i)
{
string nameFile = fp[i];
Mat img = imread(fp[i]);
cv::Mat grayImg;
cvtColor( img, grayImg, COLOR_BGR2GRAY );
hog.compute(grayImg,descriptor,winStride,trainingPadding,positions);
Mat auxDescriptor = cv::Mat(descriptor);
Mat descriptorMat(1,auxDescriptor.rows,CV_32FC1);
transpose(auxDescriptor, descriptorMat);
trainingData.push_back(descriptorMat);
trainingLabels.push_back(labelPositive);
}
String imagesPathNeg = "Negativas/*.jpg";
vector<String> fn;
glob(imagesPathNeg, fn, true);
for (size_t i=0; i<fn.size(); i++)
{
Mat img = imread(fn[i]);
cv::Mat grayImg;
cvtColor( img, grayImg, COLOR_BGR2GRAY );
hog.compute(grayImg,descriptor,Size(),Size(),positions);
Mat auxDescriptor = cv::Mat(descriptor);
Mat descriptorMat(1,auxDescriptor.rows,CV_32FC1);
transpose(auxDescriptor, descriptorMat);
trainingData.push_back(descriptorMat);
trainingLabels.push_back(labelPositive);
}
auxResult = TrainData::create(trainingData, type, trainingLabels);
svm->train(auxResult);
svm->save("output.xml");
答案 0 :(得分:0)
即使图像为负,您也要定义“labelPositive”。在通过向量 fn :
的循环中,可能存在错误trainingLabels.push_back(labelPositive);
您应该使用名为“labelNegative”的参数定义为-1。