SVM多分類器的實現(Opencv3,C )

2021-07-25 08:46:07 字數 1866 閱讀 9758

之前說要用svm實現表情識別來著,所以找個簡單例子練練手。

慣例開始放結果,實現結果如下:

//這裡簡單對四個點分了四類,顯示得很直觀。

//支援向量總共6個。

//最後測試了兩個點進行分類。

只需要配置好opencv3的環境即可執行。

這裡用到的是cv::svm, 老版本opencv2410之前用的是cvsvm,推薦用最新的opencv310。

1.常規方法:

2.一鍵安裝方法:

//**的備註自我感覺寫得挺多啦

下面就是簡單粗暴的**啦:

#includeusing namespace std;

using namespace cv;

using namespace cv::ml;

int main()

; float 訓練資料[4][2] = ,,, };

//轉為mat以呼叫

mat 訓練mat(4, 2, cv_32fc1, 訓練資料);

mat 標籤label(4, 1, cv_32sc1, 標籤);

//訓練的初始化

ptrsvm = svm::create();

svm->settype(svm::c_svc);

svm->setkernel(svm::linear);

svm->settermcriteria(termcriteria(termcriteria::max_iter, 100, 1e-6));

//開始訓練

svm->train(訓練mat, row_sample, 標籤label);

//-----------無關緊要的美工的部分-----------------------

//----其實對每個畫素點的座標也進行了分類----------------

int 寬 = 512, 高 = 512;

mat 演示 = mat::zeros(高, 寬, cv_8uc3);

vec3b green(0, 255, 0), blue(255, 0, 0), red(0, 0, 255), black(0, 0, 0);

for (int i = 0; i < 演示.rows; ++i)

for (int j = 0; j < 演示.cols; ++j)

//--------把初始化訓練的點畫進------------

int thickness = -1;

int linetype = 8;

for (int 畫點 = 0; 畫點 < sizeof(標籤) / sizeof(int); 畫點++)

// 把 support vectors cout粗來看看……

mat sv = svm->getsupportvectors();

cout << "support vectors為:" << endl;

for (int i = 0; i < sv.rows; ++i)

//測試測試

mat 結果;

float teatdata[2][2] = , };

mat query(2, 2, cv_32fc1, teatdata);

svm->predict(query, 結果);

cout << "分類結果為:" << endl;

cout << 結果;

imshow("svm顯示", 演示);

SVM 實現多分類思路

svm 是針對二分類問題,如果要進行多分類,無非就是多訓練幾個svm唄 對於k個類別 k 2 的情況,訓練k個svm,其中,第j個svm用於判斷任意條資料是是屬於類別j還是非類別j.的時候,具有最大值的 w i tx bi 表示該樣本屬於類別i.假設樣本有 3個類別,a,b,c,則需要訓練3個svm...

SVM多分類思路

svm本身是乙個二值分類器 svm演算法最初是為二值分類問題設計的,當處理多類問題時,就需要構造合適的多類分類器。目前,構造svm多類分類器的方法主要有兩類 1 直接法,直接在目標函式上進行修改,將多個分類面的引數求解合併到乙個最優化問題中,通過求解該最優化問題 一次性 實現多類分類。這種方法看似簡...

SVM多分類的幾種方式

svm實現多分類的三種方案 svm本身是乙個二值分類器 svm演算法最初是為二值分類問題設計的,當處理多類問題時,就需要構造合適的多類分類器。目前,構造svm多類分類器的方法主要有兩類 1 直接法,直接在目標函式上進行修改,將多個分類面的引數求解合併到乙個最優化問題中,通過求解該最優化問題 一次性 ...