017 OpenCV 向量机SVM

news2025/1/12 10:08:56

目录

一、环境

二、SVM原理

三、完整代码


一、环境

本文使用环境为:

  • Windows10
  • Python 3.9.17
  • opencv-python 4.8.0.74

二、SVM原理

OpenCV中的向量机(SVM)是一种监督学习算法,用于分类和回归分析。它通过找到一个最优的超平面来将不同类别的数据分开,并使用支持向量来确定这个超平面的位置和方向。

SVM的基本思想是找到一个最优的超平面,使得两个类别之间的间隔最大化。这个间隔被称为“最大间隔”,而支持向量则是位于间隔边缘上的样本点。这些支持向量决定了最优超平面的位置和方向,因此它们也被称为“支持向量机”。

在OpenCV中,SVM可以用于二分类、多分类和回归分析。对于二分类问题,SVM会找到一个最优的超平面,将正类和负类分开。对于多分类问题,SVM会使用“一对一”或“一对多”策略来处理多个类别。对于回归分析问题,SVM会找到一个最优的超平面,将输入数据映射到一个连续的输出值上。

SVM的核心是核函数,它用于将输入数据映射到一个高维空间中。在高维空间中,数据更容易被分离,因为不同类别之间的距离更大。常用的核函数包括线性核、多项式核、径向基函数核(RBF)和sigmoid核等。不同的核函数适用于不同类型的数据,选择合适的核函数可以提高SVM的性能。

线性核是最简单的核函数,它将输入数据直接映射到高维空间中。如果数据的维度很高,那么线性核的效果可能不太好。多项式核可以将输入数据映射到一个更高维的空间中,但是它需要更多的计算资源。径向基函数核(RBF)是一种非常强大的核函数,它可以将输入数据映射到一个无限维的空间中。但是,RBF需要调整一个参数C来控制间隔的大小,这可能会影响模型的性能。sigmoid核可以将输入数据映射到一个概率空间中,它通常用于二分类问题。

总之,OpenCV中的向量机是一种强大的监督学习算法,可以用于分类和回归分析。它的核心是核函数,不同的核函数适用于不同类型的数据。选择合适的核函数可以提高SVM的性能,从而更好地解决实际问题。

三、完整代码

以下代码是在二维坐标系上,随便设置4个点,第一个点类别是:1;剩余三个点类别是:-1。向量机作用就是找到一个2维决策面(线),将上述两类点划分开。

import cv2 as cv
import numpy as np

# 设置训练数据(二分类)
labels = np.array([1, -1, -1, -1])
trainingData = np.matrix([[501, 10], [255, 10], [501, 255], [10, 501]], dtype=np.float32)

# 训练SVM
# 初始化
svm = cv.ml.SVM_create()
svm.setType(cv.ml.SVM_C_SVC)
svm.setKernel(cv.ml.SVM_LINEAR)
svm.setTermCriteria((cv.TERM_CRITERIA_MAX_ITER, 100, 1e-6))
# 开始训练
svm.train(trainingData, cv.ml.ROW_SAMPLE, labels)
# 用于数据可视化
width = 512
height = 512
image = np.zeros((height, width, 3), dtype=np.uint8)

# 显示不同类别区域
green = (0,255,0)
blue = (255,0,0)
for i in range(image.shape[0]):
    for j in range(image.shape[1]):
        sampleMat = np.matrix([[j,i]], dtype=np.float32)
        response = svm.predict(sampleMat)[1]

        if response == 1:
            image[i,j] = green
        elif response == -1:
            image[i,j] = blue
# 显示训练数据
thickness = -1
cv.circle(image, (501,  10), 5, (  0,   0,   0), thickness)
cv.circle(image, (255,  10), 5, (255, 255, 255), thickness)
cv.circle(image, (501, 255), 5, (255, 255, 255), thickness)
cv.circle(image, ( 10, 501), 5, (255, 255, 255), thickness)

# 显示支撑向量(决策边界)
thickness = 2
sv = svm.getUncompressedSupportVectors()

for i in range(sv.shape[0]):
    cv.circle(image, (int(sv[i,0]), int(sv[i,1])), 6, (128, 128, 128), thickness)
cv.imwrite('result.png', image) # save the image
cv.imshow('SVM Simple Example', image) # show it to the user
cv.waitKey()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1292005.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

优化AI机器人外呼之话术制作

智能语音机器人,OKCC-AI厂家制作话术工作实践总结。 一、 语音机器人话术制作,一般可以分为三个模块: 第一:是主干流程,也叫主流程 这个部分有点类似我们人工呼叫中心,常说的话术脚本。 第二&#xff1a…

如何处理3dmax渲染完成后阴影部分?

使用3dmax软件,对效果图进行渲染过程中,有不少小伙伴,在渲染完成后出现问题。 较为常见的3dmax渲染问题有3dmax渲染有阴影? 对于一些新手伙伴遇到这类问题,不知如何解决,就会苦恼3dmax渲染有阴影怎么办&am…

剑指Offer 从尾到头打印链表

目录 刷题链接:题目描述思路一:复杂度分析python3C 刷题链接: https://www.nowcoder.com/practice/d0267f7f55b3412ba93bd35cfa8e8035 题目描述 输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返…

2024年AMC8考试报名的唯一途径和备考建议,别再浪费时间去探索

最近有些家长和孩子咨询六分成长2024年AMC8美国数学竞赛的报名和考试等事宜。 和他们交流,我发现很多家长和孩子走了许多弯路,被网上的信息带偏了,且浪费了很多时间。为此,六分成长将2024年AMC8报名和考试等的相关信息最新版&…

