【opencv】支持向量机CvSVM分类

有关于SVM的理论可以参考opencv_tutorials.pdf
译文可以参考博客:
http://blog.csdn.net/dwb1015/article/details/12841305

本文通过svm进行多类分类
源码如下:

//编程环境:VS2012 + Opencv2.4.9
#include <fstream>
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;
#define COUNT 21 //读入的点个数

int main()
{
    //从文件载入数据
    float data[COUNT][2];   
    ifstream fin1("data.txt");  
    for(int i=0;i<COUNT;i++)
    {
        fin1>>data[i][0];   
        fin1>>data[i][1];
    }
    fin1.close();   
    //显示读入的数据
    for(int i=0;i<COUNT;i++)    
    {
        cout<<data[i][0]<<" ";
        cout<<data[i][1]<<" "<<endl;
    }

    float label[COUNT][1];  
    ifstream fin2("label.txt"); 
    for(int i=0;i<COUNT;i++)
    {
        fin2>>label[i][0];  
    }
    fin2.close();   
    //显示读入的数据
    for(int i=0;i<COUNT;i++)    
    {
        cout<<label[i][0]<<" "<<endl;
    }

    Mat trainData(COUNT, 2, CV_32FC1, data);
    Mat trainLabel(COUNT, 1, CV_32FC1, label);

    cout<<"trainData"<<trainData<<endl;
    cout<<"trainLabel"<<trainLabel<<endl;

    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);

    Mat image = Mat::zeros(500, 500, CV_8UC3);  
    Vec3b green(0,255,0), blue(255,0,0), red(0,0,255),gray(125,125,125);

    for (int i = 0; i < image.cols; i++)
    {
        for (int j = 0; j < image.rows; j++)
        {
            Mat sampleMat = (Mat_<float>(1,2) << i,j); 
            float response = svm.predict(sampleMat);

            if(response == 3)
                image.at<Vec3b>(j,i) = green;
            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]==0)
            circle( image, p, 3, Scalar(255, 255, 0), -1, 8);
        if (label[i][0]==1)
            circle( image, p, 3, Scalar(255, 0, 255), -1, 8);
        if (label[i][0]==2)
            circle( image, p, 3, Scalar(0, 255, 255), -1, 8);
        if (label[i][0]==3)
            circle( image, p, 3, Scalar(0, 0, 0), -1, 8);
    }

    imshow("result",image);
    imwrite("output.jpg",image);
    waitKey(0);

    return 0;
}

label.txt:

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

data.txt:

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

结果:
这里写图片描述

CvSVM::predict
预测样本的相应数据。

C++: float CvSVM::predict(const Mat& sample, bool returnDFVal=false ) const
C++: float CvSVM::predict(const CvMat* sample, bool returnDFVal=false ) const
C++: float CvSVM::predict(const CvMat* samples, CvMat* results) const
参数
sample – 需要预测的输入样本。
samples – 需要预测的输入样本们。
returnDFVal – 指定返回值类型。如果值是true,则是一个2类分类问题,该方法返回的决策函数值是边缘的符号距离。
results – 相应的样本输出预测的响应。
这个函数用来预测一个新样本的响应数据(response)。在分类问题中,这个函数返回类别编号;在回归问题中,返回函数值。输入的样本必须与传给trainData的训练样本同样大小。如果训练中使用了varIdx参数,一定记住在predict函数中使用跟训练特征一致的特征。

所以returnDFVal 为true时,二分类得到的结果可以间接的作为相似度,绝对值越大,与训练样本越不相似

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OpenCV是一个开放源代码的图像处理库,也支持机器学习和模式识别等领域的算法。其中包括支持向量机(Support Vector Machine, SVM)算法,可以用于非线性回归任务。 支持向量机是一种常见的机器学习算法,可以用于分类和回归问题。在回归任务中,支持向量机可以用于建立非线性回归模型。 OpenCV中的支持向量机非线性回归主要基于核函数方法。核函数可以将非线性问题转化为高维空间中的线性问题,这样就可以使用线性回归模型进行建模。OpenCV提供了多种核函数供选择,如线性核函数、多项式核函数和径向基函数(Radial Basis Function, RBF)核函数等。 使用OpenCV进行支持向量机非线性回归的步骤大致如下: 1. 收集回归数据集,并根据需求进行预处理,如数据归一化。 2. 创建一个支持向量机模型对象,通过设置相关参数,如核函数型、惩罚因子等,来进行模型配置。 3. 使用训练数据集训练支持向量机模型。 4. 使用训练好的模型进行预测,得到回归结果。 5. 根据需要,可以对模型进行进一步优化、调参等。 通过OpenCV支持向量机非线性回归功能,我们可以在处理非线性回归问题时,利用支持向量机算法建立准确性较高的模型。这样可以对各种复杂的非线性数据进行准确的回归预测,并能适应不同的核函数和其它参数配置的需求。 ### 回答2: OpenCV库是一种广泛使用的开源计算机视觉和机器学习库,其中包括了支持向量机SVM)算法,可以用于非线性回归。 支持向量机是一种监督学习模型,用于分类和回归问题。在线性回归问题中,我们试图找到最佳的直线或平面来拟合数据。然而,在某些情况下,数据可能无法线性分割,这就需要使用非线性回归算法,如支持向量机OpenCV中的支持向量机实现的一个关键概念是核函数。核函数可以将数据从输入空间(原始特征空间)映射到一个更高维的特征空间,这样可以使数据在更高维度的空间中变得线性可分。OpenCV提供了多个核函数选项,如径向基函数(RBF)核、多项式核等,这些核函数可以根据问题的要求进行选择。 在使用OpenCV进行非线性回归时,我们首先需要准备训练数据和测试数据。然后,我们可以选择适当的核函数,并通过调整一些参数(如核函数的参数、惩罚因子等)来训练支持向量机模型。训练完成后,我们可以使用模型来预测新的数据样本。 总之,OpenCV库提供了支持向量机算法的实现,以解决非线性回归问题。通过选择适当的核函数和调整参数,可以构建一个准确的非线性回归模型,从而在计算机视觉和机器学习任务中提供更好的性能和结果。 ### 回答3: OpenCV是一个广泛应用于计算机视觉和图像处理领域的开源库。它不仅支持常见的图像处理功能,还包括机器学习算法。其中,OpenCV也提供了对支持向量机(Support Vector Machine,SVM)的支持,包括非线性回归。 支持向量机是一种常用的机器学习算法,旨在通过寻找最优的超平面,将数据点划分成不同的别。在线性回归中,SVM可以用于从给定的数据集中预测一个连续性的输出变量。然而,有时候数据集并不是线性可分的,这时就需要通过非线性回归来解决这个问题。 在OpenCV中,支持向量机非线性回归通过使用内核函数来实现。内核函数的作用是将训练数据从原始特征空间映射到更高维的特征空间,使得数据在新的空间中能够线性可分。常见的内核函数包括多项式函数、径向基函数和Sigmoid函数等。 使用OpenCV进行支持向量机非线性回归的步骤主要有以下几个: 1. 准备训练数据集,包括输入变量X和输出变量y。 2. 创建一个SVM对象,并设置相关参数,如内核函数和惩罚参数等。 3. 调用SVM对象的训练方法,输入训练数据集,训练出一个SVM模型。 4. 对新的输入数据进行预测,可以使用SVM对象的predict方法,得到相应的输出结果。 总之,OpenCV支持向量机非线性回归提供了一种有效的工具来处理非线性可分的数据集。通过选择合适的内核函数和参数设置,可以在计算机视觉和图像处理等领域中应用SVM算法,实现准确的预测和分类任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值