2016-07-13 13 views
0
#include <opencv2/core.hpp> 
#include <opencv2/imgproc.hpp> 
#include "opencv2/imgcodecs.hpp" 
#include <opencv2/highgui.hpp> 
#include <opencv2/ml.hpp> 
using namespace cv; 
using namespace cv::ml; 
using namespace std; 

int main() 
{ 
Mat img_mat = imread("/home/buddhika/workspace/project/images/t.jpg"); 

// Load images in the C++ format 
Size size(64,124);//the image size,e.g.64x124 
resize(img_mat ,img_mat ,size);//resize image 

int num_files = 1;//number of images 
int img_area = 64*124;//imag size 
//initialize the training matrix 
//The number of rows in the matrix would be 5, and the number of columns would be the area of the image, 64*124 = 12 
Mat training_mat(num_files,img_area,CV_32FC1); 
// "fill in" the rows of training_mat with the data from each image. 
cvtColor(img_mat,img_mat, CV_RGB2GRAY); 
imshow("",img_mat); 

int ii = 0; // Current column in training_mat 
//Do this for every training image 
int file_num=0; 
for (int i = 0; i<img_mat.rows; i++) { 
    for (int j = 0; j < img_mat.cols; j++) { 
     training_mat.at<float>(file_num,ii++) = img_mat.at<uchar>(i,j); 
    } 
} 

// training matrix set up properly to pass into the SVM functions 
//set up labels for each training image 
//1D matrix, where each element in the 1D matrix corresponds to each row in the 2D matrix. 
//-1 for non-human and 1 for human 
//labels matrix 
float label = 1.0; 
cout << training_mat.rows<< endl; 
cout << training_mat.cols<< endl; 
Mat labels(1,7936 , CV_32SC1, label); 

// Set up SVM's parameters 
    Ptr<SVM> svmOld = SVM::create(); 
    svmOld->setType(SVM::C_SVC); 
    svmOld->setKernel(SVM::LINEAR); 
    // svmOld->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6)); 

    //train it based on your data 

    svmOld->train(training_mat, ROW_SAMPLE, labels); 
    //same svm 
    svmOld->save("positive.xml"); 


    //Initialize SVM object 
    Ptr<SVM> svmNew = SVM::create(); 
    //Load Previously saved SVM from XML 
    //can save the trained SVM so you don't have to retrain it every time 
    svmNew = SVM::load<SVM>("positive.xml"); 

//To test your images using the trained SVM, simply read an image, convert it to a 1D matrix, and pass that in to svm 
// td.predict(training_mat);//It will return a value based on what you set as your labels 

waitKey(0); 
return(0); 
} 

これはSVMを使用した陽性データ列に使用したコードです。しかし、SVMとopencvを使用した画像列3

svmOld->train(training_mat, ROW_SAMPLE, labels); 

コードがクラッシュし、以下のエラーが発生します。私はこれからどのように克服するのですか?

OpenCV Error: Bad argument (in the case of classification problem the responses must be categorical; either specify varType when creating TrainData, or pass integer responses) in train, file /home/buddhika/Documents/OpenCV/modules/ml/src/svm.cpp, line 1618 terminate called after throwing an instance of 'cv::Exception'

答えて

0

あなたが列にそれらを書いている間、あなたのサンプルがあなたのtraining_matの行にあることを指定しているためです。

次のようにあなたのトレーニングのマトリックスを作成したコードは次のようになります。

Mat training_mat(img_area,num_files,CV_32FC1); 
// "fill in" the rows of training_mat with the data from each image. 
cvtColor(img_mat,img_mat, CV_RGB2GRAY); 
imshow("",img_mat); 

int ii = 0; // Current column in training_mat 
//Do this for every training image 
int file_num=0; 
for (int i = 0; i<img_mat.rows; i++) { 
    for (int j = 0; j < img_mat.cols; j++) { 
     training_mat.at<float>(ii++,file_num) = img_mat.at<uchar>(i,j); 
    } 
} 

そして、あなたのlabelsがあまりにも変更する必要があります。Mat labels(training_mat.rows,1 , CV_32SC1, label);

+0

SVMファイルを生成します。それは空ですが、私はまだ上記のエラーがあります。 –

0

私は右だということを知っているか、いないいないが、私はそれを試してみたい。

質問はSVMの実装と思われます。まず、SVMのopencv実装を最初に勉強することをお勧めします。 https://docs.opencv.org/2.4/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html

私がSVMのドキュメントから理解していることは、クラスのラベルを付けてトレーニングデータセットを最初に提供する必要があることです。 提供されたトレーニングデータに基づいて、SVMをトレーニングします。また、肯定的なラベルと否定的なラベルの両方のためにそれを訓練しなければなりません。

あなたのしていることは間違っています。自分のマシンで自分のコードを実行し、デバッグをしました。このデバッグされたコードを使用します。

Mat img_mat = imread("C:\\Users\\saurabh chandra\\Desktop\\52.png"); 
Mat img_mat1 = imread("C:\\Users\\saurabh chandra\\Desktop\\53.png"); 
Size size(64, 124);     
resize(img_mat, img_mat, size); 
resize(img_mat1, img_mat1, size); 
int num_files = 2;    
int img_area = 64 * 124;  


cvtColor(img_mat, img_mat, CV_RGB2GRAY); 
cvtColor(img_mat1, img_mat1, COLOR_BGR2GRAY); 

int ii = 0; 

int file_num = 0; 
for (int i = 0; i<img_mat.rows; i++) 
{ 
for (int j = 0; j < img_mat.cols; j++) 
{ 
    training_mat.at<float>(file_num, ii++) = img_mat.at<uchar>(i, j); 
} 

} 

ii = 0; 
file_num =file_num+1; 

for (int i = 0; i<img_mat.rows; i++) 
    { 
    for (int j = 0; j < img_mat.cols; j++) 
    { 
     training_mat.at<float>(file_num, ii++) = img_mat.at<uchar>(i, j); 
    } 
    } 


float label[2] = { 1.0,1.0 }; 
cout << training_mat.rows << endl; 
cout << training_mat.cols << endl; 
Mat labels(2, 1, CV_32SC1, label); 

Ptr<SVM> svmOld = SVM::create(); 
svmOld->setType(SVM::C_SVC); 
svmOld->setKernel(SVM::LINEAR); 
svmOld->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6)); 

svmOld->train(training_mat, ROW_SAMPLE, labels); 
svmOld->save("positive.xml"); 

waitKey(0); 
return 0; 
} 

このコードは、SVMトレーニングの結果をPositive.xmlファイルに保存しています。私は2つの画像のコードを実装していました。 しかし、良い結果を得るためには、大規模なトレーニングデータを使用することをお勧めします。

SVMの実装については、ここで確認できます。

using OpenCV and SVM with images

このヘルプは、私に知らせてください。

関連する問題