第一次需要使用opencv 来实现svm分类,记录一下大体的流程。
//---------- 头文件
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include "opencv2/imgcodecs.hpp"
#include <opencv2/highgui.hpp>
#include <opencv2/ml.hpp> //ml模块
using namespace cv;
using namespace cv::ml; //ml命名空间
using namespace std;
//---------- 1. 随机生成训练数据(二维数据,超平面为二维) ---
Mat trainData(2 * NTRAINING_SAMPLES, 2, CV_32FC1);
Mat labels(2 * NTRAINING_SAMPLES, 1, CV_32SC1);
//------------------ 2. 设置支持向量机范围 -------------
Ptr<SVM> svm = SVM::create(); //声明SVM对象
svm->setType(SVM::C_SVC); //SVM模型选择
svm->setC(0.2); //惩罚因子设置(原始0.1)
svm->setKernel(SVM::LINEAR); //核函数类型:线性
svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, (int)1e7, 1e-6)); //迭代要求
//------------------- 3. 训练SVM -------------------------
svm->train(trainData, ROW_SAMPLE, labels); //训练
//-------------------4.保存训练器
svm->save("mnist_svm.xml");
//-------------------5.导入训练器
//Ptr<SVM> svm1 = StatModel::load<SVM>("mnist_dataset/mnist_svm.xml");
//-------------------6.预测
cv::Mat sampleMat = (cv::Mat_<float>(1, 2) << j,i);
float fRespone = svm->predict(sampleMat);
fRespone ---> 分类结果
关于ROW_SAMPLE,见ml.hpp中的定义(添加注释)
enum SampleTypes
{
//每一行为一个样本数据
ROW_SAMPLE = 0, //!< each training sample is a row of samples
//每一列为一个样本数据
COL_SAMPLE = 1 //!< each training sample occupies a column of samples
};
# find required opencv
find_package(OpenCV REQUIRED)
# directory of opencv headers
include_directories(${OpenCV_INCLUDE_DIRS})
# name of executable file and path of source file
add_executable(opencv_test src/opencv_test.cpp)
# directory of opencv library
link_directories(${OpenCV_LIBRARY_DIRS})
# opencv libraries
target_link_libraries(opencv_test ${OpenCV_LIBS})
reference:
https://blog.youkuaiyun.com/CUSTESC/article/details/60882425
https://blog.youkuaiyun.com/jiangli198867/article/details/79277612
https://www.cnblogs.com/br170525/p/9236479.html