OpenCV - SVM算法原理实现以及SVM图像分割

2023-10-26

支持向量机的原理这里也就不阐述了,我也不太会。我大概的理解就是和KNN一样是个分类器,可以想象以下,两类样本点可以用很多条线分开,但是那一条是最优呢?支持向量机中利用支持向量(可能是样本中的几个点,具体怎么取这个向量不需要我们考虑),然后计算支持向量到分割线的距离,距离最大的那条分界线那就是最优分类了。所以SVM中用的是间隔最大化思想。


参数设置

支持向量机只有一成为一个很强的算法,是因为它能够适应各种情况,也因如此参数设置比KNN要多很多。OpenCV中给出接口:

SVM中有不同的内核,不同的内核计算公式中有不同的参数,所以要根据所选内核来调整参数;

一般用linear线性内核,poly多项式内核,rbf 基于径向的函数

关于核的:https://blog.csdn.net/qq_30263737/article/details/83338958

enum KernelTypes {
        /** Returned by SVM::getKernelType in case when custom kernel has been set */
        CUSTOM=-1,
        /** Linear kernel. No mapping is done, linear discrimination (or regression) is
        done in the original feature space. It is the fastest option. \f$K(x_i, x_j) = x_i^T x_j\f$. */
        LINEAR=0,
        /** Polynomial kernel:
        \f$K(x_i, x_j) = (\gamma x_i^T x_j + coef0)^{degree}, \gamma > 0\f$. */
        POLY=1,
        /** Radial basis function (RBF), a good choice in most cases.
        \f$K(x_i, x_j) = e^{-\gamma ||x_i - x_j||^2}, \gamma > 0\f$. */
        RBF=2,
        /** Sigmoid kernel: \f$K(x_i, x_j) = \tanh(\gamma x_i^T x_j + coef0)\f$. */
        SIGMOID=3,
        /** Exponential Chi2 kernel, similar to the RBF kernel:
        \f$K(x_i, x_j) = e^{-\gamma \chi^2(x_i,x_j)}, \chi^2(x_i,x_j) = (x_i-x_j)^2/(x_i+x_j), \gamma > 0\f$. */
        CHI2=4,
        /** Histogram intersection kernel. A fast kernel. \f$K(x_i, x_j) = min(x_i,x_j)\f$. */
        INTER=5
    };

对应参数:

degree:内核函数(POLY)的参数degree。

gamma:内核函数(POLY/ RBF/ SIGMOID)的参数

coef0:内核函数(POLY/ SIGMOID)的参数coef0。

关于svm类型的:

C_SVC是默认类型:C类支撑向量分类机。 n类分组 (n≥2),容许用异常值处罚因子C进行不完全分类。

    enum Types {
      
        C_SVC=100,
      
        NU_SVC=101,
       
        ONE_CLASS=102,
       
        EPS_SVR=103,
       
        NU_SVR=104
    };

对应参数:

Cvalue:SVM类型(C_SVC/ EPS_SVR/ NU_SVR)的参数C。

nu:SVM类型(NU_SVC/ ONE_CLASS/ NU_SVR)的参数 。

p:SVM类型(EPS_SVR)的参数。

class_weights:C_SVC中的可选权重,赋给指定的类,乘以C今后变成 。所以这些权重影响不合类此外错误分类处罚项。权重越大,某一类此外误分类数据的处罚项就越大。

term_crit:SVM的迭代练习过程的中断前提,解决项目组受束缚二次最优题目。您可以指定的公差和/或最大迭代次数。


// SVM.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
#include <opencv2\opencv.hpp>


using namespace cv;
using namespace cv::ml;

int train_sample_nums = 200;

