//利用 SVM 比較資料大小
//By Meng-Luen Wu 2015
#include "opencv2/opencv.hpp" // opencv general include file
using namespace cv;
int main(){
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;
}
留言列表