您的位置:首页 > 运维架构

opencv下使用SVM进行简单颜色分类

2016-01-31 10:04 435 查看
在opencv下有个SVM的例子,我把那个例子改了改,试试能否对颜色进行分类,下面我给出代码!

<span style="font-size:18px;">#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/ml/ml.hpp>
#include<iostream>
using namespace cv;
using namespace std;

int main(int argc, char *argv[])
{

float labels[6]={1.0, 1.0, 1.0, 0, 0, 0};
Mat labelsMat(6,1,CV_32FC1,labels);//设置输出学习样本

float train_Data[6][3]={ {255,0, 0}, {255,0,0}, {255, 0,0}, {0,0,255 },{0,0,255},{0,0,255}};
Mat train_DataMat(6,3,CV_32FC1,train_Data);//设置输入样本
cout<<train_DataMat<<endl;
/*
设置参数
*/
CvSVMParams params;
params.svm_type=CvSVM::C_SVC;
params.kernel_type=CvSVM::LINEAR;
params.term_crit=cvTermCriteria(CV_TERMCRIT_ITER,20000,1e-6);

CvSVM SVM;
SVM.train(train_DataMat,labelsMat,Mat(),Mat(),params);//开始训练
/*设定我们测试的数据*/
Mat Red_Mat(100,100,CV_32FC3,Scalar(255,0,0));
circle(Red_Mat,Point(Red_Mat.rows/2,Red_Mat.cols/2),30,Scalar(0,0,255),8);
namedWindow("Test_Image",CV_WINDOW_AUTOSIZE);
imshow("Test_Image",Red_Mat);

uchar *p=Red_Mat.data;
Mat T3_M(Red_Mat.rows*Red_Mat.cols,3,CV_32FC1,p);//转化成一维

Mat T3_Out(Red_Mat.rows*Red_Mat.cols,1,CV_32FC1,0);//设定输出矩阵
// cout<<"T3_Out: "<<T3_Out<<endl;
/*小数据测试*/
float T1[3]={255,0,0},T2[3]={0,0,255};
Mat T1_M(1,3,CV_32FC1,T1);
Mat T2_M(1,3,CV_32FC1,T2);
cout<<"T1: "<<SVM.predict(T1_M)<<endl;
cout<<"T2: "<<SVM.predict(T2_M)<<endl;
cout<<"rows:"<<T3_M.rows<<endl;

/*设定的图像进行测试*/
SVM.predict(T3_M,T3_Out);//进行输出预测,也就是进行数据分类
uchar *p_out=T3_Out.data;
Mat Out_Image(Red_Mat.rows,Red_Mat.cols,CV_32FC1,p_out);//转换成MAT格式进行输出
namedWindow("Out_Image",CV_WINDOW_AUTOSIZE);
imshow("Out_Image",Out_Image);
//  cout<<"T3: "<<Out_Image<<endl;
SVM.save("Red.xml");
waitKey(0);

}</span>
但是这仅仅是能够对特殊的颜色分类,只是一个简单的尝试,后面怎么训练还需要技巧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: