Python Opencv实践 - 手部跟踪

        使用mediapipe库做手部的实时跟踪,关于mediapipe的介绍,请自行百度。

        mediapipe做手部检测的资料,可以参考这里:

MediaPipe Hands: On-device Real-time Hand Tracking 论文阅读笔记 - 知乎论文地址: https://arxiv.org/abs/2006.10214v1Demo地址:https://hand.mediapipe.dev/研究机构: Google Research 会议: CVPR2020 开始介绍之前,先贴一个模型的流程图,让大家对系统架构有个整体的概念 0. 摘…icon-default.png?t=N7T8https://zhuanlan.zhihu.com/p/431523776MediaPipe基础(4)Hands(手)_mediapipe hands-CSDN博客文章浏览阅读1.2w次,点赞6次,收藏66次。1.摘要在各种技术领域和平台,感知手的形状和运动的能力是改善用户体验的重要组成部分。例如,它可以构成手语理解和手势控制的基础,还可以在增强现实中将数字内容和信息叠加在物理世界之上。虽然对人们来说很自然,但强大的实时手部感知绝对是一项具有挑战性的计算机视觉任务,因为手经常遮挡自己或彼此(例如手指/手掌遮挡和握手)并且缺乏高对比度模式。MediaPipe Hands 是一种高保真手和手指跟踪解决方案。它采用机器学习 (ML) 从单个帧中推断出手的 21 个 3D 地标。当前最先进的方法主要依赖于强大的桌面环_mediapipe handshttps://blog.csdn.net/weixin_43229348/article/details/120530937

        做手部跟踪时需要搞清楚手部的landmarks,如下图:

         需要安装mediapipe,直接使用pip install mediapipe即可。

        关于mediapipe.solution.hands的构造方法参数简单说明如下:

        static_image_mode为True的话表示只做检测,为False表示当置信度低于阈值时会做检测,如果跟踪的置信度较好则不做检测只做跟踪。

        max_num_hands参数就是其意思,最大检测的手数量

        min_detection_confidence最小检测置信度阈值,高于此值为检测成功,默认0.5

        min_tracking_confidence最小跟踪置信度阈值,高于此值表示手部跟踪成功,默认0.5

        

        代码如下,仅供参考:

import cv2 as cv
import mediapipe as mp
import timeclass HandDetector():def __init__(self, mode=False,maxNumHands=2,modelComplexity=1,minDetectionConfidence=0.5,minTrackingConfidence=0.5):self.mode = modeself.maxNumHands = maxNumHandsself.modelComplexity = modelComplexityself.minDetectionConfidence = minDetectionConfidenceself.minTrackingConfidence = minTrackingConfidence#创建mediapipe的solutions.hands对象self.mpHands = mp.solutions.handsself.handsDetector = self.mpHands.Hands(self.mode, self.maxNumHands, self.modelComplexity, self.minDetectionConfidence, self.minTrackingConfidence)#创建mediapipe的绘画工具self.mpDrawUtils = mp.solutions.drawing_utilsdef findHands(self, img, drawOnImage=True):#mediapipe手部检测器需要输入图像格式为RGB#cv默认的格式是BGR,需要转换imgRGB = cv.cvtColor(img, cv.COLOR_BGR2RGB)#调用手部检测器的process方法进行检测self.results = self.handsDetector.process(imgRGB)#print(results.multi_hand_landmarks)#如果multi_hand_landmarks有值表示检测到了手if self.results.multi_hand_landmarks:#遍历每一只手的landmarksfor handLandmarks in self.results.multi_hand_landmarks:if drawOnImage:self.mpDrawUtils.draw_landmarks(img, handLandmarks, self.mpHands.HAND_CONNECTIONS)return img;#从结果中查询某只手的landmark listdef findHandPositions(self, img, handID=0, drawOnImage=True):landmarkList = []if self.results.multi_hand_landmarks:handLandmarks = self.results.multi_hand_landmarks[handID]for id,landmark in enumerate(handLandmarks.landmark):#处理每一个landmark,将landmark里的X,Y(比例)转换为帧数据的XY坐标h,w,c = img.shapecenterX,centerY = int(landmark.x * w), int(landmark.y * h)landmarkList.append([id, centerX, centerY])if (drawOnImage):#将landmark绘制成圆cv.circle(img, (centerX,centerY), 8, (0,255,0), cv.FILLED)return landmarkListdef DisplayFPS(img, preTime):curTime = time.time()if (curTime - preTime == 0):return curTime;fps = 1 / (curTime - preTime)cv.putText(img, "FPS:" + str(int(fps)), (10,70), cv.FONT_HERSHEY_PLAIN,3, (0,255,0), 3)return curTimedef main():video = cv.VideoCapture('../../SampleVideos/hand.mp4')#FPS显示preTime = 0handDetector = HandDetector()while True:ret,frame = video.read()if ret == False:break;frame = handDetector.findHands(frame)hand0Landmarks = handDetector.findHandPositions(frame)#if len(hand0Landmarks) != 0:#print(hand0Landmarks)preTime = DisplayFPS(frame, preTime)cv.imshow('Real Time Hand Detection', frame)if cv.waitKey(1) & 0xFF == ord('q'):break;video.release()cv.destroyAllWindows()if __name__ == "__main__":main()

        运行效果:

