0

我的项目范围是通过比较样本图像特征集来识别纸币。在那里,我已经完成了样本图像的特征提取部分。此外,我需要将示例图像特征存储在文本文件或 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);

}

4

1 回答 1

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

我假设您可以从特征描述符/向量中提取数值并将它们放入上述代码的示例矩阵中。您可以将特征向量替换为您正在使用的任何特征描述符。

于 2012-04-07T21:05:31.340 回答