SVM с openCV, для классификации данных

У меня есть приложение, которое собирает данные из контроллера скачкообразного движения, поскольку пользователь определяет его движения как жест с определенным типом, поэтому каждая запись жеста классифицируется по определенному индексу.

После того, как пользователь записывает себя для каждого жеста, я использую эти данные для выполнения некоторой работы и извлечения моментов (если потребуется дополнительное объяснение, я предоставлю его).

В другом приложении я должен идентифицировать жест в соответствии с наборами данных, поэтому я решил использовать SVM, который я написал:

 void CRecognition::SVM::SVMTrain()
{
CvSVMParams params;
params.svm_type    = CvSVM::C_SVC;
params.kernel_type = CvSVM::LINEAR;
params.term_crit   = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);

int numberofsamples = m_gMap.size();
float ** labels;
labels = new float*[numberofsamples];
int numofTotMoments = 0;
for(int i = 0 ; i < numberofsamples ; i++)
{
numofTotMoments += m_gMap[i]->getNumofSamples();
labels[i] = new float[1];
labels[i][0] = (float)(i+1);
}

double ** Newlabels = new double *[numofTotMoments];
double ** templbls = Newlabels;
double ** trainingData =  new double *[numofTotMoments];
double ** temp = trainingData;

for (int i = 0 ; i < numberofsamples ; i++)
{
Utils::Gesture * g = m_gMap[i];
for (int j = 0 ; j < m_gMap[i]->getNumofSamples() ; j++)
{
*templbls = new double [1];
*templbls[0] = (double)i+1;
*temp  = (*g)[j]; //direct the pointer to an vector of moments of that gesture
temp++;
templbls++;
}

}
Mat matlabesls(numofTotMoments,1, CV_32FC1, Newlabels);Mat mattrainingDataMat(numofTotMoments, NUM_OF_MOMENTS, CV_32FC1,trainingData);
try
{
// ... Contents of your main
m_svm.train(mattrainingDataMat,matlabesls,Mat(),Mat(),params);
}
catch ( cv::Exception & e )
{
cout << e.msg() << endl;
cout<< "hh";
}this->SaveSVM();
}

По какой-то причине я не могу понять, это всегда выдает исключение
в:cvPreprocessCategoricalResponses error code -5 err = "response #0 is not integral"

Если потребуется дополнительная информация, я ее предоставлю.

0

Решение

Хорошо, я нашел проблему, по какой-то причине матрица не была инициализирована с массивом, который у меня есть, поэтому я инициировал матрицу с помощью цикла for

  int countRow = 0;
for (int i = 0 ; i < numberofsamples ; i++)
{
Utils::Gesture * g = m_gMap[i];
for (int j = 0 ; j < m_gMap[i]->getNumofSamples() ; j++)
{
*templbls = new float [1];
*templbls[0] = (float)i+1;
matlabesls1.at<float>(countRow,0) = (float)i+1;
templbls++;
*temp = new float[NUM_OF_MOMENTS];
for (int k = 0 ; k < NUM_OF_MOMENTS ; k++)
{
float num = (float)((*g)[j])[k];
mattrainingDataMat1.at<float>(countRow,k) = num;
(*temp)[k] = num; //direct the pointer to an vector of moments of that gesture
}
temp++;
countRow++;
}

}

В любом случае спасибо всем!

0

Другие решения