MMH*_*MMH 9 c opencv svm face-detection feature-detection
我想使用svm分类器进行面部表情检测.我知道opencv有一个svm api,但我不知道应该用什么来训练分类器.到目前为止,我已经阅读了很多论文,所有这些都是在面部特征检测后训练分类器时说的.
到目前为止我做了什么,

注意:我知道如何只用正片和负片训练SVM,我在这里看到了这段代码,但我不知道如何将面部特征信息与它结合起来.
有人可以帮我开始用svm进行分类.
一个.什么应该是训练分类器的样本输入?
湾 如何使用此面部特征点训练分类器?
问候,
ber*_*rak 16
opencv中的机器学习算法都带有类似的界面.为了训练它,你传递一个NxM Mat offeatures(N行,每个特征一行长度为M)和一个带有类标签的Nx1 Mat.像这样:
//traindata //trainlabels
f e a t u r e 1
f e a t u r e -1
f e a t u r e 1
f e a t u r e 1
f e a t u r e -1
Run Code Online (Sandbox Code Playgroud)
对于预测,您以相同的方式填充1行的Mat,它将返回预测的标签
所以,比方说,你的16个面部点存储在一个矢量中,你会这样做:
Mat trainData; // start empty
Mat labels;
for all facial_point_vecs:
{
for( size_t i=0; i<16; i++ )
{
trainData.push_back(point[i]);
}
labels.push_back(label); // 1 or -1
}
// now here comes the magic:
// reshape it, so it has N rows, each being a flat float, x,y,x,y,x,y,x,y... 32 element array
trainData = trainData.reshape(1, 16*2); // numpoints*2 for x,y
// we have to convert to float:
trainData.convertTo(trainData,CV_32F);
SVM svm; // params omitted for simplicity (but that's where the *real* work starts..)
svm.train( trainData, labels );
//later predict:
vector<Point> points;
Mat testData = Mat(points).reshape(1,32); // flattened to 1 row
testData.convertTo(testData ,CV_32F);
float p = svm.predict( testData );
Run Code Online (Sandbox Code Playgroud)