我试图让超平面与SVM相关联。为简单起见,我们假设使用example in OpenCV's page。
在这里,他们正在构建一个"图像"以下列方式使用一组样本输出:
// 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 :(得分: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的线方程。