如何用带有面部特征的openCV训练支持向量机(svm)分类器?

我想使用svm分类器进行面部表情检测.我知道opencv有一个svm api,但我不知道应该是什么输入来训练分类器.到目前为止,我已经读了很多论文,他们都在面部特征检测训练分类器之后说.

到目前为止我做了什么,

>面部检测,
>每帧16个面部点计算.以下是面部特征检测的输出![输入图像说明
>保存特征点的像素地址的向量

注意:我知道如何才能用正面和负面的图像训练SVM,我看到这个codehere,但是我不知道我如何将面部特征信息与它结合在一起.

任何人都可以帮助我用svm开始分类.

一个.什么样的样品输入来训练分类器?

湾如何用这个面部特征点训练分类器?

问候,

解决方法

opencv中的机器学习algos都有类似的界面.训练它,你传递一个NxM Mat自定义(N行,每个特征一行,长度为M)和一个Nx1垫与类标签.喜欢这个:
//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

为了预测,您以相同的方式填充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,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 );

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...