opencv 学习之 SVM / ANN 图片分类(OPENCV3.2)
2017-09-06 10:34
453 查看
#include <string> #include <iostream> #include <vector> #include <opencv2/core.hpp> #include <opencv2/imgproc.hpp> #include "opencv2/imgcodecs.hpp" #include <opencv2/highgui.hpp> #include <opencv2/ml.hpp> #include<opencv2/opencv.hpp> using namespace std; using namespace cv; using namespace cv::ml; int SVM_TEST() { //训练2组数据,每组4帧 int labels[8] = { -1, -1, -1, -1, 1, 1, 1, 1 }; Mat labelsMat(8, 1, CV_32SC1, labels); //样本宽高 int smpW = 540; int smpH = 360; //将样本的值逐像素赋给训练图像 Mat trainMat(8, smpW * smpH, CV_32FC1); for (int i = 0; i < 2; i++) { for (int j = 1; j < 5; j++) { string path = format("E:\\video\\tmp\\Img\\%d%d.bmp", i, j); Mat img = imread(path, 0); //Canny(img, img, 50, 100); int index1 = i * 4 + j - 1; float * trainData = trainMat.ptr<float>(index1); for (int h = 0; h < smpH; h++) { uchar * imgData = img.ptr<uchar>(h); for (int w = 0; w < smpW; w++) { int index2 = h*smpW + w; trainData[index2] = imgData[w]; } } } } //Ptr<SVM> svm = SVM::create(); //svm->setType(SVM::C_SVC); //svm->setKernel(SVM::LINEAR); //svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6)); ////设置训练数据 //Ptr<TrainData> tData = TrainData::create(trainMat, ROW_SAMPLE, labelsMat); //svm->train(tData); //svm->save("d:\\data.xml"); Ptr<SVM> svm = SVM::load("d:\\data.xml"); for (int i = 0; i < 2; i++) { for (int j = 5; j < 6; j++) { Mat testMat(1, smpW * smpH, CV_32FC1); float * testData = testMat.ptr<float>(0); string path = format("E:\\video\\tmp\\Img\\%d%d.bmp", i, j); Mat img = imread(path, 0); //Canny(img, img, 50, 100); for (int h = 0; h < smpH; h++) { uchar * imgData = img.ptr<uchar>(h); for (int w = 0; w < smpW; w++) { int index2 = h*smpW + w; testData[index2] = imgData[w] * 1.0; } } Mat ret(1, 1, CV_32S); float response = svm->predict(testMat, ret); //进行预测,返回1或-1 cout << response << endl; float * data = ret.ptr<float>(0); cout << data[0] << endl; waitKey(10); } } return 0; } int ANN_TEST() { // 540 x 360 矩阵 int smpW = 540; int smpH = 360; float labels[8] = { 0,0,0,0,1,1,1,1 }; // 每个样本数据对应的输出 Mat labelsMat(8, 1, CV_32FC1, labels); cout << labelsMat << endl; // 训练样本 Mat trainMat(8, smpW * smpH, CV_32FC1); for (int i = 0; i < 2; i++) { for (int j = 1; j < 5; j++) { string path = format("E:\\video\\tmp\\Img\\%d%d.bmp", i, j); Mat img = imread(path, 0); if (img.empty()) { return 0; } //Canny(img, img, 50, 100); int index1 = i * 4 + j - 1; float * trainData = trainMat.ptr<float>(index1); for (int h = 0; h < smpH; h++) { uchar * imgData = img.ptr<uchar>(h); for (int w = 0; w < smpW; w++) { int index2 = h*smpW + w; trainData[index2] = imgData[w]; } } } } //// BP 模型创建和参数设置 //Ptr<ANN_MLP> bp = ANN_MLP::create(); //Mat layerSizes = (Mat_<int>(1, 3) << smpW * smpH, 6, 1); //bp->setLayerSizes(layerSizes); //bp->setTrainMethod(ANN_MLP::BACKPROP, 0.1, 0.1); //bp->setActivationFunction(ANN_MLP::SIGMOID_SYM); //bp->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 10000, /*FLT_EPSILON*/1e-6)); //// 保存训练好的神经网络参数 //bool trained = bp->train(trainMat, ROW_SAMPLE, labelsMat); //if (trained) //{ // bp->save("d:\\bp_param.xml"); //} // 创建训练好的神经网络 Ptr<ANN_MLP> bp = ANN_MLP::load("d:\\bp_param.xml"); for (int i = 0; i < 2; i++) { for (int j = 5; j < 6; j++) { Mat testMat(1, smpW * smpH, CV_32FC1); float * testData = testMat.ptr<float>(0); string path = format("E:\\video\\tmp\\Img\\%d%d.bmp", i, j); Mat img = imread(path, 0); //Canny(img, img, 50, 100); for (int h = 0; h < smpH; h++) { uchar * imgData = img.ptr<uchar>(h); for (int w = 0; w < smpW; w++) { int index2 = h*smpW + w; testData[index2] = imgData[w] * 1.0; } } Mat responseMat; bp->predict(testMat, responseMat); float response = responseMat.ptr<float>(0)[0]; cout << response << endl; float * data = responseMat.ptr<float>(0); cout << data[0] << endl; waitKey(10); } } waitKey(0); return 0; } int main() { SVM_TEST(); ANN_TEST(); }
VS2017 + OPENCV3.2
用法与 OPENCV2 有较大差异。另外,特征文件载入时与 OPENCV2 差异最大,需要直接载入,不再先创建再载入。否则报内存错误。
相关文章推荐
- OpenCV3与深度学习实例-使用GoogLeNet模型进行图片分类识别
- opencv机器学习 Haar特征 LBP特征 adaboost集成学习 级联分类器 支持向量机SVM 主成分分析PCA 人工神经网络(ANN) 笑脸检测 SVM分类 笑脸 检测
- opencv3.3+dnn+caffe深度学习来实现图片的分类识别
- OpenCV学习:HOG+SVM物体分类
- 【OpenCV学习笔记】【教程翻译】四(车牌检测之SVM分类)
- 基于qt和opencv3实现机器学习之:利用svm(支持向量机)分类
- 【OpenCV学习笔记 015】SVM图像分类
- 学习SVM(一) SVM模型训练与分类的OpenCV实现
- 在opencv3中实现机器学习之:利用svm(支持向量机)分类
- OpenCV学习-利用ROI裁剪图片
- 【OpenCV学习】导入一个图片
- Caffe——python接口学习(6):用训练好的模型来分类新的图片
- 机器学习之-利用svm(支持向量机)分类(opencv3)
- opencv_tutorial_code学习——图片叠加
- opencv学习笔记-ml模块中的svm使用
- openCV学习笔记(8):利用cvSetImageROI截取/裁剪图片
- SVM 多分类 -SVM分类opencv3.0源代码
- OpenCV3 SVM ANN Adaboost KNN 随机森林等机器学习方法对OCR分类
- 在opencv3中利用SVM进行图像目标检测和分类
- OpenCv学习笔记--支持向量机SVM线性可分情况下的OpenCv实现的超详细注释(2)