opencv knn,svm,ann,人脸识别类的使用总结
来源:互联网 发布:apache atlas 编辑:程序博客网 时间:2024/05/16 08:36
1、 knn
需要引用的头文件 #include <opencv2/ml/ml.hpp>
用到的opencv类:KNearest *knn;
得到训练数据和相应的标记:trainData,将每一个训练矩阵归一化为相同的大小,假如为128行128列,则将其转换为1行128*128列存入trainData中,假如有10个分组,每组中50个样本,则最后得到的trainData为500行128*128列,trainClasses为500行1列。trainData和trainClasses都为CV_32FC1类型的矩阵
训练数据:knn = new KNearest(trainData, trainClasses, Mat(), false, K); //其中,K表示最大邻居个数,推荐取值为5
预测:float result = knn->find_nearest(img, K, tem1, nearest, tem2); //此行代码之前,仅需Mat tem1, tem2;即可
唯一遗憾的是,我现在还没找到可以保存训练后数据的方式。
2、svm
需要引用的头文件 #include <opencv2/ml/ml.hpp>
第一步:定义参数
CvSVMParams params;params.svm_type = CvSVM::C_SVC;params.kernel_type = CvSVM::LINEAR;params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);或者
CvSVMParams SVM_params; // CvSVMParams结构用于定义基本参数SVM_params.svm_type = CvSVM::C_SVC;// SVM类型SVM_params.kernel_type = CvSVM::LINEAR; // 不做映射SVM_params.degree = 0;SVM_params.gamma = 1;SVM_params.coef0 = 0;SVM_params.C = 1;SVM_params.nu = 0;SVM_params.p = 0;SVM_params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 1000, 0.01);参数的详细意义,可以日后好好探究下
第二步:得到训练数据和相应的标记,其mat矩阵存储方式 同knn
第三步:创建svm类,并训练
CvSVM SVM;SVM.train(trainingDataMat, labelsMat, Mat(), Mat(), params);或者一行代码就可以搞定
CvSVM svmClassifier(SVM_TrainingData, SVM_Classes, Mat(), Mat(), SVM_params);第四步:预测分类
int response = (int)svmClassifier.predict(p);//其中,p为一行多列的Mat矩阵
3、ann(神经网络)
神经网络的简单用法,可以参考ann简单使用示例
需要引用的头文件 #include <opencv2/ml/ml.hpp>
第一步:定义参数
CvANN_MLP ann;Mat layers(1, 3, CV_32SC1);layers.at<int>(0) = TrainData.cols;//对应训练数据矩阵的列数layers.at<int>(1) = nNeruns;//网络层数layers.at<int>(2) = trainClasses.cols;//对应标记矩阵的列数
ann.create(layers, CvANN_MLP::SIGMOID_SYM, 1, 1);
CvANN_MLP_TrainParams params;params.train_method = CvANN_MLP_TrainParams::BACKPROP;params.bp_dw_scale = 0.1;params.bp_moment_scale = 0.1;或者(参数的具体意义,现在还没搞懂,推荐使用上面的参数)
params.train_method=CvANN_MLP_TrainParams::RPROP;params.rp_dw0 = 0.1;
params.rp_dw_plus = 1.2; params.rp_dw_minus = 0.5;params.rp_dw_min = FLT_EPSILON; params.rp_dw_max = 50.;
第二步:得到训练数据和相应的标记,其中标记矩阵可以是多列的,不一定是knn中总结的多行一列
第三步:训练数据
ann.train(TrainData, trainClasses, Mat(), Mat(), params);
第四步:预测
ann.predict(features, Predict_result);//其中,features为一行多列的数据矩阵,列数对应TrainData, Predict_result为一行多列或者一行一列的矩阵,对应trainClass。最后从Predict_result中判断其属于哪一类
4、人脸识别类
详细的可以参考opencv实践之路
不需要知道在哪个头文件中,直接#include<opencv2\opencv.hpp> 即可
OpenCV 自带了三个人脸识别算法:Eigenfaces,Fisherfaces 和局部二值模式直方图 (LBPH)
第一步:Ptr<FaceRecognizer> model;
第二步:得到训练数据和相应的标记, vector<Mat> images;vector<int> labels; //这个比上面的knn,svm,ann都简单
第三步:
model = createEigenFaceRecognizer();
model->train(images, labels);
model->save("MyFacePCAModel.xml");//so easy
或者
model = createFisherFaceRecognizer();
model->train(images, labels);
model->save("MyFaceFisherModel.xml");
或者
model = createLBPHFaceRecognizer();
model->train(images, labels);
model->save("MyFaceLBPHModel.xml");
如果已经保存了训练好的数据,可以:model->load("MyFacePCAModel.xml");
第四步:int result = model->predict(src);
令人欣喜的是,不仅仅是人脸识别,其他目的的训练和预测也是可以的。
- opencv knn,svm,ann,人脸识别类的使用总结
- 各常用分类算法的优缺点总结:DT/ANN/KNN/SVM/GA/Bayes/Adaboosting/Rocchio
- 基于 OpenCV 的 LBP + SVM 人脸识别
- opencv 中SVM + PCA 人脸识别
- opencv 中SVM + PCA 人脸识别
- SVM与ANN实现OCR字符识别
- 使用opencv的SVM实现车牌区域识别
- 使用opencv的SVM和神经网络实现车牌识别
- 使用opencv的SVM和神经网络实现车牌识别
- 使用opencv的SVM实现车牌区域识别
- 使用opencv的SVM和神经网络实现车牌识别
- 使用opencv的SVM实现车牌区域识别
- opencv svm的使用
- BoW(SIFT/SURF/...)+SVM/KNN的OpenCV 实现
- opencv的svm学习_字符识别
- opencv 基于SVM的几何形状识别
- 用opencv svm 折腾的识别程序
- opencv的svm学习_字符识别
- ParalleX OS 设计与实现 一致性理念设计
- 【POJ】1663 - Number Steps(找规律)
- swiprefreshlayout主动显示小圆圈
- for each 循环
- 跨平台混合开发
- opencv knn,svm,ann,人脸识别类的使用总结
- IOS代码签名
- 用Calendar实现简单的小日历
- LeetCode:Palindrome Linked List(回文链表)
- Activity之间的数据传递
- textview跑马灯效果
- hibernate的cascade问题
- java Lambda expressions basic
- AngularJS学习笔记二