Treine SVM e salve-o com o OpenCV 3.0
Estou usando o Visual Studio 2010, com OpenCV 3.0. Estou tentando treinar um SVM e salvá-lo em um arquivo, mas estou tendo problemas.
Meu objetivo é extrair os recursos HOG de algumas imagens e treinar um SVM com elas. Tudo parece estar certo, mas quando tento salvar o modelo em um arquivo xml, obtenho o seguinte erro:
Exceção não tratada em 0x000007fefd9bb16d (KernelBase.dll) no TrainSVM.exe: exceção do MICROSOFT C ++: cv :: exceção no local de memória 0x0026e1b0.
E então isso é mostrado no console:
Erro OpenCV: erro de análise (os dados do modelo SVM são inválidos, verifique as tags sv_count, var_ * e class_count) em cv :: ml :: SVMImpl :: write, arquivo C: \ builds \ master_PackSlave-w in64-vc12-shared \ opencv \ modules \ ml \ src \ svm.cpp, linha 2027
O erro parece aparecer quando o SVM não foi treinado corretamente, mas não entendo onde falhei, porque a linha
svm-> train (auxResult)
tem "verdadeiro" como resultado.
Eu verifiquei as imagens e elas estão carregadas corretamente, alguém poderia me ajudar?
Desde já, obrigado.
Aqui está o código:
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");