2017-05-31 27 views
0

我想在OpenCV中使用SVM对坐标集进行分类。 例如, 标签1对于{70,80},{94,90},{70,85} 标签-1 {98,89},{99,94},{91,87}如何在2通道Mat中使用OpenCV中的SVM?

在OpenCV提供的例子中,只有一个坐标数据是用于一个节点的 。但是,我想使用坐标集作为 一个节点。我试过用CV_32FC2垫测试。 但是,我认为它不能用于SVM的训练。发生错误。 有人知道如何在这种情况下使用SVM?

int record[3][3][2] = { 
    { 
     { 70, 80 }, 
     { 94, 90 }, 
     { 70, 85 } 
    }, 
    { 
     { 83, 90 }, 
     { 95, 60 }, 
     { 90, 82 } 
    }, 
    { 
     { 98, 89 }, // 3반 학생1의 성적 
     { 99, 94 }, // 3반 학생2의 성적 
     { 91, 87 } // 3반 학생3의 성적 
    } 
}; 

int labels[3] = { 1, -1, -1 }; 
Mat trainingDataMat(3, 3, CV_32FC2, record); 
Mat labelsMat(3, 1, CV_32SC1, labels); 


Ptr<SVM> svm = SVM::create(); 
svm->setType(SVM::C_SVC); 
svm->setKernel(SVM::LINEAR); 
svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6)); 
//! [init] 
//! [train] 
svm->train(trainingDataMat, ROW_SAMPLE, labelsMat); 

回答

0

为什么选择trainingDataMat的大小为3x3?

查看本教程代码,它使用2D点作为训练数据。

http://docs.opencv.org/2.4/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html

正如你所看到的,他们只使用2 colums:如果你想使用整数,而不是浮点数

// Set up training data 
float labels[4] = {1.0, -1.0, -1.0, -1.0}; 
Mat labelsMat(4, 1, CV_32FC1, labels); 

float trainingData[4][2] = { {501, 10}, {255, 10}, {501, 255}, {10, 501} }; 
Mat trainingDataMat(4, 2, CV_32FC1, trainingData); 

,你必须调整类型。

+0

我已经理解了你所说的教程代码。它只考虑节点通过x,y坐标的位置。不过,我想考虑点之间的关系。就像在各种数字中找到具体人物一样。所以我需要使用一组坐标作为对象。 –

+0

类似于一袋字吗?对不起,没有经验,我猜行数必须是2的倍数呢? – Micka

+0

cols,.I表示cols的数量应该是2的倍数,每个对象的特征数量必须是固定的? – Micka