Python Opencv实践 - 手部跟踪

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

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

相关文章

Echarts自定义样式实现3D柱状图-长方体-圆柱体,两种样式

Echarts自定义样式实现3D柱状图-长方体-圆柱体&#xff0c;两种样式 效果图代码series配置项目 效果图 长方体 柱状体 代码 <!--此示例下载自 https://echarts.apache.org/examples/zh/editor.html?cbar3d-dataset&gl1 --> <!DOCTYPE html> <html lang…

解决ESP8266无法退出透传问题以及获取网络时间以及天气方法

网上很多配置ESP8266的教程&#xff0c;但是遇到无法退出透传模式的情况却没有找得到答案&#xff0c;不知道是大家都没遇到还是怎么样&#xff0c;以下是我的解决方法&#xff1a;实测有效 先发送“”&#xff08;三个加号&#xff09;&#xff08;如果是在串口调试助手调试&…

做一个wiki页面是体验HTML语义的好方法

HTML语义&#xff1a;如何运用语义类标签来呈现Wiki网页 在上一篇文章中&#xff0c;我花了大量的篇幅和你解释了正确使用语义类标签的好处和一些场景。那么&#xff0c;哪些场景适合用到语义类标签呢&#xff0c;又如何运用语义类标签呢&#xff1f; 不知道你还记不记得在大…

js 字符串功能转换解析

一. 字符串转换 1.1. 对象转字符串stringify var str JSON.stringify(weather);1.2. 字符串转对象 var obj JSON.parse(str);1.3. 数字转字符串toString() var num 2023; var str ; str num.toString();1.4. 字符串转数字parseInt(string) parseInt(123)&#xff0c;…

LVS负载均衡器(DR模式)+nginx七层代理+tomcat多实例+php+mysql 实现负载均衡以及动静分离、数据库的调用!!!

目录 前言 一、nfs共享存储&#xff0c;为两个节点服务器提供静态网页共享 二、nginx作为lvs的后端节点服务器&#xff0c;完成lo:0网卡配置&#xff0c;以及内核参数设置&#xff0c;还有设置路由表 步骤一&#xff1a;先完成nfs共享存储挂载 步骤二&#xff1a;完成lo:0网…

3.7【窗口】窗口使用示例(创建子窗口)

写在前面 使用 screen_create_window_type() 创建子窗口。 SCREEN_CHILD_WINDOW 类型的窗口必须与父窗口相关联&#xff0c;以便它在显示器上可见。 为了创建一个子窗口&#xff0c;我们需要经历下面的接步骤。 一&#xff0c;为每个上下文和窗口实例创建一个变量 screen_c…

easyexcel常见注解

easyexcel常见注解 一、依赖 <!--阿里巴巴EasyExcel依赖--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.10</version></dependency>二、常见注解 ExcelProperty 注解中…

pytorch梯度更新方法

一、方法1 autograd import torch from torch import autograd demo1x = torch.tensor(1.) a = torch.tensor(1., requires_grad=True) b = torch.tensor(2., requires_grad=True) c = torch.tensor(3., requires_grad=True)y = a ** 2

预选赛补题

