2013-06-01 17 views
6

私は陽性とJPG形式のネガ画像の別のフォルダを持っている、と私はイメージが、私は次のことをやったが、私はエラーを受け取ることに基づいてSVMを訓練したい:私イメージセットに基づいてopencvで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) 

私はSVM、任意のアイデアを訓練することはできませんか?ありがとう

+0

私はすでに得segmetsに基づいて、プレートを分類しようとしている、私のコードは、この例に基づいています。https:// githubの.com/MasteringOpenCV/code/blob/master/Chapter5_NumberPlateRecognition/trainSVM.cpp –

+0

CV_64Fを試しましたか?そして、CvSVMに渡される直前の 'trainingData'のタイプが何であるかを確かめてみましたか? – morynicz

+0

ありがとう@morynicz、 'CvType.typeToString(trainingData.type())'は "CV_32FC3"を返します..同じエラーでCV_64Fに変換しようとしました –

答えて

11

あなたは画像を再形成し、SVMを訓練するためにそれを使用して何をしているか知っていると仮定すると、この最も可能性の高い原因は、あなたの

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

が行列imgを生成し、実際に画像を読み取りに失敗したということです最終的にはOpenCVのコードに次のトリガとなるヌルdata性で:

// 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は、(有効なマトリックスである)よりもむしろ第二の障害の最初の条件に失敗します条件(CV_32FC1タイプ)。

さらに、変形オブジェクトは*thisオブジェクトで機能しますが、フィルタのように動作し、その効果は永続的ではありません。それがただちに使用されたり、別の変数に代入されたりせずに単一のステートメントで使用された場合、それは役に立たなくなります。あなたのコードに以下の行を変更します。

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

へ:

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

エラーと同じように、整数型(おそらくCV_8U)から浮動小数点型(CV_32FまたはCV_64F)に、行列の型を変更する必要があります。それを行うにはcv::Mat::convertTo()を使用できます。 Hereは、深度と種類の行列に関するビットです。

+0

実際に私は: 'trainingData.convertTo(trainingData、CvType.CV_32FC1); '私の「クラス」には[1] CV_32FC1個の行列が設定されています –

+0

申し訳ありませんが、それを見ていない。 – morynicz

関連する問題