很遗憾,您不能直接使用当前界面进行操作。
一种解决方案是改用库 libsvm。
你可以在opencv中做,但需要一点工作。
首先,你必须知道 OpenCV 使用"1-against-1" 策略进行多类分类。
对于 N 类问题,它将训练 N*(N-1)/2 二元分类器(每对类一个),然后使用多数票来选择最可能的类。
您必须应用每个分类器,并自己完成大部分工作以获得您想要的。
下面的代码向您展示了如何使用 OpenCV 3 执行此操作(警告:它未经测试,可能包含错误,但它为您提供了一个很好的起点)。
Ptr<SVM> svm;
int N; //number of classes
Mat data; //input data to classify
Mat sv=svm->getSupportVectors();
Ptr<Kernel> kernel=svm->getKernel();
Mat buffer(1,sv.rows,CV_32F);
kernel->calc(sv.rows, sv.cols , sv.ptr<float>(), data.ptr<float>(), buffer.ptr<float>()); // apply kernel on data (CV_32F vector) and support vectors
Mat alpha, svidx;
vector<int> votes(N, 0); // results of majority vote will be stored here
int i, j, dfi;
for( i = dfi = 0; i < N; i++ )
{
for( j = i+1; j < N; j++, dfi++ )
{
// compute score for each binary svm
double rho=svm->getDecisionFunction(dfi, alpha, svidx);
double sum = -rho;
for( k = 0; k < sv.rows; k++ )
sum += alpha.at<float>(k)*buffer.at<float>(svidx.at<int>(k));
// majority vote
votes[sum > 0 ? i : j]++;
}
}
编辑:这段代码改编自Opencvhere的内部代码。
正如 David Doria 在 cmets 中指出的那样,这是不正确的,因为在 SVM 类中没有定义 getKernel 函数。我还是把它留在这里,因为修改内部 OpenCV 代码添加它应该不会太难,而且显然没有其他方法可以做到。