B. 求和 一、题目要求 题目描述 zhengys看到了一个题目&#xff1a;给出一个正整数 n&#xff0c;然后给出 n 数&#xff0c;让你求出这 n 个数相加之后的值&#xff0c;但是给出的这 n 个数不一定是十进制的&#xff0c;可能是二进制到十进制之间任意的一种&#xff0c;zhe…

漏洞复现-log4j2原理分析及CVE-2021-44228

log4j2原理分析及漏洞复现 0x01 log4j2简介 Log4j2 是一个用于 Java 应用程序的成熟且功能强大的日志记录框架。它是 Log4j 的升级版本&#xff0c;相比于 Log4j&#xff0c;Log4j2 在性能、可靠性和灵活性方面都有显著的改进。 Log4j2 特点 高性能&#xff1a;Log4j2 使用异步…

心脏 相关的

心脏问题也会导致夜间醒来。研究发现&#xff0c;心脏不适可能在夜间加剧&#xff0c;因为卧床时心脏需要更多努力来泵血。心绞痛或心律不齐等症状若在夜间出现&#xff0c;应引起高度重视。定期心电图检查对于早期发现心脏疾病至关重要。

算法基础之染色法判定二分图

染色法判定二分图 核心思想&#xff1a; 二分图 : 当且仅当图中不含有奇数环(环中边的数量为奇数) 染色法 : 从原点开始染色 1 / 2 当冲突时即含有奇数环 #include <cstring>#include <iostream>#include <algorithm>using namespace std;const int N 10…

TensorRT 简单介绍

一、TensorRT 对于算法工程师来说&#xff0c;相信大家已经对TensorRT耳熟能详了&#xff0c;那么这个TensorRT是什么呢&#xff1f; 其实&#xff0c;TensorRT是一个可以在NVIDIA各种GPU硬件平台下运行的推理引擎&#xff0c;同时也是一个高性能的深度学习推理优化器&#x…

说说Synchronized及实现原理

嗨&#xff0c;大家好&#xff0c;欢迎来到程序猿漠然公众号&#xff0c;我是漠然。 作为Java工程师&#xff0c;我们经常会遇到并发编程的问题。在并发编程中&#xff0c;Synchronized关键字是我们最常用的工具之一。那么&#xff0c;什么是Synchronized&#xff1f;它是如何…

你知道跨站脚本攻击吗?一篇带你了解什么叫做XSS

1.XSS简介 &#xff08;1&#xff09;XSS简介 XSS作为OWASP TOP 10之一。 XSS中文叫做跨站脚本攻击&#xff08;Cross-site scripting&#xff09;&#xff0c;本名应该缩写为CSS&#xff0c;但是由于CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式脚本&#x…

css 美化滚动条

当div内容溢出容器定义的高度时,滚动条显示,并美化默认的滚动条样式 div 容器 <divclass"content">内容 </div>css 样式 /* 问话区域 滚动条 */ .content {overflow: auto;height: 662px;padding: 25px;scrollbar-width: thin; /* 设置滚动条宽度 */bo…

25.JSP标准标签库

JSTL概述 JSTL 全名为 JavaServer Pages Standard TagLibrary,即jsp标准标签库。JSTL 是由 JCP &#xff08;Java Community Process&#xff09;所指定的标准规格&#xff0c;它主要提供给 Java Web 开发人员一个标准通用的标签函数库。 Web 程序开发人员能够利用 J STL 和 E…

【Linux基本指令(2)】

文章目录 一. 基本指令第二回 一. 基本指令第二回 cp指令语法 cp src dst 将目标文件或者目录拷贝到指定目录下或文件下。注意同级目录下&#xff0c;不允许存在同名文件或同名目录。如果将一个file.txt文件拷贝到当前目录下&#xff0c;就重名了&#xff0c;报错cp不了&#…

springboot(ssm华府便利店信息管理系统 超市管理系统Java系统

springboot(ssm华府便利店信息管理系统 超市管理系统Java系统 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xff0…

rouyi-vue-pro+vue3+vite4+Element Plus项目中使用生成Vue2+Element UI标准模板

运行一个pro-vue3的前端项目&#xff0c;以及后端服务 在基础设施-代码生成模块中选择某张数据库表导入&#xff0c;并编辑生成信息&#xff0c;前端类型&#xff1a;Vue2Element UI标准模板 在vue3项目中创建一个vue文件 <template> </template><script>…