OpenCV中SVM的使用
转自:http://download.csdn.net/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.csdn.net/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.csdn.net/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
OpenCV中SVM的使用相关推荐
- opencv画虚线_(四十四)OpenCV中的机器学习-SVM
时间为友,记录点滴. 本来还想在特征点检测的道路上再走一走,学习一下Harr级联或者HOG什么的,但总有些概念感觉绕不过去.择日不如撞日,撞日不如今日.我们先揭开机器学习中的一个小角,看看大热的机器学 ...
- OpenCV中使用SVM分类器
在opencv中支持SVM分类器,过程就是:先训练再预测(python实现) # svm 对于数据的要求: 所有的数据都要有label # [155,48] -- 0 女生 [152,53] ---1 ...
- OpenCV中HOG人检测以及Part Model latent SVM目标识别
要做点视频中检测的小东西,发现OpenCV中已经十分全面了,要做的东西要用到Navneet Dalal and Bill Triggs的Histogram of Oriented Gradients ...
- OpenCV支持向量机SVM用于非线性可分离数据
OpenCV支持向量机SVM用于非线性可分离数据 支持向量机SVM用于非线性可分离数据 目标 动机Motivation 优化问题的扩展 源代码 解释 设置训练数据 设置SVM的参数 训练SVM 显示决 ...
- OpenCV支持向量机SVM简介
OpenCV支持向量机SVM简介 支持向量机SVM简介 目标 什么是SVM? 最佳超平面如何计算? 源代码 解释 设置训练数据 设置SVM的参数 由SVM分类的区域 支持向量 结果 支持向量机SVM简 ...
- OpenCV中神经网络的应用
OpenCV中神经网络的应用 OpenCV中也提供神经网络的算法,下面对其中的一些参数进行介绍. 激活函数 OpenCV中提供三种激活函数,分别是线性激活函数.sigmoid激活函数和高斯激活函数. ...
- 基于opencv的SVM车牌号码识别模型训练(C++)QT
条件:opencv-4.5,QT 一.准备数据集 下载车牌相关字符样本用于训练和测试,本文使用14个汉字样本和34个数字跟字母样本,每个字符样本数为40,样本尺寸为28*28. 二.计算样本HOG特征 ...
- OpenCV中图像特征提取与描述
目录 图像特征提取与描述 图像的特征 Harris和Shi-Tomas算法 Harris角点检测 Shi-Tomasi角点检测 小结 SIFT/SURF算法 SIFT原理 基本流程 尺度空间极值检测 ...
- 机器学习分类器——案例(opencv sklearn svm ann)
机器学习分类器--案例(opencv sklearn svm ann python) ps:最近师姐给我们留了一个任务,记录一下从一开始的什么都不懂到现在把任务做出来,并从中学习到的东西吧.... 语 ...
最新文章
- php无极分类非递归_无限极分类算法,对你一定有帮助
- 仿苹果手机闹钟_原来iPhone自带的闹钟这么好用,以前没发现,现在一直在用
- 使用LoadRunner对Web Services进行调用--Add Service Call
- HTML5概要与新增标签
- nginx 非socket代理配置
- Palm应用开发之四Palm 应用模型
- 被嘲“狗都不如”的那个人,年入1000万了
- linux make乱码,linux乱码
- 20190825:(leetcode习题)最长公共前缀
- 2.熟悉LINUX的基本操作
- 机器学习和深度学习_人工智能、机器学习和深度学习三者关系?
- 微信小程序app配置指南
- 微信小程序云开发视频教程上线啦
- 全文匹配方式查询(sql)
- Notepad++查看、编辑二进制文件——安装附加组件HexEditor实现
- API拦截的应用,网址劫持
- 160413、生成随机校验码
- envoy做集中式egress sidecar
- 大数据开发就业:大数据开发有哪些岗位
- desktop引用了一个不可用的位置
热门文章
- keras提取模型中的某一层_keras获得某一层或者某层权重的输出实例
- android 蓝牙 鼠标 app_Razer 雷蛇 那伽梵蛇 Pro 专业版 无线蓝牙鼠标 899元
- Easy3D:一个轻量级、易用、高效的C++库,用于处理和渲染3D数据
- Open3d 学习计划—13(Azure Kinect)
- Udacity机器人软件工程师课程笔记(二十) - 感知 - 校准,过滤, 分段, RANSAC
- Ubuntu 14.04 64bit上磁力链爬虫dht部署指南
- blktrace 工具集使用 及其实现原理
- C++ STL: 超详细 容器 deque 以及 适配器queue 和 stack 源码分析
- Spring注解@Value
- crontab修改默认编辑器