2015-11-19 89 views
1

我正在尝试获取与SVM相关的超平面。为了简单起见,让我们假设使用example in OpenCV's page如何在OpenCV SVM中获得分离超平面?

在这里,它们被构建的“图像”以如下方式使用样品输出的集合:

// Show the decision regions given by the SVM 
Vec3b green(0,255,0), blue (255,0,0); 
for (int i = 0; i < image.rows; ++i) 
{ 
    for (int j = 0; j < image.cols; ++j) 
    { 
     Mat sampleMat = (Mat_<float>(1,2) << j,i); 
     float response = svm->predict(sampleMat); 

     if (response == 1) 
      image.at<Vec3b>(i,j) = green; 
     else if (response == -1) 
      image.at<Vec3b>(i,j) = blue; 
    } 
} 

绿色和蓝色类之间的线被示出为分离超平面。

现在,我的问题是:我如何获得这一行作为点或cv :: Mat的向量做进一步处理?

+0

您是否需要从图像中找出超平面坐标,或者从svm参数中找出数学的坐标? – Miki

+0

数学上来自SVM参数。 – scap3y

回答

2

您可以使用getSupportVector函数检索支持向量,并使用getDecisionFunction函数检索判定函数的标量偏差。

我假设你只想为线性svm分离前沿,因为非线性情况要复杂得多。

在这种情况下,分离平面由W * X + b = 0型的方程给出。 您可以轻松找到W和b参数:所有支持向量的总和给你W,而b是getDecisionFunction(0)返回的值。

的代码,以计算在W向量应该像(未测试):

Mat W(sv.cols, 1, CV_32F, 0); 
    for(int r=0; r<sv.rows; ++r) 
    { 
     for(int c=0; c<sv.cols; ++c) 
     { 
      W.at<float>(c)+=sv.at<float>(r,c); 
     } 
    } 

一旦有直线的方程,在OpenCV的示例的情况下,可以在图像上显示它,通过执行类似(再次,未经测试):

Point pt1(0, b/W.at<float>(1)); 
    Point pt2(b/W.at<float>(0)); 
    line(image, pt1, pt2, color); 

的PT1,PT2点来自线方程x = 0和y = 0的。

+0

感谢您的回答。我正在寻找cv :: SVM类的加权支持向量,并且我意识到在新的3.0 API中,'getSupportVectors()'给出了加权支持向量本身。 – scap3y