2013-06-01 8 views
6

मैं सकारात्मक के एक फ़ोल्डर और JPG प्रारूप में नकारात्मक छवियों का एक और है, और मुझे के आधार पर एक SVM प्रशिक्षित करने के लिए है कि छवियों, मैं निम्नलिखित किया है चाहता हूँ, लेकिन मैं एक त्रुटि प्राप्त:छवियों के एक सेट के आधार पर ओपनसीवी के साथ एक एसवीएम को प्रशिक्षित करने के लिए कैसे?

Mat classes = new Mat(); 
Mat trainingData = new Mat(); 

Mat trainingImages = new Mat(); 
Mat trainingLabels = new Mat(); 

CvSVM clasificador; 

for (File file : new File(path + "positives/").listFiles()) { 
     Mat img = Highgui.imread(file.getAbsolutePath()); 
     img.reshape(1, 1); 

     trainingImages.push_back(img); 
     trainingLabels.push_back(Mat.ones(new Size(1, 1), CvType.CV_32FC1)); 
    } 

    for (File file : new File(path + "negatives/").listFiles()) { 
     Mat img = Highgui.imread(file.getAbsolutePath()); 
     img.reshape(1, 1); 

     trainingImages.push_back(img); 
     trainingLabels.push_back(Mat.zeros(new Size(1, 1), CvType.CV_32FC1)); 
    } 

    trainingImages.copyTo(trainingData); 
    trainingData.convertTo(trainingData, CvType.CV_32FC1); 
    trainingLabels.copyTo(classes); 

    CvSVMParams params = new CvSVMParams(); 
    params.set_kernel_type(CvSVM.LINEAR); 

    clasificador = new CvSVM(trainingData, classes, new Mat(), new Mat(), params); 

जब मैं चलाने के लिए प्रयास करें:

OpenCV Error: Bad argument (train data must be floating-point matrix) in cvCheckTrainData, file ..\..\..\src\opencv\modules\ml\src\inner_functions.cpp, line 857 
Exception in thread "main" CvException [org.opencv.core.CvException: ..\..\..\src\opencv\modules\ml\src\inner_functions.cpp:857: error: (-5) train data must be floating-point matrix in function cvCheckTrainData 
] 
    at org.opencv.ml.CvSVM.CvSVM_1(Native Method) 
    at org.opencv.ml.CvSVM.<init>(CvSVM.java:80) 

मैं एसवीएम को किसी भी विचार को प्रशिक्षित करने का प्रबंधन नहीं कर सकता? धन्यवाद

+0

मैं segmets मैं पहले से ही प्राप्त के आधार पर प्लेटें वर्गीकृत करने के लिए कोशिश कर रहा हूँ, मेरे कोड इस उदाहरण पर आधारित है: https: // GitHub .com/masteringOpenCV/code/blob/master/Chapter5_NumberPlateRognognition/trainSVM.cpp –

+0

क्या आपने CV_64F का उपयोग करने का प्रयास किया था? और क्या आपने पूरी तरह से सुनिश्चित किया है, सीवीएसवीएम में पारित होने से ठीक पहले 'प्रशिक्षण डेटा' का प्रकार क्या है? – morynicz

+0

धन्यवाद @ morynicz, 'CvType.typeToString (trainingData.type())' सीवी_32 एफसी 3 "वापस आ जाएगा .. उसी त्रुटि के साथ सीवी_64 एफ में कनवर्ट करने की भी कोशिश की गई है –

उत्तर

11

मान लिया जाये कि आप जानते हैं कि आप एक छवि देगी और इसे का उपयोग SVM प्रशिक्षित करने के लिए से क्या कर रहे हैं, इस का सबसे संभावित कारण है कि अपने

Mat img = Highgui.imread(file.getAbsolutePath()); 

वास्तव में एक छवि को पढ़ने के लिए विफल रहता है, एक मैट्रिक्स img उत्पन्न कर रहा है

// check parameter types and sizes 
if(!CV_IS_MAT(train_data) || CV_MAT_TYPE(train_data->type) != CV_32FC1) 
    CV_ERROR(CV_StsBadArg, "train data must be floating-point matrix"); 

मूल रूप से train_data पहली शर्त (एक वैध मैट्रिक्स जा रहा है) में विफल रहता है के बजाय दूसरे में नाकाम रहने के: अशक्त data संपत्ति के साथ है, जो अंततः OpenCV कोड में निम्नलिखित को गति प्रदान करेगा हालत (प्रकार सीवी_32 एफसी 1)।

इसके अलावा, भले ही *this ऑब्जेक्ट पर रीशेप काम करता है, यह फ़िल्टर की तरह कार्य करता है और इसका प्रभाव स्थायी नहीं है। यदि इसका उपयोग बिना किसी कथन में किया जाता है या तुरंत किसी अन्य चर के लिए असाइन किया जाता है तो यह बेकार होगा। अपने कोड में निम्नलिखित लाइनों बदलें:

img.reshape(1, 1); 
trainingImages.push_back(img); 

रहे हैं:

trainingImages.push_back(img.reshape(1, 1)); 
0

जैसे ही त्रुटि कहती है, आपको पूर्णांक प्रकार, संभवतः सीवी_8 यू से फ्लोटिंग पॉइंट वन, सीवी_32 एफ या सीवी_64 एफ में अपने मैट्रिक्स के प्रकार को बदलने की जरूरत है। ऐसा करने के लिए आप cv::Mat::convertTo() का उपयोग कर सकते हैं। Here गहराई और matrices के प्रकार के बारे में थोड़ा सा है।

+0

वास्तव में मैं करता हूं: 'trainingData.convertTo (trainingData, CvType.CV_32FC1); ' और मेरी 'कक्षाएं' [1] सीवी_32 एफसी 1 मैट्रिक्स –

+0

ओप्स के साथ आबादी में है। क्षमा करें, वह नहीं देखा। – morynicz

संबंधित मुद्दे

 संबंधित मुद्दे