int main()
{
	/******************数据集制作***************************/
	Mat trainData(train_sample_nums, 2, CV_32FC1);
	Mat trainClassess(train_sample_nums, 1, CV_32SC1);               //注意标签的格式,有符号

	//创建可视化图像
	Mat img(500, 500, CV_8UC3, Scalar::all(0));
	//样本点
	Mat sample(1, 2, CV_32FC1);

	Mat trainData1, trainData2, trainClasses1, trainClasses2;

	RNG rng = RNG(-1);
	//生成均值为(200,200),方差为(40,40)的随机数据
	trainData1 = trainData.rowRange(0, train_sample_nums / 2);
	rng.fill(trainData1, CV_RAND_NORMAL, Scalar(100, 100), Scalar(40, 40));
	trainData2 = trainData.rowRange(train_sample_nums / 2, train_sample_nums);
	rng.fill(trainData2, CV_RAND_NORMAL, Scalar(300, 300), Scalar(40, 40));

	//trainClasses1和trainClassess的前100行绑定
	trainClasses1 = trainClassess.rowRange(0, train_sample_nums / 2);
	trainClasses1 = Scalar::all(1);
	trainClasses2 = trainClassess.rowRange(train_sample_nums / 2, train_sample_nums);
	trainClasses2 = Scalar::all(-1);

	/*****************训练********************/
	cv::Ptr<cv::ml::SVM> svm = cv::ml::SVM::create();
	svm->setType(cv::ml::SVM::C_SVC);
	svm->setC(1.0);
	
	svm->setKernel(cv::ml::SVM::POLY);
	svm->setGamma(1.0);
	svm->setDegree(2.0);
	svm->setCoef0(0.0);
	
	svm->setTermCriteria(cv::TermCriteria(cv::TermCriteria::MAX_ITER, 500, 1e-6));// cv::ml::SVM::setTermCriteria(CV_TERMCRIT_ITER, 500, 1e-6);	

	cv::Ptr<TrainData> TrainData = TrainData::create(trainData, SampleTypes::ROW_SAMPLE, trainClassess);
	//svm->train(trainData, cv::ml::ROW_SAMPLE, trainClassess);
	svm->train(TrainData);

	for (int i = 0; i < img.rows; ++i)
	{
		for (int j = 0; j < img.cols; ++j)
		{
			Mat sampleMat = (Mat_<float>(1, 2) << i, j);
			float response = svm->predict(sampleMat);
			if (response == 1)
			{
				img.at<Vec3b>(i, j) = Vec3b(0, 160, 0);
			}
			else if (response == -1)
			{
				img.at<Vec3b>(i, j) = Vec3b(0, 0, 160);
			}
		}
	}

	for (int i = 0; i < train_sample_nums / 2; i++)
	{
		Point pt;
		pt.x = round(trainData1.at<float>(i, 0));
		pt.y = round(trainData1.at<float>(i, 1));
		circle(img, pt, 1, Scalar(0, 255, 255));

		pt.x = round(trainData2.at<float>(i, 0));
		pt.y = round(trainData2.at<float>(i, 1));
		circle(img, pt, 1, Scalar(255, 255, 0));
	}

	int thickness = 1;
	int lineType = 8;
	Mat image(img);
	Mat sv = svm->getSupportVectors();
	for (int i = 0; i < sv.rows; i++)
	{
		const float* v = sv.ptr<float>(i);
		circle(image, cv::Point((int)v[0], (int)v[1]), 6, Scalar(255, 0, 0), thickness, lineType);
	}

	imshow("img", img);
	imshow("image", image);
	waitKey(0);
}

