之前說要用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 直接法,直接在目標函式上進行修改,將多個分類面的引數求解合併到乙個最優化問題中,通過求解該最優化問題 一次性 ...