用OpenCVSharp 4.5 跑一遍 OpenCV 官方教程
原OpenCV官方教程链接:OpenCV: Introduction to Support Vector Machines
核心函数:
- OpenCVSharp.ml.svm.Train()
- OpenCVSharp.ml.svm.Predict()
using System;
using OpenCvSharp;
using OpenCvSharp.ML;
namespace ConsoleApp1
{
class tutorial40 : ITutorial
{
public void Run()
{
// Set up training data
int[] labels = { 1, -1, -1, -1 };
float[,] trainingData = { { 501, 10 }, { 255, 10 }, { 501, 255 }, { 10, 501 } };
Mat trainingDataMat = new Mat(4, 2, MatType.CV_32F, trainingData);
Mat labelsMat = new Mat(4, 1, MatType.CV_32SC1, labels);
// Train the SVM
SVM svm = SVM.Create();
svm.Type = SVM.Types.CSvc;
svm.KernelType = SVM.KernelTypes.Linear;
svm.TermCriteria = new TermCriteria(CriteriaTypes.MaxIter, 100, 1e-6);
svm.Train(trainingDataMat, SampleTypes.RowSample, labelsMat);
// Data for visual representation
int width = 512, height = 512;
Mat image = Mat.Zeros(height, width, MatType.CV_8UC3);
// Show the decision regions given by the SVM
Vec3b green = new Vec3b(0, 255, 0), blue = new Vec3b(255, 0, 0);
for (int i = 0; i < image.Rows; i++)
{
for (int j = 0; j < image.Cols; j++)
{
Mat sampleMat = new Mat(1, 2, MatType.CV_32F, new float[] { 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;
}
}
// Show the training data
int thickness = -1;
Cv2.Circle(image, new Point(501, 10), 5, new Scalar(0, 0, 0), thickness);
Cv2.Circle(image, new Point(255, 10), 5, new Scalar(255, 255, 255), thickness);
Cv2.Circle(image, new Point(501, 255), 5, new Scalar(255, 255, 255), thickness);
Cv2.Circle(image, new Point(10, 501), 5, new Scalar(255, 255, 255), thickness);
// Show support vectors
thickness = 2;
Mat sv = svm.GetSupportVectors();
for (int i = 0; i < sv.Rows; i++)
{
Point2f v = sv.At<Point2f>(i);
Cv2.Circle(image, new Point((int)v.X, (int)v.Y), 6, new Scalar(128, 128, 128), thickness);
}
Cv2.ImWrite("result.png", image); // save the image
Cv2.ImShow("SVM Simple Example", image); // show it to the user
Cv2.WaitKey();
return;
}
}
}