展开全部

OpenCV开发SVM算法是基于LibSVM软件包开发的,LibSVM是台湾大学林智仁(Lin Chih-Jen)等开发设计的一个简单、易于使用和快62616964757a686964616fe58685e5aeb931333361313332速有效的SVM模式识别与回归的软件包。用OpenCV使用SVM算法的大概流程是

1)设置训练样本集

需要两组数据,一组是数据的类别,一组是数据的向量信息。

2)设置SVM参数

利用CvSVMParams类实现类内的成员变量svm_type表示SVM类型:

CvSVM::C_SVC C-SVC

CvSVM::NU_SVC v-SVC

CvSVM::ONE_CLASS 一类SVM

CvSVM::EPS_SVR e-SVR

CvSVM::NU_SVR v-SVR

成员变量kernel_type表示核函数的类型:

CvSVM::LINEAR 线性:u‘v

CvSVM::POLY 多项式:(r*u'v + coef0)^degree

CvSVM::RBF RBF函数:exp(-r|u-v|^2)

CvSVM::SIGMOID sigmoid函数:tanh(r*u'v + coef0)

成员变量degree针对多项式核函数degree的设置,gamma针对多项式/rbf/sigmoid核函数的设置,coef0针对多项式/sigmoid核函数的设置,Cvalue为损失函数,在C-SVC、e-SVR、v-SVR中有效,nu设置v-SVC、一类SVM和v-SVR参数,p为设置e-SVR中损失函数的值,class_weightsC_SVC的权重,term_crit为SVM训练过程的终止条件。其中默认值degree = 0,gamma = 1,coef0 = 0,Cvalue = 1,nu = 0,p = 0,class_weights = 0

3)训练SVM

调用CvSVM::train函数建立SVM模型,第一个参数为训练数据,第二个参数为分类结果,最后一个参数即CvSVMParams

4)用这个SVM进行分类

调用函数CvSVM::predict实现分类

5)获得支持向量

除了分类,也可以得到SVM的支持向量,调用函数CvSVM::get_support_vector_count获得支持向量的个数,CvSVM::get_support_vector获得对应的索引编号的支持向量。

实现代码如下:

view plain

// step 1:

float labels[4] = {1.0, -1.0, -1.0, -1.0};

Mat labelsMat(3, 1, CV_32FC1, labels);

float trainingData[4][2] = { {501, 10}, {255, 10}, {501, 255}, {10, 501} };

Mat trainingDataMat(3, 2, CV_32FC1, trainingData);

// step 2:

CvSVMParams params;

params.svm_type = CvSVM::C_SVC;

params.kernel_type = CvSVM::LINEAR;

params.term_crit = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);

// step 3:

CvSVM SVM;

SVM.train(trainingDataMat, labelsMat, Mat(), Mat(), params);

// step 4:

Vec3b green(0, 255, 0), blue(255, 0, 0);

for (int i=0; i

{

for (int j=0; j

{

Mat sampleMat = (Mat_(1,2) << i,j);

float response = SVM.predict(sampleMat);

if (fabs(response-1.0) < 0.0001)

{

image.at(j, i) = green;

}

else if (fabs(response+1.0) < 0.001)

{

image.at(j, i) = blue;

}

}

}

// step 5:

int c = SVM.get_support_vector_count();

for (int i=0; i

{

const float* v = SVM.get_support_vector(i);

}

OpenCV支持的目标检测的方法是利用样本的Haar特征进行的分类器训练,得到的级联boosted分类器(Cascade Classification)。注意,新版本的C++接口除了Haar特征以外也可以使用LBP特征。

先介绍一下相关的结构,级联分类器的计算特征值的基础类FeatureEvaluator,功能包括读操作read、复制clone、获得特征类型getFeatureType,分配图片分配窗口的操作setImage、setWindow,计算有序特征calcOrd,计算绝对特征calcCat,创建分类器特征的结构create函数。级联分类器类CascadeClassifier。目标级联矩形的分组函数groupRectangles。

接下来,我尝试使用CascadeClassifier这个级联分类器类检测视频流中的目标(haar支持的目标有人脸、人眼、嘴、鼻、身体。这里尝试比较成熟的人脸和眼镜)。用load函数加载XML分类器文件(目前提供的分类器包括Haar分类器和LBP分类器(LBP分类器数据较少))具体步骤如下:

1)加载级联分类器

调用CascadeClassifier类成员函数load实现,代码为:

view plain

CascadeClassifier face_cascade;

face_cascade.load("haarcascade_frontalface_alt.xml");

2)读取视频流

这部分比较基础啦~~从文件中读取图像序列,读取视频文件,读取摄像头视频流看过我之前的文章,这3种方法应该了然于心。

3)对每一帧使用该分类器

