opencv_SVM分類器小筆記_L1
【程式碼】
#include <stdio.h>
#include<iostream>
#include <ctype.h>
#include <opencv2\opencv.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2/ml/ml.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
CvSVMParams params; //設定 SVM 參數用的物件
//以下設定 SVM 參數
params.svm_type = CvSVM::C_SVC;
params.kernel_type = CvSVM::RBF; //Kernel Function 推薦使用 RBF
params.gamma = 3;
params.C = 100;
const int num_data = 5; //資料數
const int num_column = 2; //欄位數
Mat training_mat(num_data, num_column, CV_32FC1); //訓練陣列
Mat labels(num_data, 1, CV_32FC1); //標籤
//五筆訓練資料陣列
int data[num_data][num_column] = {
{ 100, 50 },
{ 50, 100 },
{ 200, 10 },
{ 20, 40 },
{ 30, 10 }
};
//針對以上五筆資料個別的答案,如果 左比右大 標 1 , 否則 標 -1
int label[num_data] = { 1, -1, 1, -1, 1 };
//將資料和 label 分別塞入資料結構中
for (int n = 0; n < num_data; n++){
for (int c = 0; c < num_column; c++) {
training_mat.at<float>(n, c) = data[n][c];
}
}
for (int ii = 0; ii < num_data; ii++){
labels.at<float>(ii) = label[ii];
}
//將以上資料結構塞給 SVM Train 做訓練
CvSVM svm;
svm.train(training_mat, labels, Mat(), Mat(), params);
svm.save("svm.sav"); //將訓練好的結果存檔
svm.load("svm_filename"); //將訓練好的存檔讀回來給 svm 物件
//設定一筆測試資料看看
Mat img_mat_1d(1, 2, CV_32FC1);
img_mat_1d.at<float>(0, 0) = 50;
img_mat_1d.at<float>(0, 1) = 100;
//利用 svm 物件
printf("%f\n ", svm.predict(img_mat_1d)); //因為 50<100 ,所以會輸出 -1
img_mat_1d.at<float>(0, 0) = 99;
img_mat_1d.at<float>(0, 1) = 30;
printf("%f\n ", svm.predict(img_mat_1d)); //因為 99>30 ,所以會輸出 1
system("pause");
return 0;
}
若編譯出現錯誤 請參考這篇解決方案
留言
張貼留言