我的项目范围是通过比较样本图像特征集来识别纸币。我已经完成了样本图像的特征提取部分。此外,我需要将示例图像功能存储在文本文件或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);
}
答案 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;
}
我假设你可以从特征描述符/向量中提取数值,并将它们放在上面代码中的样本矩阵中。您可以使用您正在使用的任何要素描述符替换要素向量。