OpenCV中SVM的使用

本文通过一个具体的示例展示了如何使用支持向量机(SVM)进行图像数据的学习和分类。通过对随机生成的数据点进行标记并训练SVM模型,实现了对未知数据点的分类预测,并通过图像直观地展示出了分类结果及支持向量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://download.youkuaiyun.com/download/gaogaogao124/3125857

略有改动:

#include"stdafx.h"

#include<opencv2/opencv.hpp>

#include<cmath>

#include<ctime>

using namespace std;

int _tmain(int argc,_TCHAR*argv[])

{

    intsize = 400;//图像的长度和宽度  

    constints = 1000;//试验点个数  

    inti,j, sv_num;  

 

    IplImage *img;

 

    CvSVMsvm =CvSVM();//构造一个SVM类对象

    CvSVMParamsparam;//SVM参数

    CvTermCriteriacriteria;//迭代算法的结束条件

    CvRNGrng =cvRNG(time(NULL));//随机数typedef uint64 CvRNG;

    CvPointpts[s];

 

    floatdata[s*2];

    intres[s];

 

    CvMatdata_mat,res_mat;

    CvScalarrcolor;

    constfloat *support;

 

    img =cvCreateImage(cvSize(size,size),IPL_DEPTH_8U, 3);

    cvSetZero(img);

 

    //训练数据的生成,并将其值存放在pts

    for (i=0;i<s;i++)

    {

        pts[i].x =cvRandInt(&rng) %size;//用随机整数赋值

        pts[i].y =cvRandInt(&rng) %size;

 

        if (pts[i].y > 50 *cos(pts[i].x *CV_PI / 100) + 200)

        {

            cvLine(img, cvPoint(pts[i].x - 2,pts[i].y - 2),cvPoint(pts[i].x + 2,pts[i].y + 2),CV_RGB(255, 0, 0));

            cvLine(img, cvPoint(pts[i].x + 2,pts[i].y - 2),cvPoint(pts[i].x - 2,pts[i].y + 2),CV_RGB(255, 0, 0));

 

            res[i] = 1;

        }

        else

        {

            if (pts[i].x > 200)

            {

                cvLine(img, cvPoint(pts[i].x - 2,pts[i].y - 2),cvPoint(pts[i].x + 2,pts[i].y + 2),CV_RGB(0, 255, 0));

                cvLine(img, cvPoint(pts[i].x + 2,pts[i].y - 2),cvPoint(pts[i].x - 2,pts[i].y + 2),CV_RGB(0, 255, 0));

 

                res[i] = 2;

            }

            else

            {

                cvLine(img, cvPoint(pts[i].x - 2,pts[i].y - 2),cvPoint(pts[i].x + 2,pts[i].y + 2),CV_RGB(0, 0, 255));

                cvLine(img, cvPoint(pts[i].x + 2,pts[i].y - 2),cvPoint(pts[i].x - 2,pts[i].y + 2),CV_RGB(0, 0, 255));

 

                res[i] = 3;

            }

        }

    }

 

    cvNamedWindow("SVM",CV_WINDOW_AUTOSIZE);

    cvShowImage("SVM",img);

    cvWaitKey(0);

   

 

    //学习参数的生成

    for (i=0;i<s;i++)

    {

        data[i*2]   = float(pts[i].x) /size;

        data[i*2+1] = float(pts[i].y) /size;

    }

 

    cvInitMatHeader(&data_mat,s, 2,CV_32FC1,data);

    cvInitMatHeader(&res_mat,s, 1,CV_32SC1,res);

 

    criteria =cvTermCriteria(CV_TERMCRIT_EPS, 1000,FLT_EPSILON);

    param    =CvSVMParams(CvSVM::C_SVC,CvSVM::RBF, 10.0, 8.0, 1.0, 10.0, 0.5, 0.1,NULL, criteria);

   

    //SVM学习

    svm.train(&data_mat, &res_mat,NULL,NULL,param);

 

    //学习结果绘图

    for (i=0;i<size;i++)

    {

        for (j=0;j<size;j++)

        {

            CvMat m;

            float ret = 0.0;

            float a[] = {float(j) /size,float(i) /size};

            cvInitMatHeader(&m, 1, 2, CV_32FC1, a);

 

            ret = svm.predict(&m);//预测

 

            switch ((int)ret)

            {

                case 1: rcolor = CV_RGB(100, 0, 0);break;      

                case 2: rcolor = CV_RGB(0, 100, 0);break;

                case 3: rcolor = CV_RGB(0, 0, 100);break;

            }

 

            cvSet2D(img, i, j, rcolor);

        }

    }

 

    cvNamedWindow("SVM1",CV_WINDOW_AUTOSIZE);

    cvShowImage("SVM1",img);

    cvWaitKey(0);

 

    //训练数据绘制

    for (i=0;i<s;i++)

    {

        CvScalar rcolor;

 

        switch (res[i])

        {

            case 1: rcolor = CV_RGB(255, 0, 0); break;

            case 2: rcolor = CV_RGB(0, 255, 0); break;

            case 3: rcolor = CV_RGB(0, 0, 255); break;

        }

 

        cvLine(img, cvPoint(pts[i].x - 2,pts[i].y - 2),cvPoint(pts[i].x + 2,pts[i].y + 2),rcolor);

        cvLine(img, cvPoint(pts[i].x + 2,pts[i].y - 2),cvPoint(pts[i].x - 2,pts[i].y + 2),rcolor);

    }

 

    //支持向量绘制

    sv_num =svm.get_support_vector_count();

 

    for (i=0;i<sv_num;i++)

    {

        support = svm.get_support_vector(i);

 

        cvCircle(img, cvPoint((int)(support[0] *size), (int)(support[1] *size)), 5, CV_RGB(200, 200, 200));

    }

 

    cvNamedWindow("SVM2",CV_WINDOW_AUTOSIZE);

    cvShowImage("SVM2",img);

    cvWaitKey(0);

    cvDestroyWindow("SVM");

    cvDestroyWindow("SVM1");

    cvDestroyWindow("SVM2");

 

    cvReleaseImage(&img);

 

    return 0;

}

参考文献:

1、  http://blog.youkuaiyun.com/firefight/article/details/6400060

2、  http://blog.sina.com.cn/s/blog_4298002e010144k8.html

3、 http://hi.baidu.com/pengjun/blog/item/215e50da73e6cdd2b6fd48b6.html

4、  http://blog.youkuaiyun.com/carson2005/article/details/6547250

5、  http://www.opencv.org.cn/index.php?oldid=8202&printable=yes&title=%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E4%B8%AD%E6%96%87%E5%8F%82%E8%80%83%E6%89%8B%E5%86%8C

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值