OpenCV 垫错误上的 SVM(训练数据必须是浮点矩阵)

SVM on OpenCV Mat Error (train data must be floating-point matrix)

本文关键字:数据 错误 SVM OpenCV      更新时间:2023-10-16

我正在尝试使用OpenCV和SVM进行训练。但是我有一个问题,正是这个错误:

 OpenCV Error: Bad argument (train data must be floating-point matrix) in cvCheckTrainData

必须在图像数据集中进行训练,其中每个图像都有 68 个点 (X,Y),我用来执行 SVM。

一开始这是我的代码:

//for each image
fin_land.open(str_app); assert(fin_land);
for (int i=(0+(68*count_FOR)); i<(num_landCKplus+(68*count_FOR)); i++) {
    fin_land >> f1;
    fin_land >> f2;
    int data[2] = {(int)f1, (int)f2};
    Mat actual(1, 2, CV_32FC1, &data);
    trainData.push_back(actual);
}
// SVM
CvSVMParams params;
params.svm_type    = CvSVM::NU_SVC;
params.kernel_type = CvSVM::POLY;     
trainData = trainData.reshape(1, #numImage);
SVM.train(trainData, trainLabels, Mat(), Mat(), params);

这段代码的问题在于,我想使用 Mat 进行 68 行和 2 列的测试,因为我的 SVM 中的每个培训课程都有 2 列,但我收到了此错误:

OpenCV Error: Incorrect size of input array (Input sample must be 1-dimensional vector) in cvPreparePredictData

如果我理解正确,问题是测试垫的维度只需要一个维度。所以,我想像这样修改我的代码:

//for each image
fin_land.open(str_app); assert(fin_land);
for (int i=(0+(68*count_FOR)); i<(num_landCKplus+(68*count_FOR)); i++) {
    fin_land >> f1;
    fin_land >> f1;
    int data = (int)f1;
    trainData.push_back(&data);
    data = (int)f2;
    trainData.push_back(&data);
}

现在每个培训课程只有一列,所以即使是测试垫,但我有一个新的错误,它说:

 OpenCV Error: Bad argument (train data must be floating-point matrix) in cvCheckTrainData

问题是训练集的新垫的类型是错误的?我不知道如何解决它...

  • 您需要浮点数据(和整数标签)
  • 每个要素 1 行,每行 1 个标注。

float f1,f2;
for (int i=(0+(68*count_FOR)); i<(num_landCKplus+(68*count_FOR)); i++) {
    fin_land >> f1;
    fin_land >> f1;
    trainData.push_back(f1); // pushing the 1st thing will determine the type of trainData
    trainData.push_back(f2);
}
trainData = trainData.reshape(1, numItems);
SVM.train(trainData, trainLabels, Mat(), Mat(), params);