OpenCV 与 SVM

    xiaoxiao2021-03-25  71

    OpenCV 与 SVM


    一、SVM概述

    支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来分类及回归分析。同样地,在OpenCV中已经有相关的库函数CvSVM实现了。一如既往地,我们不详细介绍SVM的算法原理,只是简单地介绍OpenCV是如何调用SVM的。本文参考:http://blog.csdn.net/qq_15947787/article/details/51375349

    如果想要详细了解SVM的算法原理及证明过程,推荐以下参考网址:http://www.dataguru.cn/thread-371987-1-1.html 和 http://blog.csdn.net/alvine008/article/details/9097105

    二、 设置参数及初始化
    //设置参数 CvSVMParams params; params.svm_type = CvSVM::C_SVC; //n(n>2)的分类器,其中参数C是异常惩罚因子,可以进行不完全分类 //params.svm_type = CvSVM::NU_SVC; //n(n>2)类似不完全分类的分类器,参数nu(nu属于[0,1]),取代了C_SVC类型的异常惩罚因子C; //params.svm_type = CvSVM::ONE_CLASS; //单分类器,用一个分界线对特征空间进行分割。 params.kernel_type = CvSVM::LINEAR; //线性核函数,此核函数在分类是速度最快,分类将在原始空间中完成; //params.kernel_type = CvSVM::POLY; //多项式核 //params.kernel_type = CvSVM::RBF; //径向基核,对于大部分情况都是选择此类型 //params.kernel_type = CvSVM::SIGMOID; //sigmoid核函数 params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6); //SVM迭代终止条件,CV_TERMCRIT_ITER为终止条件类型,100为最大迭代次数,1e-6为结果的准确率 //训练SVM CvSVM SVM; SVM.train(trainingDataMat, labelsMat, Mat(), Mat(), params);
    三、 预测数据标签
    //数据可视化表示 int width = 512, height = 512; Mat image = Mat::zeros(height, width, CV_8UC3); Vec3b green(0,255,0), blue(255,0,0); //显示SVM划分出的决测区域 for(int i = 0; i<image.rows; i++) { for(int j=0; j<image.cols; j++) { Mat sampleMat = (Mat_<float>(1,2) << i, j); //待预测的图像 float response = SVM.predict(sampleMat); if(response == 1) image.at<Vec3b>(j,i) = green; else if(response == -1) image.at<Vec3b>(j,i) = blue; }
    四、 完整的示例代码及结果显示:
    // OpenCV SVM 支持向量机.cpp : 定义控制台应用程序的入口点。 //参考网址: http://blog.csdn.net/qq_15947787/article/details/51375349 #include "stdafx.h" #include <fstream> #include <iostream> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; #define COUNT 21 //样本点个数 int main() { //读入训练数据特征 float data[COUNT][2] = { 0 }; ifstream in1("data.txt"); for (int i = 0; i < COUNT; i++) { in1 >> data[i][0]; in1 >> data[i][1]; } in1.close(); //读入训练数据标签 float label[COUNT] = { 0 }; ifstream in2("label.txt"); for (int i = 0; i < COUNT; i++) { in2 >> label[i]; } in2.close(); Mat trainData(COUNT, 2, CV_32FC1, data); Mat trainLabel(COUNT, 1, CV_32FC1, label); CvSVM svm; CvSVMParams param; param.svm_type = CvSVM::C_SVC; //n(n>2)的分类器,其中参数C是异常惩罚因子,可以进行不完全分类 //param.svm_type = CvSVM::NU_SVC; //n(n>2)类似不完全分类的分类器,参数nu(nu属于[0,1]),取代了C_SVC类型的异常惩罚因子C; //param.svm_type = CvSVM::ONE_CLASS; //单分类器,用一个分界线对特征空间进行分割。 param.kernel_type = CvSVM::LINEAR; //线性核函数,此核函数在分类是速度最快,分类将在原始空间中完成; //param.kernel_type = CvSVM::POLY; //多项式核 //param.kernel_type = CvSVM::RBF; //径向基核,对于大部分情况都是选择此类型 //param.kernel_type = CvSVM::SIGMOID; //sigmoid核函数 param.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6); //SVM迭代终止条件,CV_TERMCRIT_ITER为终止条件类型,100为最大迭代次数,1e-6为结果的准确率 //训练SVM svm.train(trainData, trainLabel, Mat(), Mat(), param); Vec3b green(0, 255, 0), blue(255, 0, 0), red(0, 0, 255), gray(125, 125, 125); Mat image = Mat::zeros(500, 500, CV_8UC3); for (int i = 0; i < image.cols; i++) { for (int j = 0; j < image.rows; j++) { Mat sampleMat = (Mat_<float>(1, 2) << i,j); // 这里用的训练数据的第一维应该是列,第二维是行 (i,j) float response = svm.predict(sampleMat); if (response == 3) image.at<Vec3b>(j,i) = green; //所以image这里是(j,i) if (response == 2) image.at<Vec3b>(j, i) = gray; if (response == 1) image.at<Vec3b>(j, i) = blue; if (response == 0) image.at<Vec3b>(j, i) = red; } } for (int i = 0; i < COUNT; i++) { Point p(data[i][0], data[i][1]); if (label[i] == 0) circle(image, p, 3, Scalar(255, 255, 0), -1, 8); if (label[i] == 1) circle(image, p, 3, Scalar(255, 0, 255), -1, 8); if (label[i] == 2) circle(image, p, 3, Scalar(0, 255, 255), -1, 8); if (label[i] == 3) circle(image, p, 3, Scalar(0, 0, 0), -1, 8); } imshow("result", image); imwrite("output.jpg", image); waitKey(0); return 0; }

    data

    100 250 250 450 150 160 300 420 210 120 90 20 70 60 330 210 80 200 400 120 420 200 300 300 50 130 270 300 320 310 490 450 480 480 420 400 250 250 230 270 400 300

    label

    0 1 0 2 0 0 0 1 0 3 3 1 0 1 1 2 2 2 0 0 2

    图片结果:


    转载请注明原文地址: https://ju.6miu.com/read-39330.html

    最新回复(0)