opencv的svm学习_1

概述

  本篇是对opencv的svm学习笔记,基于对opencv官方svm教程的修改和记录。opencv的svm教程如下:
官网原版:http://docs.opencv.org/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html#introductiontosvms
汉语翻译版:http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html#introductiontosvms

效果演示

  本文代码运行效果如下:
                                          

代码讲解

具体代码

  具体代码如下:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv/cv.h>
#include <stdio.h>
#include <opencv2/ml/ml.hpp>

using namespace cv;

int main()
{
	// Data for visual representation
	int width = 512, height = 512;
	Mat image = Mat::zeros(height, width, CV_8UC3);

	float labels[3];
	Mat labelsMat(3, 1, CV_32FC1, labels);
	labelsMat.rowRange(0,1).setTo(1);
	labelsMat.rowRange(1,2).setTo(2);
	labelsMat.rowRange(2,3).setTo(3);

	float trainingData[3][2] = { {501, 10}, {255, 10}, {501, 255} };
	Mat trainingDataMat(3, 2, CV_32FC1, trainingData);

	// Set up SVM's parameters
	CvSVMParams params;
	params.svm_type    = CvSVM::C_SVC;
	params.kernel_type = CvSVM::LINEAR;
	params.term_crit   = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);

	// Train the SVM
	CvSVM SVM;
	SVM.train(trainingDataMat, labelsMat, Mat(), Mat(), params);

	Vec3b green(0,255,0), blue (255,0,0), red(0,0,255);
	// Show the decision regions given by the 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 == 2)
				image.at<Vec3b>(j, i)  = blue;
			else if (response == 3)
				image.at<Vec3b>(j, i)  = red;
		}
         }
	// Show the training data
	int thickness = -1;
	int lineType = 8;
	circle( image, Point(501,  10), 5, Scalar(  0,   0,   0), thickness, lineType);
	circle( image, Point(255,  10), 5, Scalar(255, 0, 255), thickness, lineType);
	circle( image, Point(501, 255), 5, Scalar(255, 255, 0), thickness, lineType);

	imshow("SVM Simple Example", image); // show it to the user
	waitKey(0);

}

建立训练样本

float labels[3];
	Mat labelsMat(3, 1, CV_32FC1, labels);
	labelsMat.rowRange(0,1).setTo(1);
	labelsMat.rowRange(1,2).setTo(2);
	labelsMat.rowRange(2,3).setTo(3);

	float trainingData[3][2] = { {501, 10}, {255, 10}, {501, 255} };
	Mat trainingDataMat(3, 2, CV_32FC1, trainingData);

  这里对labelsMat设置了分类标签1、2、3,对应到训练数据中,也就是将trainingData中的三组数据正好分成了三类。

训练支持向量机

  用函数SVM.train进行训练。
// Set up SVM's parameters
	CvSVMParams params;
	params.svm_type    = CvSVM::C_SVC;
	params.kernel_type = CvSVM::LINEAR;
	params.term_crit   = cvTermCriteria(CV_TERMCRIT_ITER, 100, 1e-6);

	// Train the SVM
	CvSVM SVM;
	SVM.train(trainingDataMat, labelsMat, Mat(), Mat(), params);

SVM区域分割

  使用CvSVM::predict 通过重建训练完毕的支持向量机来将输入的样本分类。
Vec3b green(0,255,0), blue (255,0,0), red(0,0,255);
// Show the decision regions given by the 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 == 2)
			image.at<Vec3b>(j, i)  = blue;
		else if (response == 3)
			image.at<Vec3b>(j, i)  = red;
	}
}
  这是一个大循环,遍历整个imgge图像,在每一次循环中:首先创建一个sampleMat,将本次循环中对应的i、j,以float的形式作为作为sampleMat的初始化参数。
接着使用SVM.predict对这个sampleMat进行分类。通过response返回数据,判断出本次的sampleMat属于第一、第二还是第三类,然后分别用红、绿、蓝在图像对应
位置,对分类进行标记。
时间: 2024-10-12 11:08:39

opencv的svm学习_1的相关文章

学习OpenCV——HOG+SVM

#include "cv.h" #include "highgui.h" #include "stdafx.h" #include <ml.h> #include <iostream> #include <fstream> #include <string> #include <vector> using namespace cv; using namespace std; int ma