这里先将图像变成灰度图,对它应用直方图均衡化,做一些预处理的工作。接下来检测人脸,调用detectMultiScale函数,该函数在输入图像的不同尺度中检测物体,参数image为输入的灰度图像,objects为得到被检测物体的矩形框向量组,scaleFactor为每一个图像尺度中的尺度参数,默认值为1.1,minNeighbors参数为每一个级联矩形应该保留的邻近个数(没能理解这个参数,-_-|||),默认为3,flags对于新的分类器没有用(但目前的haar分类器都是旧版的,CV_HAAR_DO_CANNY_PRUNING利用Canny边缘检测器来排除一些边缘很少或者很多的图像区域,CV_HAAR_SCALE_IMAGE就是按比例正常检测,CV_HAAR_FIND_BIGGEST_OBJECT只检测最大的物体,CV_HAAR_DO_ROUGH_SEARCH只做初略检测),默认为0.minSize和maxSize用来限制得到的目标区域的范围。这里调用的代码如下:

view plain

face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) );

4)显示目标

这个也比较简单,调用ellips函数将刚才得到的faces矩形框都显示出来

更进一步,也可以在得到的每一幅人脸中得到人眼的位置,调用的分类器文件为haarcascade_eye_tree_eyeglasses.xml,先将脸部区域选为兴趣区域ROI,重复上诉步骤即可,这里就不详细介绍了。当然,感兴趣的朋友也可以试试其他的xml文件作为分类器玩一下啊,感觉LBP特征虽然xml文件的大小很小,但效果还可以,不过我没有做过多的测试。光说不练假把式,最后贴上效果图和源代码的下载地址

代码下载地址:http://download.csdn.net/detail/yang_xian521/3800468

OpenCV配套的教程Tutorials对于Video的部分,没有实例进行说明,我只能摸石头过河啦,之前试过一个camShift做目标检测,这次试一试光流法做运动估计。这里使用的光流法是比较常用的 Lucas-Kanade方法。对于光流法的原理,我就不过多介绍了,主要讲使用OpenCV如何实现。

首先利用goodFeaturesToTrack函数得到图像中的强边界作为跟踪的特征点,接下来要调用calcOpticalFlowPyrLK函数,输入两幅连续的图像,并在第一幅图像里选择一组特征点,输出为这组点在下一幅图像中的位置。再把得到的跟踪结果过滤一下,去掉不好的特征点。再把特征点的跟踪路径标示出来。说着好简单哦~~

程序的效果和代码下载http://download.csdn.net/detail/yang_xian521/3811478

视频捕捉的对象中,背景通常保持不变。一般分析中关注移动的前景物体,威力提取出前景物体,需要建立背景的模型,将模型和当前帧进行比对检测前景物体。前景提取应用非常广泛,特别是在智能监控领域中。

如果有不含前景物体的背景图片,提取前景的工作相对容易,只需要比对当前帧和背景图片的不同,调用函数absdiff实现。但是大多数情况,获得背景图片是不可能的,比如在复杂的场景下,或者有光线条件的变化。因此,就需要动态的变换背景。一种简单的办法是对所观察到的图片取平均,但这样做也有很多弊端,首先,这种办法在计算背景图片的前需要输入大量的图片,其次我们进行取平均的过程中不能有前景物体进入。所以一种相对好的办法是动态建立背景图片并实时更新。

具体的实现过程主要分为两部分:一部分是调用absdiff函数找出当前图片和背景图片的区别,这之中使用了threshold函数去除为前景,当前图片像素与背景图片像素变化超过一定阈值的时候才认定其为前景;另一个工作是更新背景图片,调用函数accumulateWeighted,根据权重参数可以调整背景更新的速度,将当前图片更新到背景中,这里巧妙利用得到的前景提取结果作为mask,在更新背景图片的过程中避免了前景的干扰。

程序效果如图,代码下载地址为http://download.csdn.net/detail/yang_xian521/3814878

虽然可以调整阈值参数和权重更新速度调节前景提取的结果,但从测试视频可以发现,树叶的运动对结果的干扰还是不小的,特别对于第一帧出现前景的情况,由于后续更新背景都是对前景mask后对背景进行更新的,所以第一帧的前景部分对背景的影响因子很难被更新掉。这里提出一种改进的办法——混合高斯模型。可以使一个像素具有更多的信息,这样可以有效的减少类似树叶的不停飘动,水波的不停荡漾这种对前景的干扰。这个精密的算法比之前我所介绍的简单方法要复杂很多,不易实现。还好,OpenCV已经为我们做好了相关工作,将其封装在类BackgroundSubtractorMOG,使用起来非常方便。实现代码如下:

view plain

Mat frame;

Mat foreground; // 前景图片

namedWindow("Extracted Foreground");

// 混合高斯物体

BackgroundSubtractorMOG mog;

bool stop(false);

while (!stop)

