Python使用Opencv图像处理方法完成手势识别(一)

news2024/11/15 21:44:59

Opencv完成手势识别

  • HSV的提取
  • 特征提取
  • 轮廓绘制
  • 完整代码

由于是使用Opencv完成手势识别,所以首先利用颜色特征是对手的颜色进行提取,获得HSV的最小值与最大值。

HSV的提取

HSV颜色空间阈值主要是靠Trackbar调节阈值和cv2.inRange来生成掩膜来提取。
这是我写的HSV阈值获取的代码:

import cv2
import numpy as np

def MouseBack(value):
    pass

cv2.namedWindow('frams')
cv2.resizeWindow('frams',[400,400])

Video=cv2.VideoCapture(0)

cv2.createTrackbar('minH','frams',0,179,MouseBack)
cv2.createTrackbar('maxH','frams',179,179,MouseBack)
cv2.createTrackbar('minS','frams',0,255,MouseBack)
cv2.createTrackbar('maxS','frams',255,255,MouseBack)
cv2.createTrackbar('minV','frams',0,255,MouseBack)
cv2.createTrackbar('maxV','frams',255,255,MouseBack)

while True:
    res,img=Video.read()
    hsvimg=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    
    minh=cv2.getTrackbarPos('minH','frams')
    maxh=cv2.getTrackbarPos('maxH','frams')    
    mins=cv2.getTrackbarPos('minS','frams')
    maxs=cv2.getTrackbarPos('maxS','frams')
    minv=cv2.getTrackbarPos('minV','frams')
    maxv=cv2.getTrackbarPos('maxV','frams')
    
    lowHSV=np.array((minh,mins,minv),np.uint8)
    highHSV=np.array((maxh,maxs,maxv),np.uint8)
    
    newimg=cv2.inRange(hsvimg,lowHSV,highHSV)
    newimg=cv2.bitwise_and(img,img,mask=newimg)
    
    cv2.imshow('frams',newimg)
    
    if cv2.waitKey(1) == ord('q'):
        print(lowHSV)
        print(highHSV)
        break
        
Video.release()       
cv2.destroyAllWindows()

使用方法:
运行代码之后,从第一个依次调节滑块,使画面中只有手显示出来。然后按Q退出界面打印阈值。
效果如下:
在这里插入图片描述

特征提取

准备工作做完,就可以开始进行图像处理了。可以先对单张图片进行处理。

  1. 首先是进行高斯滤波去噪
  2. 然后将图像从BGR转换到HSV
  3. 使用cv2.inRange获得掩膜
  4. 进行形态学操作进一步提取特征
    代码如下:
#读取图片
img=cv2.imread(img_path)
#高斯滤波
Gaussimg=cv2.GaussianBlur(img,[5,5],0)
#HSV转换
hsvimg=cv2.cvtColor(Gaussimg,cv2.COLOR_BGR2HSV)
#获得HSV掩膜
maskimg=cv2.inRange(hsvimg,lowHSV,highHSV)
#开运算
kernel=np.ones([3,3],dtype=np.uint8)
closeimg=cv2.morphologyEx(maskimg,cv2.MORPH_CLOSE,kernel,iterations=3)
#腐蚀
kernel=np.ones([5,5],dtype=np.uint8)
dilateimg=cv2.morphologyEx(closeimg,cv2.MORPH_DILATE,kernel,iterations=3)

效果如下:
在这里插入图片描述

轮廓绘制

轮廓绘制首先需要寻找轮廓,然后对轮廓特征,比如面积周长进行进一步过滤,最后对轮廓进行逼近,对轮廓进行逼近有两种。

  1. 轮廓近似cv2.approxPolyDP
  2. 轮廓凸包cv2.convexHull
