利用SVM解決2維空間向量的3級分類問題
來源:懂視網(wǎng)
責編:小采
時間:2020-11-09 15:29:22
利用SVM解決2維空間向量的3級分類問題
利用SVM解決2維空間向量的3級分類問題:【原文:http://blog.csdn.net/firefight/article/details/6400060】 為了學習OPENCV SVM分類器, 參考網(wǎng)上的 利用SVM解決2維空間向量的分類問題 實現(xiàn)并改為C代碼,僅供參考 環(huán)境:OPENCV2.2 VS2008 步驟: 1,生成隨機的點,并按一定的空
導讀利用SVM解決2維空間向量的3級分類問題:【原文:http://blog.csdn.net/firefight/article/details/6400060】 為了學習OPENCV SVM分類器, 參考網(wǎng)上的 利用SVM解決2維空間向量的分類問題 實現(xiàn)并改為C代碼,僅供參考 環(huán)境:OPENCV2.2 VS2008 步驟: 1,生成隨機的點,并按一定的空
【原文:http://blog.csdn.net/firefight/article/details/6400060】 為了學習OPENCV SVM分類器, 參考網(wǎng)上的 利用SVM解決2維空間向量的分類問題 實現(xiàn)并改為C代碼,僅供參考 環(huán)境:OPENCV2.2 VS2008 步驟: 1,生成隨機的點,并按一定的空間分布將其歸類 2,
【原文:http://blog.csdn.net/firefight/article/details/6400060】
為了學習OPENCV SVM分類器, 參考網(wǎng)上的"利用SVM解決2維空間向量的分類問題"實現(xiàn)并改為C++代碼,僅供參考
環(huán)境:OPENCV2.2 + VS2008
步驟:
1,生成隨機的點,并按一定的空間分布將其歸類
2,創(chuàng)建SVM并利用隨機點樣本進行訓練
3,將整個空間按SVM分類結(jié)果進行劃分,并顯示支持向量
[cpp] view
plaincopy
-
#include "stdafx.h"
-
#include
-
-
void drawCross(Mat &img, Point center, Scalar color)
-
{
-
int col = center.x > 2 ? center.x : 2;
-
int row = center.y> 2 ? center.y : 2;
-
-
line(img, Point(col -2, row - 2), Point(col + 2, row + 2), color);
-
line(img, Point(col + 2, row - 2), Point(col - 2, row + 2), color);
-
}
-
-
int newSvmTest(int rows, int cols, int testCount)
-
{
-
if(testCount > rows * cols)
-
return 0;
-
-
Mat img = Mat::zeros(rows, cols, CV_8UC3);
-
Mat testPoint = Mat::zeros(rows, cols, CV_8UC1);
-
Mat data = Mat::zeros(testCount, 2, CV_32FC1);
-
Mat res = Mat::zeros(testCount, 1, CV_32SC1);
-
-
//Create random test points
-
for (int i= 0; i< testCount; i++)
-
{
-
int row = rand() % rows;
-
int col = rand() % cols;
-
-
if(testPoint.at(row, col) == 0)
-
{
-
testPoint.at(row, col) = 1;
-
data.at(i, 0) = float (col) / cols;
-
data.at(i, 1) = float (row) / rows;
-
}
-
else
-
{
-
i--;
-
continue;
-
}
-
-
if (row > ( 50 * cos(col * CV_PI/ 100) + 200) )
-
{
-
drawCross(img, Point(col, row), CV_RGB(255, 0, 0));
-
res.at(i, 0) = 1;
-
}
-
else
-
{
-
if (col > 200)
-
{
-
drawCross(img, Point(col, row), CV_RGB(0, 255, 0));
-
res.at(i, 0) = 2;
-
}
-
else
-
{
-
drawCross(img, Point(col, row), CV_RGB(0, 0, 255));
-
res.at(i, 0) = 3;
-
}
-
}
-
-
}
-
-
//Show test points
-
imshow("dst", img);
-
waitKey(0);
-
-
/////////////START SVM TRAINNING//////////////////
-
CvSVM svm = CvSVM();
-
CvSVMParams param;
-
CvTermCriteria criteria;
-
-
criteria= cvTermCriteria(CV_TERMCRIT_EPS, 1000, FLT_EPSILON);
-
/* SVM種類:CvSVM::C_SVC
Kernel的種類:CvSVM::RBF
degree:10.0(此次不使用)
gamma:8.0
coef0:1.0(此次不使用)
C:10.0
nu:0.5(此次不使用)
p:0.1(此次不使用)
然后對訓練數(shù)據(jù)正規(guī)化處理,并放在CvMat型的數(shù)組里。*/
-
param= CvSVMParams (CvSVM::C_SVC, CvSVM::RBF, 10.0, 8.0, 1.0, 10.0, 0.5, 0.1, NULL, criteria);
-
svm.train(data, res, Mat(), Mat(), param);
-
-
for (int i= 0; i< rows; i++)
-
{
-
for (int j= 0; j< cols; j++)
-
{
-
Mat m = Mat::zeros(1, 2, CV_32FC1);
-
m.at(0,0) = float (j) / cols;
-
m.at(0,1) = float (i) / rows;
-
-
float ret = 0.0;
-
ret = svm.predict(m);
-
Scalar rcolor;
-
-
switch ((int) ret)
-
{
-
case 1: rcolor= CV_RGB(100, 0, 0); break;
-
case 2: rcolor= CV_RGB(0, 100, 0); break;
-
case 3: rcolor= CV_RGB(0, 0, 100); break;
-
}
-
-
line(img, Point(j,i), Point(j,i), rcolor);
-
}
-
}
-
-
imshow("dst", img);
-
waitKey(0);
-
-
//Show support vectors
-
int sv_num= svm.get_support_vector_count();
-
for (int i= 0; i< sv_num; i++)
-
{
-
const float* support = svm.get_support_vector(i);
-
circle(img, Point((int) (support[0] * cols), (int) (support[1] * rows)), 5, CV_RGB(200, 200, 200));
-
}
-
-
imshow("dst", img);
-
waitKey(0);
-
-
return 0;
-
}
-
-
int main(int argc, char** argv)
-
{
-
return newSvmTest(400, 600, 100);
-
}
學習樣本:
分類:
支持向量:
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com
利用SVM解決2維空間向量的3級分類問題
利用SVM解決2維空間向量的3級分類問題:【原文:http://blog.csdn.net/firefight/article/details/6400060】 為了學習OPENCV SVM分類器, 參考網(wǎng)上的 利用SVM解決2維空間向量的分類問題 實現(xiàn)并改為C代碼,僅供參考 環(huán)境:OPENCV2.2 VS2008 步驟: 1,生成隨機的點,并按一定的空