使用OpenCv进行图像特征分类的SVM

时间:2012-04-06 08:34:25

标签: opencv svm

我的项目范围是通过比较样本图像特征集来识别纸币。我已经完成了样本图像的特征提取部分。此外,我需要将示例图像功能存储在文本文件或XML文件中以及它们的分类中。 请帮我在OpenCv上使用SVM分类器进行图像分类部分

这是我已完成的功能提取代码。

int main(intargc,char ** argv) { / 将图像加载为灰度 /

//declaring Mat object.This will holds an image(like iplimage in old opencv versions). 

Mat gray_scale_img; 


//imread is used to load an image. in here i have load the image as a grayscale image.

gray_scale_img=imread("100.jpg",CV_LOAD_IMAGE_GRAYSCALE);  


/*surf detector settings*/

//setting the threshold value.high value will result low number of keypoints.
int hessian=100;

//initializing the surf keypoint detector
SurfFeatureDetectordetector(hessian);


/*detect surf key points*/


//creating vector to store detected keypoints
std::vector<KeyPoint>keypoints;

//detect keypoints
detector.detect(gray_scale_img,keypoints);


/*extract descriptor vectors/feature vectors from each and every keypoints */

SurfDescriptorExtractor extractor;


//this mat object will goinf to hold the extracted descriptors.
Mat descriptors; 

//extracting descriptors/features
extractor.compute(gray_scale_img,keypoints,descriptors);

}

1 个答案:

答案 0 :(得分:1)

OpenCV中的SVM在CvSVM类中实现;

你需要以矩阵的形式出现特征向量(行式)。

假设您使用高度,宽度作为特征向量,您的垫子将如下(假设您有20个特征向量):

Mat FV(20,2, CV_32F);
Mat flagmat(20,1,CV_8U);

/*
code to populate the matrix FV. 

Fill the matrix with values so that it will look something as follows:

20 30
30 40
..
..
code to populate the matrix flagmat.
Fill the matrix with labels of each corresponding feature vector in matrix FV. It will look something as follows:
1
-1
1
1
-1
1
1
1
..
*/

CvSVM svm;

svm.train(datamat, flagmat,Mat(),Mat(),CvSVMParams());

Mat testFV(20,2,CV_32F);
Mat sample(1,2,CV_32F);

/* similarly as described above fill testFV matrix*/
float res;// to store result
for(int i =0;i<testFV.rows;i++)
{

    sample.at<float>(0,0)=testFV.at<float>(i,0);
    sample.at<float>(0,1)=testFV.at<float>(i,1);
    float res = svm.predict(sample);
    cout<<"predicted label: "<<res<<endl;
}

我假设你可以从特征描述符/向量中提取数值,并将它们放在上面代码中的样本矩阵中。您可以使用您正在使用的任何要素描述符替换要素向量。