如何在2通道Mat的OpenCV中使用SVM?

时间:2017-05-31 05:10:54

标签: c++ opencv svm

我想在OpenCV中使用SVM对坐标集进行分类。 例如, 标签1代表{70,80},{94,90},{70,85} 标签-1为{98,89},{99,94},{91,87}

在OpenCV提供的示例中,只有一个坐标数据 用于一个节点。但是,我想使用坐标设置为 一个节点。我尝试使用CV_32FC2 Mat进行测试。 但是,我认为它不能用于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);

1 个答案:

答案 0 :(得分:0)

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

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

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

如您所见,他们只使用了两个列:

// 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);

如果你想使用整数而不是浮点数,你必须调整类型。