使用OpenCv进行图像特征分类的SVM [英] SVM for Image feature classification using OpenCv

查看:505
本文介绍了使用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);

}

解决方案

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;
}

我假设您可以从特征描述符/向量中提取数值,并将其放入上述代码的样本矩阵中.您可以使用任何正在使用的特征描述符来替换特征向量.

my project scope is currency note identification by comparing the sample images feature set.There, i have completed the feature extraction part of the sample images. Further i need to store the sample images features in the text file or XML file and the classification of them. please help me to do the image classification part by using SVM classifier on the OpenCv

this is the feature extraction code that i have completed.

int main( intargc, char** argv ) { /Loading the image as gray scale/

//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);

}

解决方案

SVM in OpenCV is implemented in CvSVM class;

You need to have feature vector in form of a Matrix (row wise).

Assuming you are using height, width as your feature vector, your mat will be as follows (assuming you have 20 feature vectors):

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;
}

I'm assuming you can extract numerical values from the feature descriptors/vectors and put them in the sample matrix in above code. You can replace the feature vectors with any feature descriptor that you are using.

这篇关于使用OpenCv进行图像特征分类的SVM的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