如何在 OpenCV SVM 中获取分离超平面?
How to get the separating hyperplane in OpenCV SVM?
我正在尝试获取与 SVM 关联的超平面。为了简单起见,让我们假设 example in OpenCV's page.
在这里,他们通过以下方式使用样本输出集合构建 "image":
// 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 进行进一步处理?
您可以使用 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 的线方程。
我正在尝试获取与 SVM 关联的超平面。为了简单起见,让我们假设 example in OpenCV's page.
在这里,他们通过以下方式使用样本输出集合构建 "image":
// 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 进行进一步处理?
您可以使用 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 的线方程。