2014-12-09 118 views
0

我正在尝试使用OpenCV和SVM进行培训。 但我有一个问题,正是这个错误:关于OpenCV Mat错误的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); 

这段代码的问题是,我想用一个垫子用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 

问题是trainingSet的新mat的类型是错误的? 我也不知道如何解决它...

回答

0
  • 需要浮点数据(整数和标签),每个功能
  • 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); 
+0

谢谢你..似乎是确定..但现在我卡住培训,不返回任何错误。我试图等待,但随着582 * 544训练矩阵这似乎很奇怪,它需要这么长时间...这可能是一个过度修复的问题? – luke88 2014-12-09 12:46:40