一、Opencv中的核函数定义(4种):
1、CvSVM::LINEAR : 线性内核,没有任何向映射至高维空间,线性区分(或回归)在原始特点空间中被完成,这是最快的选择。
2、CvSVM::POLY : 多项式内核:
3、CvSVM::RBF : 基于径向的函数,对于大多半景象都是一个较好的选择:
4、CvSVM::SIGMOID : Sigmoid函数内核:
二、svm_type:指定SVM的类型(5种):
1、CvSVM::C_SVC : C类支撑向量分类机。 n类分组 (n≥2),容许用异常值处罚因子C进行不完全分类。
2、CvSVM::NU_SVC : 类支撑向量分类机。n类似然不完全分类的分类器。参数为庖代C(其值在区间【0,1】中,nu越大,决定计划鸿沟越腻滑)。
3、CvSVM::ONE_CLASS : 单分类器,所有的练习数据提取自同一个类里,然后SVM建树了一个分界线以分别该类在特点空间中所占区域和其它类在特点空间中所占区域。
4、CvSVM::EPS_SVR : 类支撑向量回归机。练习集中的特点向量和拟合出来的超平面的间隔须要小于p。异常值处罚因子C被采取。
5、CvSVM::NU_SVR : 类支撑向量回归机。 庖代了 p
1 #include <cv. 2 #include <highgui.h>
3 #include <ml.h> 4 #include <cxcore.h> 5 6 #include <iostream> 7 using namespace std; 8 9 int main() 10 { 11 // step 1: 12 //训练数据的分类标记,即4类 13 float labels[16] = { 1.0, 1.0, 1.0, 1.0, 2.0, 2.0, 2.0, 2.0, 3.0, 3.0, 3.0, 3.0, 4.0, 4.0, 4.0, 4.0 }; 14 CvMat labelsMat = cvMat(16, 1, CV_32FC1, labels); 15 //训练数据矩阵 16 float trainingData[16][2] = { { 0, 0 }, { 4, 1 }, { 4, 5 }, { -1, 6 }, { 3, 11 }, { -2, 10 }, { 4, 30 }, { 0, 25 }, { 10, 13 }, { 15, 12 }, { 25, 40 }, { 11, 35 }, { 8, 1 }, { 9, 6 }, { 15, 5 }, { 20, -1 } }; 17 CvMat trainingDataMat = cvMat(16, 2, CV_32FC1, trainingData); 18 19 // step 2: 20 //训练参数设定 21 CvSVMParams params; 22 params.svm_type = CvSVM::C_SVC; //SVM类型 23 params.kernel_type = CvSVM::LINEAR; //核函数的类型 24 25 //SVM训练过程的终止条件, max_iter:最大迭代次数 epsilon:结果的精确性 26 params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, FLT_EPSILON); 27 28 // step 3: 29 //启动训练过程 30 CvSVM SVM; 31 SVM.train(&trainingDataMat, &labelsMat, NULL, NULL, params); 32 33 // step 4: 34 //使用训练所得模型对新样本进行分类测试 35 for (int i = -5; i<15; i++) 36 { 37 for (int j = -5; j<15; j++) 38 { 39 float a[] = { i, j }; 40 CvMat sampleMat; 41 cvInitMatHeader(&sampleMat, 1, 2, CV_32FC1, a); 42 cvmSet(&sampleMat, 0, 0, i); // Set M(i,j) 43 cvmSet(&sampleMat, 0, 1, j); // Set M(i,j) 44 float response = SVM.predict(&sampleMat); 45 cout << response << " "; 46 } 47 cout << endl; 48 } 49 50 // step 5: 51 //获取支持向量 52 int c = SVM.get_support_vector_count(); 53 cout << endl; 54 for (int i = 0; i<c; i++) 55 { 56 const float* v = SVM.get_support_vector(i); 57 cout << *v << " "; 58 } 59 cout << endl; 60 61 system("pause"); 62 return 0; 63 }
三、InitMatHeader初始化矩阵头
CvMat* cvInitMatHeader( CvMat* mat, int rows, int cols, int type,void* data=NULL, int step=CV_AUTOSTEP );
mat
指针指向要被初始化的矩阵头.
rows
矩阵的行数.
cols
矩阵的列数.
type
矩阵元素类型.
data
可选的,将指向数据指针分配给矩阵头.
step
排列后的数据的整个行宽,默认状态下,使用STEP的最小可能值。也就是说默认情况下假定矩阵的行与行之间无隙.
函数 cvInitMatHeader 初始化已经分配了的 CvMat 结构. 它可以被OpenCV矩阵函数用于处理原始数据。
例如, 下面的代码计算通用数组格式存贮的数据的矩阵乘积.
计算两个矩阵的积
double a[] = { 1, 2, 3, 4,
5, 6, 7, 8,
9, 10, 11, 12 };
double b[] = { 1, 5, 9,
2, 6, 10,
3, 7, 11,
4, 8, 12 };
double c[9];
CvMat Ma, Mb, Mc ;
cvInitMatHeader( &Ma, 3, 4, CV_64FC1, a );
cvInitMatHeader( &Mb, 4, 3, CV_64FC1, b );
cvInitMatHeader( &Mc, 3, 3, CV_64FC1, c );
cvMatMulAdd( &Ma, &Mb, 0, &Mc );
// c 数组存贮 a(3x4) 和 b(4x3) 矩阵的积