【OpenCV-Python实战项目】26-实时手部跟踪

news2024/11/16 2:30:12

0 介绍

目的:使用mediapipe库做手部的实时跟踪
检测流程:(1)手掌检测;(2)手掌特征检测在这里插入图片描述
手掌特征分布:mediapipe手掌特征分布如下:
在这里插入图片描述

1.环境要求

后续代码运行环境(跟教程略有版本上的差异):
opencv-python 4.7.0.72
mediapipe 0.10.14

2.代码

import cv2  			#图像处理库
import mediapipe as mp  #手部跟踪库
import time  
  
# 将手部检测封装成类
class handDetector():  
    def __init__(self, mode=False, maxHands=2, model_complexity=1,detectionCon=0.5, trackCon=0.5):
        self.mode = mode  
        self.maxHands = maxHands  
        self.model_complexity=model_complexity #注意此处,低版本无此参数
        self.detectionCon = detectionCon  
        self.trackCon = trackCon  
        
        self.mpHands = mp.solutions.hands  
        self.hands = self.mpHands.Hands(self.mode, self.maxHands, self.model_complexity,self.detectionCon, self.trackCon)# 注意多了一个模块参数
        self.mpDraw = mp.solutions.drawing_utils  
  	# 检测全部手掌并绘制相应的手部特征
    def findHands(self, img, draw=True):  
        imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  
        self.results = self.hands.process(imgRGB)  
        if self.results.multi_hand_landmarks:  
            for handLms in self.results.multi_hand_landmarks:  
                if draw:  
                    self.mpDraw.draw_landmarks(img, handLms, self.mpHands.HAND_CONNECTIONS)  
        return img  
        
    # 对第handNo编号的手掌进行特殊绘制处理
    def findPosition(self, img, handNo=0, draw=True):  
        lmList = []  
        if self.results.multi_hand_landmarks:  
            myHand = self.results.multi_hand_landmarks[handNo]
            for id, lm in enumerate(myHand.landmark):  
                h, w, c = img.shape  
                cx, cy = int(lm.x * w), int(lm.y * h)
                lmList.append([id, cx, cy])
                if draw:
                    cv2.circle(img, (cx, cy), 5, (255, 0, 255), cv2.FILLED)
        return lmList

  
def test():
   
    pTime = 0  
    detector = handDetector()  
    cap = cv2.VideoCapture('test.mp4')  #可以替换为实时镜头
    cv2.namedWindow("Image", cv2.WINDOW_NORMAL)  
    cv2.resizeWindow("Image", 800, 600)  
    
  
    while True:  
        success, img = cap.read()  
        print(success)
        if not success:  
            break  
  
        img = detector.findHands(img)  
        lmList = detector.findPosition(img,draw=True)
  
        cTime = time.time()  
        fps = 1 / (cTime - pTime) if (cTime - pTime) != 0 else 0  
        pTime = cTime  
        cv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 255), 3)  
        cv2.imshow("Image", img)  
  
        if cv2.waitKey(1) & 0xFF == ord('q'):  
            break  
  
    cap.release()  
    cv2.destroyAllWindows()  
  
if __name__ == "__main__":  
    test()

4.参考

(1)B站视频-实时手部跟踪视频教程
(2)gitee代码仓库
(3)教程源地址cv zone(1)(2)均来自此正式教程。

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

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

相关文章

力扣SQL50 换座位

Problem: 626. 换座位 👨‍🏫 参考题解 Code SELECT(CASEWHEN MOD(id, 2) ! 0 AND counts ! id THEN id 1WHEN MOD(id, 2) ! 0 AND counts id THEN idELSE id - 1END) AS id,student FROMseat,(SELECTCOUNT(*) AS countsFROMseat) AS seat_counts O…

电测量数据交换DLMSCOSEM组件第53部分:DLMSCOSEM应用层(中)

2.综述 (续上篇) 上篇地址:http://t.csdnimg.cn/DBKrg 2.2DLMS/COSEM应用层主要特点 2.2.1DLMS/COSEM应用层结构 DLMS/COSEM AL的主要部件是应用服务对象(ASO)。它给其服务用户提供服务(COSEM应用进程),并使用支撑层提供的服务。客户机和服务器侧都包含三个必…

Image Caption评估指标深入理解

前言:刚开始做图像描述的任务就整理了这些评估指标,时间久远有点记不清怎么具体实现原理了,结果面试的时候就问了这个问题,没答上来,郁闷了很久,还是基础不扎实,浅浅记录一下 文章目录 BLEUROUG…

C语言的结构体

结构体定义 结构体指针

【优选算法】滑动窗口——leetcode——串联所有单词的⼦串(hard)

