用OpenCV的SVM实现简单的手势识别(切水果)[附源码]

2023-10-30

基于HOG特征的SVM分类器实现


在机器学习领域,支持向量机SVM(Support Vector Machine)是一个有监督的学习模型,通常用来进行模式识别、分类、以及回归分析。
方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。HOG特征通过计算和统计图像局部区域的梯度方向直方图来构成特征

一、计算HOG

void calculateHog(const Mat& src, vector<float>& descriptors,size windowSize,size blockSize,size cellSize)
{
	//梯度方向数 nbins=9
	HOGDescriptor myHog = HOGDescriptor(src.size(), windowSize, blockSize, cellSize,9);
	myHog.compute(src.clone(), descriptors, Size(1, 1), Size(0, 0));
}

二、SVM

因此容易写得一个基于HOG特征SVM分类器

#ifndef HOGSVM_H
#define HOGSVM_H

#include "cvHeadspace.h"
#include <iostream>
#include <vector>
using namespace cv;
using namespace cv::ml;
class HogSVM
{
public:
    HogSVM(std::string xmlFilePath,Size sWindow,Size sBlock,Size sCell,int enBins=9)
    {
        mySVM = Algorithm::load<SVM>(xmlFilePath);
        HogDesSize[0]=sWindow;
        HogDesSize[1]=sBlock;
        HogDesSize[2]=sCell;
        nbins=enBins;
    }
    int getLabel(const Mat &src)
    {
        std::vector<float> imageDescriptor;
        calculateHog(src, imageDescriptor,HogDesSize[0],HogDesSize[1],HogDesSize[2]);
        Mat testDescriptor = Mat::zeros(1, imageDescriptor.size(), CV_32FC1);
        for (size_t i = 0; i < imageDescriptor.size(); i++)
        {
            testDescriptor.at<float>(0, i) = imageDescriptor[i];
        }
        float  label = pHogSVM->predict(testDescriptor);
        return (int)label;
    }
private:
    void calculateHog(const Mat& src, std::vector<float>& descriptors,size windowSize,size blockSize,size cellSize)
{
	//梯度方向数 nbins默认为9
	HOGDescriptor myHog = HOGDescriptor(src.size(), windowSize, blockSize, cellSize,nbins);
	myHog.compute(src.clone(), descriptors, Size(1, 1), Size(0, 0));
}
	int nbins;
	Size HogDesSize[3];
    Ptr<SVM> pHogSVM;
};


#endif // HOGSVM_H

三、测试

简单尝试了一下训练,然后把训练的xml读入,做了测试(这里表格里的单位应该是ms不是s)

int label = tempSvm.getLabel(rROI);

在这里插入图片描述

四、小demo

运用SVM+Qt+openCV写了小demo测试
在这里插入图片描述

适当调整灵敏度后点击“抢占”就能调用windows.api控制鼠标,开始愉快(智杖)的玩耍了!

在这里插入图片描述

五、因为有人需要,更新了一下

时间比较久,有些东西已经没了,不过代码还在,之前没上传的原因就是感觉代码写得太烂,而且就是个本科作业级别的玩具,不好意思上传,但是有人需要,所以上传修改了一下文章,如下。

该项目主要有三个工程,
一个是vs_test_project用于前期的手势识别的测试。
还有一个是svm_train用于训练svm.xml文件。这两个工程文件全部贴在下面了。
QT的gui工程用于展示,但这个工程我没备份

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