西南科技大学模拟电子技术实验六(BJT电压串联负反馈放大电路)预习报告

一、计算/设计过程 BJT电压串联负反馈放大电路图1-1-1-1为BJT电压串联负反馈放大实验电路,若需稳定输出电压,减小从信号源所取电流,可引入电压串联负反馈闭合开关。 图1-1-1-1 理论算法公式(1)闭环电压放大倍数 (2)反馈系数 (3)输入电阻 (4)输出电阻 计算过程。开环…

Java第二十一章 :网络通信

网络程序设计基础 网络程序设计编写的是与其他计算机进行通信的程序。Java 已经将网络程序所需要的元素封装成不同的类,用户只要创建这些类的对象,使用相应的方法,即使不具备有关的网络支持,也可以编写出高质量的网络通信程…

0009Java程序设计-ssm微信小程序在慢性疾病管理中的应用

文章目录 **摘要**目录系统实现开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅🐧裙:776871563 摘要 首先,论文一开始便是清楚的论述了小程序的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例…

1.1美术理论基础

一、光影 物体呈现在人们眼前的时候,不同的受光面其明暗变化以及物体的影子。 1.什么是黑白灰 在美术中黑白灰指亮面、灰面、暗面,属于素描的三大面,主要体验一个物体的整体寿光过程。普遍存在于各种艺术和设计领域。黑白灰作品的出现&#x…

C++ 的vector、array和数组的比较

相同点: 三者均可以使用下表运算符对元素进行操作,即vector和array都针对下标运算符[]进行了重载 三者在内存的方面都使用连续内存,即在vector和array的底层存储结构均使用数组 不同点: vector属于变长容器,即可以根…

Django之admin后台页面功能详解

一)对于admin的初了解 1.简介 Django是一种流行的Python Web开发框架,它提供了一个功能强大且易于使用的admin界面,用于管理网站的后台数据和功能。Django的admin界面是自动生成的,它根据你的模型类自动创建表单和列表视图。你只…

移除元素、合并两个有序数组(leetcode)

一、移除元素 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 思路一: 比较好想到,但是时间复杂度为O(n^2)。 思路:把每一个数组中的元素与val比较,比较后若元素等于val&#…

vue3 + mark.js 实现文字标注功能

效果图 安装依赖 npm install mark.js --save-dev npm i nanoid代码块 <template><!-- 文档标注 --><header><el-buttontype"primary":disabled"selectedTextList.length 0 ? true : false"ghostclick"handleAllDelete"…

2024年网络安全比赛--系统渗透测试(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 1.在渗透机中对服务器主机进行信息收集&#xff0c;将服务器开启的端口号作为 Flag 值提交; 2.在渗透机中对服务器主机进行渗透&#xff0c;在服务器主机中获取服务器主机名称&#xff…

履带吊,笔记

0.前言 履带吊使用了与传统的门桥式起重机不同的技术路线。因为它是移动式设备&#xff0c;所以它的动力是燃油发动机。为了精确调控升降。它的整套动力系统似乎采用了某种液压传动系统。履带吊国内也有生产商。但是下文中&#xff0c;还是从国外的一款产品说起。这款产品的pd…

K8S pod无损上下线

在最近的K8s服务上线过程中&#xff0c;我发现了一些问题&#xff0c;更具体的说&#xff0c;我在使用阿里云k8s的过程中注意到&#xff1a;会出现slb短时RT增加&#xff0c;Pod部署初期就达到了扩容上限&#xff0c;并且开始大量的扩容&#xff0c;这无疑占用了大量的k8s资源。…

ardupilot开发 --- ROS 与 Ardupilot 篇

1. ROS 与 Ardupilot ArduPilot功能可以通过ROS进行扩展&#xff1b;推荐使用ROS Noetic 版本&#xff0c;而非ROS2&#xff1b;对于ROS2&#xff0c;目Humble是唯一支持的ROS2版本&#xff1b; 2. ROS with SITL 系统环境&#xff1a;win11&#xff0c;wsl2&#xff0c;Ubu…

C //例10.2 将一个磁盘文件中的信息复制到另一个磁盘文件中。

C程序设计 &#xff08;第四版&#xff09; 谭浩强 例10.2 例10.2 将一个磁盘文件中的信息复制到另一个磁盘文件中。 IDE工具&#xff1a;VS2010 Note: 使用不同的IDE工具可能有部分差异。 代码块 方法&#xff1a;使用指针&#xff0c;函数的模块化设计&#xff0c;动态分…

Java多线程:代码不只是在‘Hello World‘

Java线程好书推荐 概述01 多线程对于Java的意义02 为什么Java工程师必须掌握多线程03 Java多线程使用方式04 如何学好Java多线程写在末尾&#xff1a; 主页传送门&#xff1a;&#x1f4c0; 传送 概述 摘要&#xff1a;互联网的每一个角落&#xff0c;无论是大型电商平台的秒杀…

【离散数学】——期末刷题题库(等价关系与划分)

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

“无忧文件安全!上海迅软DSE文件加密软件助您轻松管控分公司数据!

许多大型企业集团由于旗下有着分布在不同城市的分支机构&#xff0c;因此在规划数据安全解决方案时&#xff0c;不适合采用市面上常见的集中式部署方式来管控各分部服务器&#xff0c;而迅软DSE文件加密软件支持采用分布式部署的方式来解决这一问题。 企业用户只需在总部内部署…