{

if (!capture.read(frame))

{

break;

}

// 更新背景图片并且输出前景

mog(frame, foreground, 0.01);

// 输出的前景图片并不是2值图片,要处理一下显示

threshold(foreground, foreground, 128, 255, THRESH_BINARY_INV);

本回答被网友采纳

已赞过

已踩过<

你对这个回答的评价是?

评论

收起

svm算法java实现_谁有用JAVA实现机器学习svm算法的代码,感激不尽相关推荐

  1. groovy 使用java类_深入学习java中的Groovy 和 Scala 类

    前言 Java 传承的是平台,而不是语言.有超过 200 种语言可以在 JVM 上运行,它们之中不可避免地会有一种语言最终将取代 Java 语言,成为编写 JVM 程序的最佳方式.本系列将探讨三种下一 ...

  2. 安卓 java内存碎片_理解Android Java垃圾回收机制

    Jvm(Java虚拟机)内存模型 从Jvm内存模型中入手对于理解GC会有很大的帮助,不过这里只需要了解一个大概,说多了反而混淆视线. Jvm(Java虚拟机)主要管理两种类型内存:堆和非堆. 堆是运行 ...

  3. java拆解_深入拆解Java虚拟机视频教程

    目录: 第1节说在前面的话   00:05:07分钟   | 第3节环境搭建以及jdk,jre,jvm的关系   00:20:48分钟   | 第5节jvm再体验-jvm可视化监控工具   00:21 ...

  4. java学习_都说Java难学,不知道具体的学习内容?全套Java学习路线送上

    首先,我个人比较推崇的学习方法是:先学java前段,也就是HTML,css,js,因为学习java以后肯定是往java ee方向发展的,学习完前端,在学习后端很多东西比计较容易理解! 其中J2SE是关 ...

  5. java 虚拟机_浅谈Java虚拟机内存区

    1. Java 虚拟机内存区概述 我们在编写程序时,经常会遇到OOM(out of Memory)以及内存泄漏等问题.为了避免出现这些问题,我们首先必须对JVM的内存划分有个具体的认识.JVM将内存主 ...

  6. 高级java开发_适用于高级Java开发人员的十大书籍

    高级java开发 Java是当今最流行的编程语言之一. 有很多适合初学者的书籍. 但是对于那些使用Java进行过一段时间编程的人来说,其中有些人看起来有些简单和多余. 初学者的书没有带来新鲜有趣的想法 ...

  7. 计算机二级java上机_计算机二级JAVA上机试题及答案

    2016年9月计算机等级考试正在紧张复习中,为帮助大家进一步复习java,yjbys小编为大家带来最新java上机试题及答案如下: 1. 基本操作(1小题,计30分) 注意:下面出现的"考生 ...

  8. pat上写java程序_如何运行Java程序和设置CLASSPAT

    导读: 如何运行JAVA和CLASSPATH环境变量的设置是学习和使用JAVA中最基本的问题,本不应在此赘述.但近来不少人在论坛上提出的问题却与此有关,我平时碰到的一些初学者也往往在这个问题上卡了壳, ...

  9. java 枚举_深入理解Java枚举

    所有知识体系文章,[GitHub](https://github.com/Ziphtracks/JavaLearningmanual)已收录,欢迎Star!再次感谢,愿你早日进入大厂! https:/ ...

最新文章

  1. 兰州大学的《致谢》火了:“我从来不曾优秀过,也从来不曾放弃过!”
  2. python绘图实例-Python——matplotlib基础绘图函数示例
  3. 返朴归真,也谈面向对象编程的几个原则
  4. MySQL 安装 启动命令总结
  5. HTML输入学生成绩并排序java_JS实现冒泡排序,插入排序和快速排序并排序输出...
  6. 大学编译原理试卷考试题
  7. 基于JAVA+Servlet+JSP+MYSQL的会议管理系统
  8. 修复GRUB [转]
  9. Android Audio音频通路(七)
  10. keyphrase抽取论文在聊什么?
  11. pku1159 Palindrome(简单dp)
  12. Spring——依赖注入的三种方式
  13. ssh远程连接服务器常用命令
  14. 留学生如何搞定Extended Essay?
  15. 网口扫盲三:以太网芯片MAC和PHY的关系
  16. JQ与JS实现全选按钮案例
  17. php.ini 验证码,PHP-验证码
  18. 阿里巴巴著名的“管理三板斧”
  19. 推荐基于深度学习实时同步生成2D动画口型算法
  20. 加密市场的牛熊周期;NFT 定义的争论

热门文章

  1. Power oj 2837: 剑道万古如长夜(单调队列优化DP)
  2. Linux访问群晖NAS共享文件夹
  3. Herman miller Aeron 一代 气压杆(气压棒,气柱)更换笔记(电脑椅中的劳斯莱斯)
  4. 20170321多益在线笔试(二笔)
  5. 企业微信三方开发:注册企业微信服务商
  6. 【敬伟ps教程】图层相关知识
  7. java map 内存分配_mapreduce 内存分配
  8. 在线客服——各第三方的收费标准及服务提供
  9. 【Android】自制静音App,解决他人手机外放问题
  10. Android开发日志打卡APP(二)