contours,num=cv2.findContours(newimg,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
    area=cv2.contourArea(contour)
    lenth=cv2.arcLength(contour,True)
    if area>20000 and lenth>1000:
        epsilon = 0.02*cv2.arcLength(contour,True)
        approx1 = cv2.approxPolyDP(contour,epsilon,True)
        approx2=cv2.convexHull(contour)
        approx1=approx1.reshape(len(approx1),2)
        approx2 = approx2.reshape(len(approx2), 2)
        approx1=np.array(approx1,dtype=np.int32)
        approx2 = np.array(approx2, dtype=np.int32)
        cv2.polylines(faimg, [approx1], True, [255, 125, 100], 4, 16)
        cv2.polylines(f, [approx2], True, [255, 125, 100], 4, 16)

效果如下:
在这里插入图片描述

完整代码

import cv2
import numpy as np

highHSV=np.array([ 15 ,255,255])
lowHSV=np.array([ 0 ,50 ,50])

def img_hand(img):
    # if img.shape[0]>1000 and img.shape[1]>1000:
    #     img=cv2.resize(img,None,fx=0.2,fy=0.2)
    faimg=np.copy(img)
    img=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
    cv2.GaussianBlur(img,[5,5],0)
    img=cv2.inRange(img,lowHSV,highHSV)

    kernel=np.ones([3,3],dtype=np.uint8)
    img=cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel,iterations=1)
    kernel=np.ones([5,5],dtype=np.uint8)
    newimg=cv2.morphologyEx(img,cv2.MORPH_DILATE,kernel,iterations=1)

    contours,num=cv2.findContours(newimg,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    for contour in contours:
        area=cv2.contourArea(contour)
        lenth=cv2.arcLength(contour,True)
        if area>20000 and lenth>1000:
            epsilon = 0.02*cv2.arcLength(contour,True)
            approx = cv2.approxPolyDP(contour,epsilon,True)
            approx=approx.reshape(len(approx),2)
            approx=np.array(approx,dtype=np.int32)
            cv2.polylines(faimg, [approx], True, [255, 125, 100], 4, 16)
    return faimg

video=cv2.VideoCapture(0)
while video.isOpened():
    res,img=video.read()
    if res== True:
        newimg=img_hand(img)
        cv2.imshow('frams',newimg)
    if cv2.waitKey(1)==ord('q'):
        break

cv2.destroyAllWindows()
video.release()

由于不使用机器学习方法,缺点就是使用时手往前靠一点,头往后靠一点,防止脸的肤色与手混淆,下一章讲解如何识别不同手势。

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

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

相关文章

外汇天眼:外汇市场上不得不说的两大类庄家!

前一阵子,天眼君跟好友讨论外汇市场上有没有庄家,今天天眼君就跟大家探讨下这个问题。我们都知道股票交易中是有所谓的庄家的,散户必须要猜测庄家的做法,否则很有可能变成待割的韭菜。 而我们常见的对外宣传中,基本上…

R语言对推特twitter数据进行文本情感分析

原文链接:http://tecdat.cn/?p4012我们以R语言抓取的推特数据为例,对数据进行文本挖掘,进一步进行情感分析,从而得到很多有趣的信息(点击文末“阅读原文”获取完整代码数据)。找到推特来源是苹果手机或者安…

C++ Reference: Standard C++ Library reference: Containers: list: list: assign

C官网参考链接&#xff1a;https://cplusplus.com/reference/list/list/assign/ 公有成员函数 <list> std::list::assign C98 范围 (1) template <class InputIterator> void assign (InputIterator first, InputIterator last); 填充 (2) void assign (…

字符串处理【AC自动机】 - 原理 AC自动机详解

字符串处理【AC自动机】 - 原理 AC自动机详解 AC自动机&#xff08;Aho-Corasick automaton&#xff09;在1975年产生于贝尔实验室&#xff0c;是著名的多模匹配算法。 学习AC自动机&#xff0c;要有KMP和Trie&#xff08;字典树&#xff09;的基础知识。 KMP是单模匹配算法&a…

三代全长16s助攻,轻松搞定水体研究领域10+文章

基于PacBio三代测序平台&#xff0c;可高效获得16s rRNA全长序列&#xff0c;同时不必纠结引物选择带来的结果偏差&#xff0c;令物种分类更多更精准——到达“种”水平。Pacbio平台同时兼具时间短&#xff0c;无需扩增等优势&#xff0c;伴随着三代测序成本的下降&#xff0c;…

<VSCode下载、安装、配置以及连接云服务器进行Linux开发>

目录 1.下载、安装VSCode 2.配置环境及插件 2.1 实用插件安装 2.1.1 中文汉化插件 2.1.2 Remote-ssh插件​ 连接远程云服务器&#xff1a; 远程云服务器开发&#xff1a; Xshell界面与VSCode界面对比&#xff1a; 2.1.3 C/C Extension Pack&#xff08;C/C扩展包&#xff0…

Java实现后端跨域的常见解决方式

目录一、搭建服务&#xff08;cross-server&#xff09;1.1、maven依赖1.2、接口1.3、配置二、搭建服务&#xff08;cross-web&#xff09;2.1、maven依赖2.2、接口2.3、页面2.4、配置2.5、跨域请求结果2.6、常见跨域情况三、解决方案3.1、通过 CrossOrigin 注解3.2、通过配置类…

Kafka高级特性解析之主题

1、管理 使用kafka-topics.sh脚本&#xff1a; 选项说明--config <String: namevalue>为创建的或修改的主题指定配置信息。支持下述配置条目&#xff1a; cleanup.policycompression.typedelete.retention.msfile.delete.delay.msflush.messagesflush.msfollower.repli…

不影响1,4丁炔二醇(BYD)的情况下去除铜离子的工艺

1,4-丁炔二醇BYD&#xff08;but-2-yne-1,4-diol&#xff09;是一种重要的中间体化工原料&#xff0c;广泛应用于生产丁二醇及其下游产品、维生素B6的主要原料&#xff0c;还可以用于镀镍的增亮剂、防腐抑制剂等领域。 1,4&#xff0d;丁二醇&#xff08;BDO&#xff09;是一种…

(附源码)ssm人才市场招聘信息系统 毕业设计 271621

基于jsp的人才市场招聘信息系统的设计与实现 摘 要 人才市场招聘信息系统采用B/S结构、java开发语言、以及Mysql数据库等技术。系统主要分为管理员、用户、两部分&#xff0c;管理员管理主要功能包括&#xff1a;首页&#xff0c;站点管理&#xff08;轮播图、公告栏&#xf…

实验(七):串行口实验

一、实验目的与任务 实验目的&#xff1a; 1&#xff0e;运行Keil开发环境&#xff0c;完成串行口通信软件编程&#xff1b; 2&#xff0e;利用单片机串行口方式1与主机通信&#xff0c;建立Proteus仿真模型。 3&#xff0e;完成系统仿真与调试。。 任务&#xff1a; 1.根据要求…

mongodb 存引擎及配置

上次我们分享到了 wiredTiger 引擎以及他对于以前默认的 MMAPV1 引擎的优势 关于 wiredTiger 引擎 配置这里补充一下&#xff1a; storage:journal:enabled: truedbPath: /data/xiaomotong/mongo1/directoryPerDB: trueengine: wiredTigerwiredTiger:engineConfig:cacheSizeGB:…

Kotlin 开发Android app(二十):悬浮框WindowManager和动画AnimationDrawable

安卓的悬浮框&#xff0c;悬浮框相当于对桌面的一种控制&#xff0c;在安卓中是允许这样的自定义的小窗体出现在桌面的&#xff0c;其实这种小桌面可以使某些应用调用起来非常的方便&#xff0c;而动画的展现使得程序看起来更加有爱。 悬浮框 悬浮框的使用&#xff0c;通常是跟…

【负荷预测】长短期负荷预测(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f389;作者研究&#xff1a;&#x1f3c5;&#x1f3c5;&#x1f3c5;主要研究方向是电力系统和智能算法、机器学…

Python学习-8.1.3 标准库(turtle库的基础与实例)

2.3 turtle库 turtle库是能够进行基本的图形绘制的标准库。 turtle库包含100多个功能函数&#xff0c;主要包括三类&#xff1a;窗体函数、画笔运动函数、画笔状态函数 2.3.1 窗体函数 注&#xff1a;像素是指组成图像的小方格&#xff0c;每个小方格都有一个明确的位置和被…

图解LeetCode——1812. 判断国际象棋棋盘中一个格子的颜色(难度:简单)

一、题目 给你一个坐标 coordinates &#xff0c;它是一个字符串&#xff0c;表示国际象棋棋盘中一个格子的坐标。下图是国际象棋棋盘示意图。 如果所给格子的颜色是白色&#xff0c;请你返回 true&#xff0c;如果是黑色&#xff0c;请返回 false 。 给定坐标一定代表国际象…

少走弯路 → PlantUML网站推荐

PlantUML官网 Real World PlantUML 建议画图前从这里拷贝模板 PlantUML在线编辑 虽然简洁但是比官网好用的多 PlantUML 在线编辑器画面美观推荐使用 文章目录类图类图 一直都没搞懂 关联&#xff0c;依赖&#xff0c;组合&#xff0c;聚合的关系&#xff0c;看了视频稍微…

hdfs-over-ftp使用说明

hdfs-over-ftp使用说明 一、介绍 hdfs-over-ftp可以将hdfs文件系统通过ftp服务方式暴露出来,可以通过ftp客户端下载和上传hadoop文件。 二、编译及安装配置 原作者很久不更新了https://github.com/iponweb/hdfs-over-ftp 如果要支持hadoop2、hadoop3需要自己编译&#xff1b;可…

阿里妈妈展示广告召回之多场景建模算法

丨目录&#xff1a; 摘要 背景 方法 实验分析 总结 参考文献1. 摘要工业推荐系统通常拥有多个业务场景&#xff0c;并需要同时为这些场景提供推荐服务。在召回阶段&#xff0c;从大量商品库中选出的个高质量商品需要针对不同场景进行相应调整。以阿里妈妈展示广告为例&#xf…

认识 MySQL数据库和Redis缓存的数据一致性问题

文章目录1. 什么是数据的一致性2. 数据不一致情况及应对策略3. 数据一致性中需要注意的其他问题有哪些&#xff1f;1. 什么是数据的一致性 “数据一致”一般指的是&#xff1a;缓存中有数据&#xff0c;缓存的数据值 数据库中的值。 但根据缓存中是有数据为依据&#xff0c;…