//利用 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;


}


創作者介紹

Frank's 資訊科技潮流站

finalfrank 發表在 痞客邦 PIXNET 留言(0) 人氣()