与在OpenCV Android中使用SVM的预测函数相关的错误

时间:2018-04-20 05:02:32

标签: java android opencv svm

我正在尝试使用OpenCV的Android SDK在Android中使用SVM。除了predict()函数之外,一切似乎都能正常工作。

我收到以下错误:

svm CvException错误:函数virtual samples.cols == var_count && samples.type() == CV_32F中的(-215)float cv::ml::SVMImpl::predict(cv::InputArray, cv::OutputArray, int) const]

我确信尺寸和类型是正确的,但我有一种感觉,我忽略了一些简单的东西。以下是我的代码与相关代码的描述。

我有60个培训示例,每个示例包含150个功能。所有示例和标签都位于维度为60x151的2D浮点数组中,称为dataset_2Darr。对于这三个类,最右边的列的标签存储为-1,0,+。

我首先将60x150子矩阵放在Mat对象X中。 然后,我将标签放在60x1 Mat对象Y中。

X是浮点数 - CV_ 32FC1

Y是int - CV_32SC1

相关代码在整个程序的3个部分中执行。以下是三个部分:

第1部分:MainActivity.java:

之上的全局变量
static int M = 60;   // Rows - examples
static int N = 150;  // Cols - features
public static Mat X;   // Data
public static Mat Y;   // Labels

// Instantiate SVM object globally
static SVM classifier = SVM.create();

第2部分:内部OnCreate():

// SVM Stuff:
classifier.setKernel(SVM.LINEAR);
classifier.setType(SVM.C_SVC);
classifier.setGamma(0.5);
classifier.setNu(0.5);
classifier.setC(1);
//classifier.setTermCriteria(criteria);

// Dataset stuff:
Y = new Mat(new Size(1,M),CvType.CV_32SC1); // Integer {-1, 0, +1}
int Y_rows = Y.rows(); // 60
int Y_cols = Y.cols(); // 1

X = new Mat(new Size(N,M),CvType.CV_32FC1); // Float
int X_rows = X.rows(); // 60
int X_cols = X.cols(); // 150

第3部分:执行代码的内部方法:

for (int i=0; i < 60; i++) {
    for(int j=0; j < 150; j++) {
        X.put(i, j, dataset_2Darr[i][j]); // Copy 2D array into mat object
    }
}

// Iterate down rows of right-most column
for (int i = 0; i < 60; ++i)
    Y.put(i,0, (int)dataset_2Darr[i][150]); // Copy right most column into label array

// Train the model using X and Y
classifier.train(X, Ml.ROW_SAMPLE, Y);

// Create 1x150 feature vector to test:
Mat x = new Mat(new Size(150, 1),CvType.CV_32FC1); // Float
int x_rows = x.rows(); // 1
int x_cols = x.cols(); // 150

// Place dummy values inside matrix x
for (int i = 0; i < 150; i++) {
    x.put(0, i, 0.2f);
}

//Mat outMat = new Mat();
//float response = classifier.predict(x, outMat, 0);
float prediction = classifier.predict(x);

1 个答案:

答案 0 :(得分:0)

我最近遇到了同样的问题。测试数据的形状和类型很好,但是SVM模型无法以某种方式与测试数据一起使用。 解决方案是您需要确保测试数据的尺寸与训练数据的尺寸相同。 请注意,[1,2,3]的尺寸为1,[[1,2,3]]的尺寸为2。