用OpenCV的SVM实现简单的手势识别(切水果)[附源码] 的相关文章

  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 按成员序列化

    我已经实现了template
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 什么时候该采用结对编程?

    本文转载至 http www iteye com news 20082 编者按 原文作者Andriy Solovey从事软件开发已有15年 做过开发人员 软件经理和系统架构师 关注构建优质 可靠和可用的软件 结对编程是构建软件系统的一种有效
  • jmeter-本地压测-数据监控

    一 1 首先我们可以安装一个插件管理工具 Plugins Manager Plugins Manager下载地址 Install JMeter Plugins orgA custom set of plugins for Apache JM
  • Vue系列之入门篇

    前言 目录 一 关于Vue的简介 1 什么是Vue 2 使用Vue框架的好处 3 库和框架的区别 4 MVVM的介绍 5 Vue的入门案例 二 Vue的生命周期 一 关于Vue的简介 1 什么是Vue Vue是一个构建用户界面 UI 的渐进
  • Nginx做反向代理和负载均衡时“X-Forwarded-For”信息头的处理

    一 概述 如今利用nginx做反向代理和负载均衡的实例已经很多了 针对不同的应用场合 还有很多需要注意的地方 本文要说的就是在通过CDN后到达nginx做反向代理和负载均衡时请求头中的 X Forwarded For 项到底发生了什么变化
  • 电脑电池,我的笔记本电脑的电池为什么一直没电

    凡是电池都是有个使用寿命的 笔记本电池的寿命可是按照充放电的次数来计算的 但很多人对这个问题并不十分了解 加上一般笔记本电池的充放电次数起码也在500次左右 以至于很多朋友都认为笔记本电池的寿命也就是两年左右 笔记本电池即使不用 也会有自放
  • pyTorch中tensor运算

    文章目录 PyTorch的简介 PyTorch中主要的包 PyTorch的安装 使用GPU的原因 使数据在GPU上运行 什么使Tensor 张量 一些术语介绍 Tensor的属性介绍 Rank axis shape Rank Axis 轴
  • 离散引擎仿真基础

    1 简答题 Q 解释 游戏对象 GameObjects 和 资源 Assets 的区别与联系 区别 游戏对象 是Unity中的基本对象 游戏中的每个对象都是游戏对象 可以表现为人物 道具 场景等等 它们本身并不能完成很多工作 但它们的主要作
  • LeetCode(力扣)1005. K 次取反后最大化的数组和Python

    LeetCode1005 K 次取反后最大化的数组和 题目链接 代码 题目链接 https leetcode cn problems maximize sum of array after k negations 代码 class Solu
  • GPT-4只是AGI的火花?LLM终将退场,世界模型才是未来

    来源 新智元报道 编辑 润 Lumina 导读 人类距离AGI还有多远 也许大语言模型不是最终答案 一个理解世界的模型才是未来的方向 在人类的认知之中 似乎早已习惯将通用人工智能 AGI 设定为人工智能的终极形态和发展的最终目标 虽然Ope
  • python实现SHA256

    from hashlib import sha256 import hmac def get sign key data sha256加密有2种 hsobj sha256 key encode utf 8 hsobj update data
  • 基于51 手机遥控的蓝牙小车(HC-05)

    文章目录 一 软件 手机下载 蓝牙串口 电脑下载 XCOM串口调试助手 二 硬件 HC 05模块 USB转TTL模块 51小车 1 HC 05 2 USB转TTL模块 三 调试 1 引脚连接 2 进入AT模式 3 手机端串口助手的调试 4
  • C#——ref

    C ref ref 关键字指示按引用传递的值 它用在四种不同的上下文中 1 在方法签名和方法调用中 按引用将参数传递给方法 2 在方法签名中 按引用将值返回给调用方 3 在成员正文中 指示引用返回值是否作为调用方欲修改的引用被存储在本地 或
  • 发邮件向论文作者卑微求代码模板

    记录本人第一封卑微邮件 肯定不是最后一封 主题 关于XXX 随机Petri网 的实现问题 question regarding XXX the implementation of stochastic Petri nets 正文 中文版本
  • 交叉路口红绿灯控制程序linux,西门子PLC编程实例详解|十字路口交通灯自动控制系统...

    原标题 西门子PLC编程实例详解 十字路口交通灯自动控制系统 知识点和关键字 定时器 触点比较指令 传送指令 变址应用 数据块 控制要求 示意图 时序图 工艺流程图 当该路口是红灯时 另外一个路口是通行时间 绿灯亮和黄灯闪亮 当另外一个路口
  • 华为5g测试软件probe_【简讯】华为自研超高速sfs闪存曝光;苹果宣布11月10日举行新品发布会…...

    苹果宣布11月10日举行新品发布会 今天 苹果终于对外宣布 将在美国时间11月10举行新品线上发布会 而本次发布会的主题是 One more thing 至于这次发布会会带来什么新品 目前还不清楚 不过之前库克 Tim Cook 已经曝光
  • Tomcat的安装配置与使用,及常用端口大全

    如果有兴趣了解更多相关知识 可以来我的个人博客看看 eyes 的个人空间 零 Tomcat的介绍 Tomcat是Apache 软件基金会的Jakarta 项目中的一个核心项目 由Apache Sun 和其他一些公司及个人共同开发而成 由于有
  • NDK Android平台openSLES音频采集和播放

    Android平台使用openSLES采集麦克风音频代码实现 链接 https edu csdn net learn 38258 606150 spm 1003 2001 3001 4157 Android平台使用openSLES播放PCM
  • 记一次elasticSearch同步数据失败:blocked by: [FORBIDDEN/12/index read-only / allow delete (api)]

    记一次elasticSearch同步数据失败的原因 报错内容 org elasticsearch cluster block ClusterBlockException blocked by FORBIDDEN 12 index read
  • 晶振PCB layout注意事项

    晶振 想必大家都了解 为系统提供时钟的基本信号的一种器件 在电路设计尤其是手机电路设计时并不是很复杂 但是一旦到了后期调试时 却往往会发现 晶振带来的问题却不少 其实 一个良好的layout 可以让晶振少为项目带来点麻烦 所以呢 借此讲一讲
  • 用OpenCV的SVM实现简单的手势识别(切水果)[附源码]

    基于HOG特征的SVM分类器实现 在机器学习领域 支持向量机SVM Support Vector Machine 是一个有监督的学习模型 通常用来进行模式识别 分类 以及回归分析 方向梯度直方图 Histogram of Oriented