opencv one-class SVM 训练和预测问题
我编写了一个单类支持向量机的测试代码,但是无法预测(源码如下),求大神指点一下,非常感谢!
[code=c][code=c]
#include<iostream>
#include<fstream>
#include<string>
#include <sys/time.h>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include<opencv2/ml/ml.hpp>
#include "opencv2/objdetect/objdetect.hpp"
#include <opencv2/contrib/contrib.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
#define WIDTH 100
#define HEIGHT 120
float featureVec[400];
int totalSampleCount = 4000;
int featureNum = 0;
int main()
{
//int totalSampleCount = 1000;
CvMat *sampleFeatureMat = cvCreateMat(totalSampleCount,3, CV_32FC1); //训练样本total个
cvSetZero(sampleFeatureMat);
//CvMat *sampleLabelMat = cvCreateMat(totalSampleCount, 1, CV_32FC1); //样本标签
//CvMat sampleLabelMat;
//cvSetZero(&sampleLabelMat);
float res[totalSampleCount];
for(int i = 0; i < totalSampleCount; i++){
res[i] = 1;
cout<<res[i];
}
cout<<endl;
int svm_num;
const float *support;
Vec3b blue(255, 0, 0), green(0, 255, 0), red(0, 0, 255);
Mat images(HEIGHT, WIDTH, CV_8UC3);
for(int i = 0; i < HEIGHT; i++)
for(int j = 0; j < WIDTH; j++)
{
switch(i/40){
case 0: images.at<Vec3b>(i, j) = blue; break;
case 1: images.at<Vec3b>(i, j) = green; break;
case 2: images.at<Vec3b>(i, j) = red; break;
}
}
//labels
Mat images2;
images.convertTo(images2, CV_32FC3, 1/255.0);
int contNum = 0;
float *tempBlue = (float*)images2.data;
cout<<"Train data: "<<endl;
for(int i = 0; i < totalSampleCount; ++i)
{
for(int j = 0; j < 3; ++j){
cvmSet(sampleFeatureMat, i, j, *tempBlue);
//cout<<"--"<<*tempBlue;
tempBlue++;
//contNum++;
//cout<<*(sampleFeatureMat->data.fl + j + i)<<" ";
}
//cout<<endl;
//cvmSet(sampleLabelMat, i, 0, 1.0);
}
CvMat sampleLabelMat = cvMat(totalSampleCount, 1, CV_32FC1, res);;
/*CvSVMParams params;
params.svm_type = CvSVM::ONE_CLASS;
params.kernel_type = CvSVM::RBF;
params.nu = 0.12; // changing from 0 - 1 with same effect
params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);*/
CvTermCriteria criteria;
CvSVMParams params;
criteria = cvTermCriteria(CV_TERMCRIT_EPS, 1000, FLT_EPSILON);
params = CvSVMParams(CvSVM::ONE_CLASS, CvSVM::RBF, 10.0 , 8.0 , 1.0, 10.0, 0.5, 0.1,NULL,criteria);
CvSVM SVM;
SVM.train(sampleFeatureMat, &sampleLabelMat, NULL, NULL, params);
svm_num = SVM.get_support_vector_count();
//cout<<"svm_num"<<svm_num<<endl;
SVM.save("SVM_Test_Model.txt");
float aaa[3] = {1.0, 0.0, 0.0};
CvMat testMat = cvMat(1, 3, CV_32FC1, aaa);
//cvInitMatHeader(&testMat, 1, 3 ,CV_32FC1, aaa);
cout<<"SVM.predict:"<< SVM.predict(&testMat)<<endl;
Mat testImages(HEIGHT, WIDTH, CV_8UC3);
for(int i = 0; i < HEIGHT; i++)
for(int j = 0; j < WIDTH; j++)
{
switch(i/40){
case 0: testImages.at<Vec3b>(i, j) = red; break;
case 1: testImages.at<Vec3b>(i, j) = green; break;
case 2: testImages.at<Vec3b>(i, j) = blue; break;
}
}
Vec3b white(255, 255, 255);
testImages.convertTo(testImages, CV_32FC3, 1/255.0);
float *iter = (float*)testImages.data;
CvMat* SVMtestMat = cvCreateMat(1, 3, CV_32FC1);
for (int i = 0; i < HEIGHT; i++)
for(int j = 0; j < WIDTH; j++){
for(int k = 0; k < 3; k++){
cvmSet(SVMtestMat, 0, k, *iter);
// cout<<""<<*iter;
iter++;
}
// cout<<"!!";
// cout<<"TestMat: "<<SVMtestMat<<endl;
float response = SVM.predict(SVMtestMat);
//cout<<" response="<<response;
if(1 == response){
testImages.at<Vec3b>(i,j) = white;
}
}
imshow("test image", testImages);
imshow("SRC",images);
while(27 != waitKey(0));
return 0;
}