C++ 如何在OpenCV-SVM中得到分离超平面?

C++ 如何在OpenCV-SVM中得到分离超平面?,c++,opencv,svm,C++,Opencv,Svm,我试图得到与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 sa

我试图得到与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;
    }
}
//显示SVM给出的决策区域
Vec3b绿色(0255,0),蓝色(255,0,0);
对于(int i=0;i
绿色和蓝色类之间的线显示为分隔超平面


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

您可以使用getSupportVector函数检索支持向量,使用getDecisionFunction函数检索决策函数的标量偏差

我假设您只需要线性支持向量机的分离边界,因为非线性情况要复杂得多

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

计算W向量的代码应如下所示(未测试):

Mat W(sv.cols,1,CV_32F,0);

对于(int r=0;rDo),您需要从图像中找到超平面坐标,或者从svm参数中找到超平面坐标?从svm参数中找到超平面坐标。感谢您的回答。我正在寻找cv::svm类的加权支持向量,我意识到在新的3.0 API中,
getSupportVectors()
给出加权支持向量本身。
    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);
        }
    }
    Point pt1(0, b/W.at<float>(1));
    Point pt2(b/W.at<float>(0));
    line(image, pt1, pt2, color);