کلاسیفیر svm ویژگی ها را به عنوان ورودی از شما دریافت کرده و سپس lable مربوط به هر کلاس یا به عبارت دیگر جواب مطلوب چون svm با ناظر هستش.در نهایت تعیین نوع کلاسیفیر و تنظیمات بهینه سازی.
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/ml/ml.hpp>
using namespace cv;
void testSVM(){
// Data for visual representation
int width = 512, height = 512;
Mat view_img = Mat::zeros(height, width, CV_8UC3);
// تنظیم برچسب ها
float labels[4] = { 1.0, -1.0, -1.0, -1.0 };
Mat labels_mat(4, 1, CV_32FC1, labels);
// تنظیم ویژگی های ورودی که در این مثال مختصات است
float training_data[4][2] = { { 501, 10 }, { 255, 10 }, { 501, 255 }, { 10, 501 } };
Mat training_data_mat(4, 2, CV_32FC1, training_data);
// تنظیم پارامترهای کلاسیفیر نوع کلاسیفیر و پارامترهای تکرار برای بهینه سازی را مشخص می کنیم
CvSVMParams params;
params.svm_type = CvSVM::C_SVC;
params.kernel_type = CvSVM::LINEAR;
params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);
// آموزش
CvSVM SVM;
SVM.train(training_data_mat, labels_mat, Mat(), Mat(), params);
Vec3b green(0, 255, 0), blue(255, 0, 0);
// نمایش ناحیه مربوط به هر کلاس از طریق تست کل ناحیه
for (int i = 0; i < view_img.rows; ++i)
for (int j = 0; j < view_img.cols; ++j)
{
Mat sampleMat = (Mat_<float>(1, 2) << j, i);
float response = SVM.predict(sampleMat);
if (response == 1)
view_img.at<Vec3b>(i, j) = green;
else if (response == -1)
view_img.at<Vec3b>(i, j) = blue;
}
// نمایش داده های آموزش داده شده
int thickness = -1;
int lineType = 8;
circle(view_img, Point(501, 10), 5, Scalar(0, 0, 0), thickness, lineType);
circle(view_img, Point(255, 10), 5, Scalar(255, 255, 255), thickness, lineType);
circle(view_img, Point(501, 255), 5, Scalar(255, 255, 255), thickness, lineType);
circle(view_img, Point(10, 501), 5, Scalar(255, 255, 255), thickness, lineType);
imshow("view", view_img); // show it to the user
waitKey(0);
}
int main()
{
testSVM();
return 0;
}