androidでopencv 〜svm〜

		Mat trainDataMat = Mat.ones((posAry.length+negAry.length)*posAry[0].length, 1, CvType.CV_32FC1),//ポジティブデータ行列
			labelMat = Mat.ones((posAry.length+negAry.length)*posAry[0].length, 1, CvType.CV_32FC1),//ラベル
			responseMat = Mat.ones(sample.length, sample[0].length, CvType.CV_32FC1),
			sampleMat = Mat.ones(sample.length, sample[0].length, CvType.CV_32FC1);
		int resultSVM = 0;

		//1次元配列に変換
		float [] posdata = new float[posAry.length*3+negAry.length*3];
		float [] flagdata = new float[posAry.length*3+negAry.length*3];
		int k=0;
		for(int i=0;i<posAry.length;i++)
			for(int j=0;j<3;j++) {posdata[k]=posAry[i][j];flagdata[k]=1; k++;}
		for(int i=0;i<negAry.length;i++)
			for(int j=0;j<3;j++) {posdata[k]=negAry[i][j];flagdata[k]=-1;k++;}
/*		k=0;
		float [] sampledata = new float[sample.length*3];
		for(int i=0;i<sample.length;i++)
			for(int j=0;j<3;j++) {sampledata[k]=sample[i][j]; k++;}
*/

		//行列へマッピング
		trainDataMat.put(0, 0, posdata);
		labelMat.put(0, 0, flagdata);
		System.out.print("posAry=" + trainDataMat.dump());
		System.out.print("labelAry=" + labelMat.dump());

		CvSVM classifier = new CvSVM();
		CvSVMParams params = new CvSVMParams();
		params.set_svm_type(CvSVM.C_SVC);
		params.set_kernel_type(CvSVM.LINEAR);
		//(中略)
//		classifier.train(trainDataMat, responseMat, labelMat, sampleMat, params);
		classifier.train(trainDataMat,labelMat);
		//(中略)
//		Mat resultMat = new Mat(4, 5, CvType.CV_32FC(5)),
//			predictionMat = new Mat(4, 5, CvType.CV_32FC(5));
		Mat resultMat = new Mat((posAry.length+negAry.length)*posAry[0].length, 1, CvType.CV_32FC1),
			predictionMat = new Mat((posAry.length+negAry.length)*posAry[0].length, 1, CvType.CV_32FC1);

		float result = classifier.predict(predictionMat);
		//(中略)
		double[] label = resultMat.get(N , M);

		System.out.print(result);

		//
		//分類結果をint値で返す
		//

		return resultSVM;
	}

}


resonse array must contain as many elements as the total number of samples in function cvPreprocessCategoricalResponses

→トレーニングデータの要素数と正誤ラベルデータの数が不一致だと発生


resonse array must be 1-dimensional in function cvPreprocessCategoricalResponses

SVMに使うデータのうち、一つでも多次元のデータがあると発生。使うデータは全て1次元配列に調整する。(例えば4*5のデータならば20*1に変換してから使う)


Input sample must have 32fc1 type in function cvPreparePredictData

→使用データのタイプがCV_32FC1でなければならないのに、それ以外のタイプを指定したときに発生。


the sample size is different from what has been used for training in function cvPreparePredictData

→学習データとテストデータの特徴量数が不一致だと発生。

また、サンプルデータをpredictする場合は1次元データを使わなければならない。