SVM图像分割:待填坑

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OpenCV - SVM算法原理实现以及SVM图像分割 的相关文章

  • 找到 4 个特定的角像素并将它们与扭曲透视一起使用

    我正在使用 OpenCV 我想知道如何构建一个简单版本的透视变换程序 我有一张平行四边形的图像 它的每个角都由具有特定颜色的像素组成 该像素在图像中没有其他位置 我想遍历所有像素并找到这 4 个像素 然后我想将它们用作新图像中的角点 以扭曲
  • 使用python从gst管道抓取帧到opencv

    我在用着OpenCV http opencv org 和GStreamer0 10 我使用此管道通过自定义套接字通过 UDP 接收 MPEG ts 数据包sockfd由 python 提供并显示它xvimagesink 而且效果很好 以下命
  • Opencv 2.4.2 代码讲解-人脸识别

    我参考OpenCV提供的文档制作了一个人脸识别程序 可以识别多个人脸 并且工作正常 在文档中 他们制作了省略号来突出显示脸部 我不明白的是他们如何计算椭圆的中心 他们的计算如下 for int i 0 i lt faces size i P
  • opencv中如何去除二值图像噪声?

    将图像转换为二值图像 黑白 后如果有任何噪音怎么办 我消除了那些不需要的噪音 您可以看到下图的黑色区域内有一些白噪声 我该如何去除噪声 使用opencv http img857 imageshack us img857 999 blackn
  • 使用 OpenCV 进行图像模糊检测

    我正在研究图像的模糊检测 我已经用过拉普拉斯方法的方差在 OpenCV 中 img cv2 imread imgPath gray cv2 cvtColor img cv2 COLOR BGR2GRAY value cv2 Laplacia
  • Opencv 对象检测:ORB GPU 检测器和 SURF GPU 描述符提取器

    我只是做了一个小实验来尝试不同的检测器 描述符组合 我的代码使用 ORB GPU 检测器来检测特征 并使用 SURF GPU 描述符来计算描述符 我使用 BruteForceMatcher GPU 来匹配描述符 并使用 knnMatch 方
  • 尝试使使用 OpenCV 的 java 应用程序(可执行 Jar)可移植。出现不满意的链接错误

    我制作了一个应用程序 用于从网络摄像头抓取视频并使用 OpenCV 和 JavaCV 检测运动 我正在尝试使用 eclipse 导出为可执行 jar 该程序在 eclipse 中运行良好 就像我编写该程序的计算机上的 exe jar 一样
  • 在 virtualenvwrapper 中激活环境

    我安装了virtualenv and virtualenvwrapper用这个命令我创建了一个环境 mkvirtualenv cv 它有效 创建后我就处于新环境中 现在我重新启动了我的电脑 我想activate又是那个环境 但是怎么样 我使
  • OpenCV 地板分割检测

    我正在研究一种检测图像中地板的方法 我试图通过将图像缩小为颜色区域然后假设最大区域是地板来实现此目的 我们对机器人的运行环境做出一些相当广泛的假设 我正在寻找一些关于适合这个问题的算法的建议 任何帮助将不胜感激 编辑 具体来说 我正在寻找一
  • OpenCV功能类似于matlab的“查找”

    我正在寻找 openCV 中的一个函数来帮助我制作图像蒙版 例如在 MATLAB 中 B A or B 零 大小 A B A 10 c 有些功能可以让你通过mask向他们提出论据 按照您描述的方式创建面具 我认为您正在追求Cmp 或 Cmp
  • 在Spyder(Python 3.6)中导入cv2时出现导入错误

    我已经在Windows操作系统中安装了opencv 3 0 0 我已运行该应用程序并已成功将其安装在C 驱动器并还复制了cv2 pyd文件输入C Python27 Lib site packages正如我在几个教程视频中看到的那样 在我的
  • 从基本矩阵中查找单应矩阵

    我正在尝试计算单应性矩阵H给定一组对应关系和基本矩阵F 根据对极几何原理 我知道这可以通过对极线和对极线的叉积来完成F from 极点几何 http www cs unc edu marc tutorial node44 html e ij
  • 使用“const cv::Mat &”、“cv::Mat &”、“cv::Mat”或“const cv::Mat”作为函数参数的区别?

    我已经彻底搜索过 但没有找到一个简单的答案 传递 opencv 矩阵 cv Mat 作为函数的参数 我们传递一个智能指针 我们对函数内部的输入矩阵所做的任何更改也会改变函数范围之外的矩阵 我读到 通过将矩阵作为 const 引用传递 它不会
  • 使用 CLion 进行 OpenCV Windows 设置

    我想在 Windows 上为 CLion IDE 设置 OpenCV 我尝试使用 OpenCV 3 1 和 2 4 得到相同的结果 我有 Windows 10 64 位 CLion 使用 cygwin 环境 到目前为止我做了什么 1 从Op
  • 在谷歌C​​olab中使用cv2.imshow()

    我正在尝试通过输入视频来对视频进行对象检测 cap cv2 VideoCapture video3 mp4 在处理部分之后 我想使用实时对象检测来显示视频 while True ret image np cap read Expand di
  • 从笔记本中提取文本

    我正在尝试从图像中提取手写文本 我使用 python 和 opencv 函数 例如 find contours 当我使用像这样的图像时 一切进展顺利 它工作得很好 因为我有一个简单的背景 但后来我用这张图片测试了它 由于背景中有笔记本的线条
  • Python OpenCV视频格式在浏览器中播放

    我正在尝试从一系列图像创建视频并将其显示在浏览器中 但由于某些奇怪的原因 无论我使用什么编解码器或文件格式 我都会收到以下错误 找不到格式和 MIME 类型受支持的视频 这是我的代码 ready images import cv2 for
  • caffe安装:opencv libpng16.so.16链接问题

    我正在尝试在 Ubuntu 14 04 机器上使用 python 接口编译 caffe 我已经安装了 Anaconda 和 opencvconda install opencv 我还安装了咖啡中规定的所有要求 并更改了注释块makefile
  • OpenCV Python 删除图像中的某些对象

    我正在使用带有 opencv 和 numpy 的 python 来检测天文中的星星 例如这个1 https i stack imgur com AKwEJ jpg图片 使用模板匹配 我可以用阈值检测星星 单击 2 2 https i sta
  • 使用 K 均值聚类 OpenCV 进行交通标志分割

    I used K Means Clustering to perform segmentation on this traffic sign as shown below 这些是我的代码 读取图像并模糊 img cv imread 000

