【问题标题】:SVM for Image feature classification using OpenCv使用 OpenCv 进行图像特征分类的 SVM
【发布时间】:2012-04-19 22:15:07
【问题描述】:

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


    【解决方案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-03-13
      • 2012-06-05
      • 2016-09-13
      • 2014-05-12
      • 2016-08-09
      • 2016-05-15
      • 2015-01-06
      • 2018-07-06
      • 2016-09-02
      相关资源
      最近更新 更多