SVM分类器
opencv3.2中机器学习算法的使用与之前的版本不同,假设训练数据(分类样本)为Mat TrainData(这里统一在Reshape为一行之后变为CV_32FC1),对应训练数据(分类标签)为Mat TrainLabels(这里使用CV_32SC1类型);
// 创建SVM分类器并且配置分类器属性:
Ptr<SVM> svm = SVM::create();
svm->setType(SVM::C_SVC);
svm->setKernel(SVM::LINEAR);
svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6));
// 设置训练数据,训练SVM,保存训练结果:
Ptr<TrainData> tData = TrainData::create(TrainData, ROW_SAMPLE, TrainLabels);
svm->train(tData);
svm->save("SVMdata.xml");
// 如果SVM分类器是经过训练的,将训练后的数据载入:
Ptr<SVM> svm = SVM::load("SVMdata.xml");
// 预测分类信息:
Mat pre; // 将预测结果保存于矩阵
svm->predict(PredictImage, pre);
int result = svm->predict(PredictImage); // 将预测结果直接输出,用于一个结果的预测
注意:在用SVM进行预测时,Mat PredictImage类型要与训练的数据一致,这里是
CV_32FC1类型。
KNN分类器
这里KNN的训练数据是图像的HOG特征!!!
// 创建KNN分类器并且配置分类器属性:
int K = 1;
Ptr<KNearest> knn = KNearest::create();
knn->setDefaultK(K);
knn->setIsClassifier(true);
// 设置训练数据,训练KNN,保存训练结果:
Ptr<TrainData> tData = TrainData::create(KnnTrainData, ROW_SAMPLE, KnnTrainLabels);
knn->train(tData);
knn->save("KnnRecogDigit.txt");
// 如果KNN分类器是经过训练的,将训练后的数据载入:
Ptr<KNearest> knn = Algorithm::load<KNearest>("KnnRecogDigit.txt");
// 预测分类信息:
int result = knn->predict(fileImageHOG);