2017-05-31 58 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