随机推荐

  • 【Scaled-YOLOv4】

    COCO数据集AP被刷到了55 4 FPS 15 核心是在YOLOV4上研究模型缩放 model scaling 技术 尽管在算法设计上 该文并没有带来重要亮点 但从工程应用的角度讲 Scaled YOLOv4 还是不错的 尤其是 YOLO
  • 单片机设计_语音识别分类智能垃圾桶(STM32 ESP8266 LD3320)

    想要更多项目私wo 一 电路设计 离线语音识别识别垃圾种类并且垃圾桶自动翻盖 说出唤醒词 垃圾桶 后 再说一句垃圾名称 语音识别模块端识别到相应关键词 便会将结果通过串口发送到STM32端 STM32端接着会发送打开相应垃圾桶盖的指令 6s
  • jitter单位_抖动(jitter)测量

    近年来 抖动 Jitter 已经成为通信工程师非常重视的信号特征 在数字系统中 时钟频率正在变得越来越高 随着速率的升组 在上升沿或是下降沿哪性是微小的变化也变得越来越重要 因为时钟或数据的抖动会影响到数据的完整性 建立时间和保持时间 并且
  • Mac移动硬盘无法使用/装载报错

    Mac移动硬盘无法使用 装载报错 事情起因 之前拔插机械硬盘的时候 忘记在关机前拔掉 导致移动硬盘直接断电 试用win电脑发现硬盘无损坏 插在MacBook上能识别但是无法显示里面的内容或进行操作 进入设置里对盘装载报错 装载 急救 启动盘
  • python实用脚本(五)——numpy的使用

    本期主题 python的numpy使用 往期链接 python实用脚本 一 批量修改目标文件夹下的文件名 python实用脚本 二 使用xlrd读取excel python实用脚本 三 通过有道智云API实现翻译 python实用脚本 四
  • C++:json解析,json与string互相转换

    Github nlohmann json nlohmann json简单用法 C 使用json json与string转换使用笔记
  • python绘制折线图显示点数据_python matplotlib 同时画散点图和折线图,如何将散点放在最上层???...

    代码 一 from random import choice class RandomWalk 一个生产随机漫步数据的类 def init self num point 5000 初始化随机漫步属性 self num point num p
  • RobotFramework 安装步骤

    Robot Framework 通用型黑盒自动化框架 框架优点 1 测试报告 2 执行部分用例 冒烟测试 3 初始化清除 一 安装Python3 建议3 6版本以上 二 安装RobotFramework 进入dos窗口 输入pip inst
  • 使用 Gitee + PicGo + Typora 搭建图床

    图床搭建过程简单 该博客只是为了记录并测试刚搭建好的图床 一 Gitee 1 新建仓库 填写好下图红框所示 并且选择开源 创建完后会跳转到仓库 记住这个网址 等下会在PicGo中用到 2 获取takon私人令牌 打开设置 点击私人令牌 生成
  • 最大子序列和问题以及确定序列起终点位置

    在学习数据结构遇到的第一个问题就是一个最大子序列和的问题 以PAT 点击打开链接 上的一道题作为例子来总结一下求解这类问题时一些常用的方法 网上讲述子列和问题的博客及文章已经很多了 这里就不在阐述穷举法和递归法的方式来求解了 有需求的小伙伴
  • Qt界面编程(二)—— Qt 5 帮助文档的详解

    学习Qt开发 肯定离不开帮助文档的使用 因为它不像 C 语言那样就那么几个函数接口 Qt的接口可以用海量来形容 常用的我们可能能记住 其它的真的没有必要去记 用到什么就去帮助文档查看用法 Qt5帮助文档地址 官网地址 https doc q
  • php微信怎么获取code,微信支付的Code如何获取?

    微信支付的问题 1 微信公众号帐号支付 2 微信支付授权目录 3 微信Code获取 用的是PHP开发 之前下载的是php微信sdk 下载集成到产品里一切正常 只要按官网步骤来做 应该不会出问题 后台应用环境变更 PHP只做中间层 后端是C
  • XAMPP 的安装配置(Linux 版)

    转载时请保留下面 以供大家加我MSN 增强交流 共同学习 姜庭华 msn jaimejth live cn 博客 http blog csdn net jaimejth 软件下载在以下网站 http www apachefriends or
  • 计算机网络 第四章网络层(5)BGP 协议路由器的结构远程接入 隧道技术虚拟专用网 和网络地址转换 NATRPB多播路由选择 网际组管理协议 IGMP多播 IP 地址

    关注公众号凡花花的小窝 收获更多的考研计算机专业编程相关的资料 BGP 发言人交换路径向量 主干网还可发出通知 要到达网络 N5 N6 和 N7 可沿路径 AS1 AS3 BGP 协议的特点 BGP 协议交换路由信息的结点数量级是自治系统数
  • 【2022-New】Flutter doctor 检测报错,Android toolchain - develop for Android devices

    错误一 cmdline tools component is missing 缺少 cmdline tools 组件 解决方案 点击开发工具左上角 依次点击 file gt settings gt Appearance Behavior g
  • leetcode 312 戳气球

    312 戳气球 相关企业 有 n 个气球 编号为0 到 n 1 每个气球上都标有一个数字 这些数字存在数组 nums 中 现在要求你戳破所有的气球 戳破第 i 个气球 你可以获得 nums i 1 nums i nums i 1 枚硬币 这
  • 如何用python写OLS模型

    你好 使用 Python 写 OLS 模型可以使用 statsmodels 库中的 OLS 模块 首先 你需要导入所需的库 import statsmodels api as sm 然后 准备你的自变量和因变量的数据 这些数据可以使用 Pa
  • java:String使用equals和==比较的区别

    操作符的作用 1 用于基本数据类型的比较 2 判断引用是否指向堆内存的同一块地址 equals所在位置 在Object类当中 而Object是所有类的父类 包含在jdk里面 但并不适合绝大多数场景 通常需要重写 public boolean
  • [JAVA][2013蓝桥杯预赛 JAVA本科B组][有理数类]

    标题 有理数类 有理数就是可以表示为两个整数的比值的数字 一般情况下 我们用近似的小数表示 但有些时候 不允许出现误差 必须用两个整数来表示一个有理数 这时 我们可以建立一个 有理数类 下面的代码初步实现了这个目标 为了简明 它只提供了加法
  • OpenCV - SVM算法原理实现以及SVM图像分割

    支持向量机的原理这里也就不阐述了 我也不太会 我大概的理解就是和KNN一样是个分类器 可以想象以下 两类样本点可以用很多条线分开 但是那一条是最优呢 支持向量机中利用支持向量 可能是样本中的几个点 具体怎么取这个向量不需要我们考虑 然后计算