【问题标题】:Object Detection using SVM使用 SVM 进行对象检测
【发布时间】:2016-03-13 22:31:50
【问题描述】:

我是 SVM 的新手。我曾经使用 HAAR Cascading 进行对象检测。现在我正在尝试实现用于对象检测的 SVM。我在网上搜索并了解了基础知识。 我想在为 c++ 编码时使用 libsvm。我遇到了很多问题。 任何人都可以请逐步解释使用它进行对象检测的过程。 顺便说一句,我调查了opencv documentation of svm。但我无法做任何进一步的事情。

我还获得了用于训练我的 SVM 并将其保存到 xml 文件中的代码。 现在我想要一个可以获取这个 xml 并在测试用例中检测对象的代码。

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <cv.h>
#include <highgui.h>
#include <cvaux.h>
#include <iostream>
#include <vector>
#include<string.h>
using namespace std;
using namespace cv;

int main ( int argc, char** argv )
{
    cout << "OpenCV Training SVM Automatic Number Plate Recognition\n";
    cout << "\n";

    char* path_Plates;
    char* path_NoPlates;
    int numPlates;
    int numNoPlates;
    int imageWidth=150;
    int imageHeight=150;

    //Check if user specify image to process
    if(1)
    {
        numPlates= 11;
        numNoPlates= 90 ;
        path_Plates= "/home/kaushik/opencv_work/Manas6/Pics/Positive_Images/";
        path_NoPlates= "/home/kaushik/opencv_work/Manas6/Pics/Negative_Images/i";

    }else{
        cout << "Usage:\n" << argv[0] << " <num Plate Files> <num Non Plate Files> <path to plate folder files> <path to non plate files> \n";
        return 0;
    }

    Mat classes;//(numPlates+numNoPlates, 1, CV_32FC1);
    Mat trainingData;//(numPlates+numNoPlates, imageWidth*imageHeight, CV_32FC1 );

    Mat trainingImages;
    vector<int> trainingLabels;

    for(int i=1; i<= numPlates; i++)
    {

        stringstream ss(stringstream::in | stringstream::out);
        ss<<path_Plates<<i<<".jpg";
        try{

            const char* a = ss.str().c_str();
            printf("\n%s\n",a);
            Mat img = imread(ss.str(), CV_LOAD_IMAGE_UNCHANGED);
            img= img.clone().reshape(1, 1);
            //imshow("Window",img);
            //cout<<ss.str();
            trainingImages.push_back(img);
            trainingLabels.push_back(1);
        }
        catch(Exception e){;}
    }

    for(int i=0; i< numNoPlates; i++)
    {
        stringstream ss(stringstream::in | stringstream::out);
        ss << path_NoPlates<<i << ".jpg";
        try
        {
            const char* a = ss.str().c_str();
            printf("\n%s\n",a);
            Mat img=imread(ss.str(), 0);
            //imshow("Win",img);
            img= img.clone().reshape(1, 1);
            trainingImages.push_back(img);
            trainingLabels.push_back(0);
            //cout<<ss.str();
        }
        catch(Exception e){;}
    }

    Mat(trainingImages).copyTo(trainingData);
    //trainingData = trainingData.reshape(1,trainingData.rows);
    trainingData.convertTo(trainingData, CV_32FC1);
    Mat(trainingLabels).copyTo(classes);

    FileStorage fs("SVM.xml", FileStorage::WRITE);
    fs << "TrainingData" << trainingData;
    fs << "classes" << classes;
    fs.release();

    return 0;
}

任何帮助将不胜感激。

我也很想就如何实现 libsvm 进行对象检测提出建议。

【问题讨论】:

    标签: c++ opencv svm libsvm opencv3.0


    【解决方案1】:

    这是一个简单的代码,你可以用你的 xml 文件进行测试:

    #include "highgui.h"
    #include "opencv2/imgproc/imgproc.hpp"
    #include "cv.h"
    #include <vector>
    #include <string.h>
    #include <ml.h>
    #include <iostream>
    
    #include <io.h>
    using namespace cv;
    using namespace std;
    
    int main()
    {   
        FileStorage fs;
        fs.open("SVM.xml", FileStorage::READ);
        Mat trainingData;
        Mat classes;
        fs["TrainingData"] >> trainingData;
        fs["classes"] >> classes;
    
        CvSVMParams SVM_params;
        SVM_params.svm_type = CvSVM::C_SVC;
        SVM_params.kernel_type = CvSVM::LINEAR; //CvSVM::LINEAR;
        SVM_params.degree = 1;
        SVM_params.gamma = 1;
        SVM_params.coef0 = 0;
        SVM_params.C = 1;
        SVM_params.nu = 0;
        SVM_params.p = 0;
        SVM_params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 1000, 0.01);
    
        CvSVM svm(trainingData, classes, Mat(), Mat(), SVM_params);
    
    
        Mat src = imread("D:\\SVM\\samples\\\pos\\10.jpg");
        Mat gray;
        cvtColor(src, gray, CV_BGR2GRAY);
        Mat p = gray.reshape(1, 1);
        p.convertTo(p, CV_32FC1);
    
        int response = (int)svm.predict( p );
        if(response ==1 )
        {
            cout<<"this is a object!"<<endl;
            cout<<endl;
        }
        else
        {
            cout<<"no object detected!"<<endl;
            cout<<endl;
        } 
    
        return 0;
    }
    

    顺便说一句,运行您提供的代码时似乎没有什么问题,结果显示:“opencv errror,Image step is wrongin cv::Mat::reshape”。您以前遇到过这种情况吗?谢谢你。

    【讨论】:

      猜你喜欢
      • 2023-03-13
      • 1970-01-01
      • 2019-03-12
      • 1970-01-01
      • 2019-12-26
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多