opencv使用svm

作者 群号 C语言交流中心 240137450  微信 15013593099 OpenCV开发SVM算法是基于LibSVM软件包开发的,LibSVM是台湾大学林智仁(LinChih-Jen)等开发设计的一个简单.易于使用和快速有效的SVM模式识别与回归的软件包.用OpenCV使用SVM算法的大概流程是 1)设置训练样本集 需要两组数据,一组是数据的类别,一组是数据的向量信息. 2)设置SVM参数 利用CvSVMParams类实现类内的成员变量svm_type表示SVM类型: CvSVM::C_

OpenCV之Python学习笔记

OpenCV之Python学习笔记 直都在用Python+OpenCV做一些算法的原型.本来想留下发布一些文章的,可是整理一下就有点无奈了,都是写零散不成系统的小片段.现在看 到一本国外的新书<OpenCV Computer Vision with Python>,于是就看一遍,顺便把自己掌握的东西整合一下,写成学习笔记了.更需要的朋友参考. 阅读须知: 本文不是纯粹的译文,只是比较贴近原文的笔记:         请设法购买到出版社出版的书,支持正版. 从书名就能看出来本书是介绍在Pytho

OpenCV中feature2D学习——FAST特征点检测

在前面的文章<OpenCV中feature2D学习--SURF和SIFT算子实现特征点检测>中讲了利用SIFT和SURF算子进行特征点检测,这里尝试使用FAST算子来进行特征点检测. FAST的全名是:Features from Accelerated Segment Test,主要特点值计算速度快,比已知的其他特征点检测算法要快很多倍,可用于计算机视觉应用的实时场景.目前以其高计算效率(computational performance).高可重复性(highrepeatability)成为

OpenCV for Python 学习笔记 三

给源图像增加边界 cv2.copyMakeBorder(src,top, bottom, left, right ,borderType,value) src:源图像 top,bottem,left,right: 分别表示四个方向上边界的长度 borderType: 边界的类型 有以下几种: BORDER_REFLICATE # 直接用边界的颜色填充, aaaaaa | abcdefg | gggg BORDER_REFLECT # 倒映,abcdefg | gfedcbamn | nmabcd

OpenCV for Python 学习 (二 事件与回调函数)

今天主要看了OpenCV中的事件以及回调函数,这么说可能不准确,主要是下面这两个函数(OpenCV中还有很多这些函数,可以在 http://docs.opencv.org/trunk/modules/highgui/doc/user_interface.html 找到,就不一一列举了),然后自己做了一个简单的绘图程序 函数如下: cv2.setMouseCallback(windowName, onMouse[, param]) cv2.createTrackbar(trackbarName,

OpenCV for Python 学习 (一 绘图函数)

本人的学习笔记主要记录的是学习opencv-python-tutorials这本书中的笔记 今天晚上简单学习OpenCV for Python如何绘图,主要用了这几个函数(这几个函数可在:http://docs.opencv.org/modules/core/doc/drawing_functions.html 找到): cv2.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) cv2.circle(img, center,

C++ opencv快速例子学习——读图显示

1.关键函数 1. 读入图片 imread(图片或位置,显示格式)默认为:IMREAD_COLOR 显示格式: IMREAD_UNCHANGED =-1    // 8bit, color or not IMREAD_GRAYSCALE    = 0    // 8bit, gray IMREAD_COLOR           = 1    //  color IMREAD_ANYDEPTH      = 2   // any depth, IMREAD_ANYCOLOR     = 4   

OpenCV中feature2D学习——FAST特征点检测与SIFT/SURF/BRIEF特征提取与匹配

在前面的文章<OpenCV中feature2D学习--FAST特征点检测>中讲了利用FAST算子进行特征点检测,这里尝试使用FAST算子来进行特征点检测,并结合SIFT/SURF/BRIEF算子进行特征点提取和匹配. I.结合SIFT算子进行特征点提取和匹配 由于数据类型的不同,SIFT和SURF算子只能采用FlannBasedMatcher或者BruteForceMatcher来进行匹配(参考OpenCV中feature2D学习--BFMatcher和FlannBasedMatcher).