目录 1.题目 2,算法原理 ​编辑 1.哈希表 2.left和right指针的移动 3.滑动窗口的执行次数 3.代码实现 1.C代码 2.C语言代码 4.C知识点 1. std::vector 2. std::string 3. std::unordered_map 4. 迭代器 5. 范围循环 (range-based for loop) 6. 动…

0基础学会无代码在亚马逊云科技AWS上利用LLM和智慧体(Agent)开发客服机器人

简介: 小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案,帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践,并应用到自己的日常工作里。 本次介绍的是如何利用亚马逊云科技大模型托管服…

【解决方法】git clone出现 curl 56 OpenSSL SSL_read: Connection was reset, errno 10054

当我们克隆别人的项目出现以下提示信息时候 remote: Enumerating objects: 7095, done. error: RPC failed; curl 56 OpenSSL SSL_read: Connection was reset, errno 10054 error: 2292 bytes of body are still expected fetch-pack: unexpected disconnect while reading s…

Python(C++)大尺度分层边值时变图统计推理并行算法

🎯要点 🎯分层结构制定生成模型 | 🎯贝叶斯模型选择程序 | 🎯分层结构图的信息性 | 🎯分层模型适应实值边协变量的网络 | 🎯分层模型适应时变网络,划分层对应于检测变化点 | 🎯定义…

Python中15个让你代码更优雅的上下文管理器用法

文末赠免费精品编程资料~~ 今天,我们要探索的是Python中一个超级实用又往往被低估的特性——上下文管理器。这可不是普通的魔法,它能让你的代码更加整洁、安全,还能自动处理资源,就像变魔术一样。准备好,让我们一起揭…

一分多行列转换(Gbase版)

1、源数据表结构 CREATE TABLE "sf_ref_pd_config" ("I_BATCH_NO" decimal(5,0) DEFAULT NULL COMMENT 批次ID,"V_ASSET_CLASS_NAME" varchar(200) DEFAULT NULL COMMENT 资产类型,"N_EXEC_ID" decimal(5,0) DEFAULT NULL COMMENT 执…

pyjwt:Python 中的 JWT 处理专家

文章目录 探索 pyjwt:Python 中的 JWT 处理专家简介:为何选择 pyjwt?什么是 pyjwt?安装 pyjwtpyjwt 的基本使用1. 编码JWT2. 解码JWT3. 验证签名4. 过期时间5. 自定义头部 场景应用场景一:用户登录场景二:A…

深度学习的数据类型总结

文章目录 1.基本概念1.比特(bit):2. **字节**(Byte):2. **数据类型**: 2. 相互转化 1.基本概念 1.比特(bit): 计算机中最小的数据存储单位,用 0 和 1 表示。信息传输速…

python制作一个AI聊天机器人-【python教程】教你用python制作一个AI聊天机器人,源码可分享,零基础也能实现!

要制作一个基本的AI聊天机器人,我们可以使用Python的多个库,其中一个非常流行且易于上手的是Rasa。一个简单的入门示例,我们可以使用pyttsx3,是一个Python库,用于将文本转换为语音。 它提供了一个简单易用的接口&#…

【ThingsBoard初体验】本地运行源码踩坑记录

前言 运行源码之前,请先编译源码。这很重要!!! 官网源码编译教程:http://www.ithingsboard.com/docs/user-guide/contribution/yuanmabianyi/ 如果编译过程中出现报错,请看我上一篇文章:【Thing…

《LeetCode热题100》---<滑动窗口篇两道>

本篇博客讲解LeetCode热题100道滑动窗口篇中的两道题 第一道:无重复字符的最长子串 第二道:找到字符当中的所有字母异位词 第一道:无重复字符的最长子串 哈希滑动窗口 class Solution {public int lengthOfLongestSubstring(String s0) {int…

nginx出现Refused to apply inline style because it violates

Content Security Policy的错误。根据错误提示,nginx拒绝应用内联样式,因为它违反了内容安全策略(Content Security Policy)。内容安全策略是一种浏览器机制,用于防止潜在的安全漏洞,通过限制从外部来源加载…

初步入门C ++之继承的概念

继承 ​ 继承,他的功能就如同他的名字一样,可以继承一个类的数据和方法,然后增添一些自己独有的数据和方法: 根据我们之前讲解初步入门C之类的例子,假如我们现在有一个长方体的类,它和长方型类唯一不一样…

屏幕录制与视频编辑的新纪元Camtasia Studio 2024

在数字化时代,视频已成为我们日常工作和生活中不可或缺的一部分。无论是教育、培训、营销还是娱乐,高质量的视频内容都发挥着至关重要的作用。而提到屏幕录制和视频编辑软件,Camtasia Studio无疑是一个家喻户晓的名字。随着2024年新版本的发布…

【Vue3】自定义组件

【Vue3】自定义组件 背景简介开发环境开发步骤及源码 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的日子。本文…