实战 | 实时手部关键点检测跟踪(附完整源码+代码详解)

《博主简介》

小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。
更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~
👍感谢小伙伴们点赞、关注!

《------往期经典推荐------》

一、AI应用软件开发实战专栏【链接】

项目名称项目名称
1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】
3.【手势识别系统开发】4.【人脸面部活体检测系统开发】
5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】
7.【YOLOv8多目标识别与自动标注软件开发】8.【基于YOLOv8深度学习的行人跌倒检测系统】
9.【基于YOLOv8深度学习的PCB板缺陷检测系统】10.【基于YOLOv8深度学习的生活垃圾分类目标检测系统】
11.【基于YOLOv8深度学习的安全帽目标检测系统】12.【基于YOLOv8深度学习的120种犬类检测与识别系统】
13.【基于YOLOv8深度学习的路面坑洞检测系统】14.【基于YOLOv8深度学习的火焰烟雾检测系统】
15.【基于YOLOv8深度学习的钢材表面缺陷检测系统】16.【基于YOLOv8深度学习的舰船目标分类检测系统】
17.【基于YOLOv8深度学习的西红柿成熟度检测系统】18.【基于YOLOv8深度学习的血细胞检测与计数系统】
19.【基于YOLOv8深度学习的吸烟/抽烟行为检测系统】20.【基于YOLOv8深度学习的水稻害虫检测与识别系统】
21.【基于YOLOv8深度学习的高精度车辆行人检测与计数系统】22.【基于YOLOv8深度学习的路面标志线检测与识别系统】
23.【基于YOLOv8深度学习的智能小麦害虫检测识别系统】24.【基于YOLOv8深度学习的智能玉米害虫检测识别系统】
25.【基于YOLOv8深度学习的200种鸟类智能检测与识别系统】26.【基于YOLOv8深度学习的45种交通标志智能检测与识别系统】
27.【基于YOLOv8深度学习的人脸面部表情识别系统】28.【基于YOLOv8深度学习的苹果叶片病害智能诊断系统】
29.【基于YOLOv8深度学习的智能肺炎诊断系统】30.【基于YOLOv8深度学习的葡萄簇目标检测系统】
31.【基于YOLOv8深度学习的100种中草药智能识别系统】32.【基于YOLOv8深度学习的102种花卉智能识别系统】
33.【基于YOLOv8深度学习的100种蝴蝶智能识别系统】34.【基于YOLOv8深度学习的水稻叶片病害智能诊断系统】
35.【基于YOLOv8与ByteTrack的车辆行人多目标检测与追踪系统】36.【基于YOLOv8深度学习的智能草莓病害检测与分割系统】
37.【基于YOLOv8深度学习的复杂场景下船舶目标检测系统】38.【基于YOLOv8深度学习的农作物幼苗与杂草检测系统】
39.【基于YOLOv8深度学习的智能道路裂缝检测与分析系统】40.【基于YOLOv8深度学习的葡萄病害智能诊断与防治系统】
41.【基于YOLOv8深度学习的遥感地理空间物体检测系统】42.【基于YOLOv8深度学习的无人机视角地面物体检测系统】
43.【基于YOLOv8深度学习的木薯病害智能诊断与防治系统】44.【基于YOLOv8深度学习的野外火焰烟雾检测系统】
45.【基于YOLOv8深度学习的脑肿瘤智能检测系统】46.【基于YOLOv8深度学习的玉米叶片病害智能诊断与防治系统】
47.【基于YOLOv8深度学习的橙子病害智能诊断与防治系统】48.【车辆检测追踪与流量计数系统】
49.【行人检测追踪与双向流量计数系统】

二、机器学习实战专栏【链接】,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】持续更新中~~
六、YOLO性能对比专栏【链接】,持续更新中~

《------正文------》

引言

手部关键点检测是计算机视觉领域的一项重要技术,主要用于识别与定位手部在图像或视频中的关键位置点,如指关节和手腕等。通过精确识别这些关键点,我们可以获取到手部的精确姿态和手势信息。

手部关键点检测在许多领域都有着广泛的应用可能性。例如,在人机交互中,通过检测用户的手部关键点和手势,计算机可以实现无触摸的交互界面,这对于虚拟现实(VR)和增强现实(AR)应用尤为重要。此外,在健康医疗领域,可以通过对患者手部的关键点检测,来评估和诊断一些由手部动作异常引发的疾病,如帕金森氏症等。再比如,手部关键点检测也可以用于机器人视觉系统,通过对人手的识别和理解,使得机器人能更好地协作和交互。它还在手语识别、动作捕捉、游戏控制等场景找到了广泛应用。

本文介绍了一个基于OpenCV和cvzone库的实时手部跟踪系统,附全部源码,并对源码内容进行了详细讲解。

实现步骤详解

实现效果
在这里插入图片描述

摄像头初始化

import cv2

# 初始化摄像头以捕捉视频
# 通常 '0' 指内置摄像头
cap = cv2.VideoCapture(0)

摄像头初始化:通过cv2.VideoCapture(0)初始化摄像头,通常情况下0代表默认摄像头,但这里设置为2,意味着可能连接了多个摄像头,选择第三个摄像头作为输入源。

手部检测器配置

# 初始化 HandDetector 类并设置参数
detector = HandDetector(staticMode=False,  # 非静态模式,持续检测
                        maxHands=2,         # 最多检测两只手
                        modelComplexity=1,  # 手部识别模型复杂度
                        detectionCon=0.5,   # 手部检测的最小置信度
                        minTrackCon=0.5)    # 追踪的最小置信度

创建HandDetector对象,配置参数如最大检测手数、模型复杂度、检测和追踪的最小置信度,这些参数平衡了检测速度和准确性。

实时帧处理循环

实时帧处理循环:程序进入一个无限循环,不断从摄像头读取视频帧。对于每一帧进行:
手部检测:利用findHands方法检测画面中的手部,同时根据配置参数在图像上绘制手部轮廓和关键点。

# 实时从摄像头获取帧
while True:
    # 读取每一帧图像
    # 'success' 表示是否成功捕获,'img' 存储捕获的图像
    success, img = cap.read()

    # 在当前帧中寻找手部
    # 'draw' 参数决定是否在图像上绘制手部关键点和边界框
    # 'flipType' 翻转图像,便于某些检测操作
    hands, img = detector.findHands(img, draw=True, flipType=True)

获取关键点并计算手指间距

手指计数:对每只检测到的手,使用fingersUp方法计算并打印出抬起的手指数。

# 计算第一只手抬起的手指数量
        fingers1 = detector.fingersUp(hand1)
        print(f'H1 = {fingers1.count(1)}', end=" ")  # 输出抬起手指的数量

手指间距离计算:计算第一只手的食指和中指指尖之间的距离,并在图像上用特定颜色标出。

 # 定位食指和中指指尖
        tipOfIndexFinger = lmList1[8][0:2]
        tipOfMiddleFinger = lmList1[12][0:2]

        # 计算并绘制食指与中指指尖间的距离
        length, info, img = detector.findDistance(tipOfIndexFinger, tipOfMiddleFinger, img, color=(255, 0, 255), scale=5)

双手中指距离计算:如果有两只手被检测到,还计算两只手的食指指尖之间的距离,同样在图像上标出。

# 计算第二只手抬起的手指数量
            fingers2 = detector.fingersUp(hand2)
            print(f'H2 = {fingers2.count(1)}', end=" ")

            # 定位第二只手的食指指尖
            tipOfIndexFinger2 = lmList2[8][0:2]

            # 计算并绘制两只手食指指尖间的距离
            length, info, img = detector.findDistance(tipOfIndexFinger, tipOfIndexFinger2, img, color=(255, 0, 0), scale=10)

图像显示

# 显示处理后的图像
    cv2.imshow("图像", img)

    # 保持窗口打开,等待1毫秒后显示下一帧
    cv2.waitKey(1)

使用imshow函数在名为"图像"的窗口中显示处理后的图像。

整个程序的核心在于利用HandDetector类提供的功能来实时检测和分析手部特征。这使得它能够应用于各种应用场景,如手势识别、游戏控制、无障碍交互等。通过实时更新图像并显示手部信息,用户可以直观地看到手部检测和分析的结果。

完成源码

# 导入所需库
from cvzone.HandTrackingModule import HandDetector
import cv2

# 初始化摄像头以捕捉视频
# 通常 '0' 指内置摄像头
cap = cv2.VideoCapture(0)

# 初始化 HandDetector 类并设置参数
detector = HandDetector(staticMode=False,  # 非静态模式,持续检测
                        maxHands=2,         # 最多检测两只手
                        modelComplexity=1,  # 手部识别模型复杂度
                        detectionCon=0.5,   # 手部检测的最小置信度
                        minTrackCon=0.5)    # 追踪的最小置信度

# 实时从摄像头获取帧
while True:
    # 读取每一帧图像
    # 'success' 表示是否成功捕获,'img' 存储捕获的图像
    success, img = cap.read()

    # 在当前帧中寻找手部
    # 'draw' 参数决定是否在图像上绘制手部关键点和边界框
    # 'flipType' 翻转图像,便于某些检测操作
    hands, img = detector.findHands(img, draw=True, flipType=True)

    # 检查是否检测到手
    if hands:
        # 获取第一只手的信息
        hand1 = hands[0]           # 第一只手
        lmList1 = hand1["lmList"]  # 21个关键点坐标列表
        bbox1 = hand1["bbox"]      # 手部边界框坐标
        center1 = hand1['center']  # 手心中心点坐标
        handType1 = hand1["type"]  # 手型("Left" 或 "Right")

        # 计算第一只手抬起的手指数量
        fingers1 = detector.fingersUp(hand1)
        print(f'H1 = {fingers1.count(1)}', end=" ")  # 输出抬起手指的数量

        # 定位食指和中指指尖
        tipOfIndexFinger = lmList1[8][0:2]
        tipOfMiddleFinger = lmList1[12][0:2]

        # 计算并绘制食指与中指指尖间的距离
        length, info, img = detector.findDistance(tipOfIndexFinger, tipOfMiddleFinger, img, color=(255, 0, 255), scale=5)

        # 检查是否有第二只手
        if len(hands) == 2:
            # 获取第二只手的信息
            hand2 = hands[1]
            lmList2 = hand2["lmList"]
            bbox2 = hand2["bbox"]
            center2 = hand2['center']
            handType2 = hand2["type"]

            # 计算第二只手抬起的手指数量
            fingers2 = detector.fingersUp(hand2)
            print(f'H2 = {fingers2.count(1)}', end=" ")

            # 定位第二只手的食指指尖
            tipOfIndexFinger2 = lmList2[8][0:2]

            # 计算并绘制两只手食指指尖间的距离
            length, info, img = detector.findDistance(tipOfIndexFinger, tipOfIndexFinger2, img, color=(255, 0, 0), scale=10)

        print()  # 打印换行,提高输出可读性

    # 显示处理后的图像
    cv2.imshow("图像", img)

    # 保持窗口打开,等待1毫秒后显示下一帧
    cv2.waitKey(1)

好了,这篇文章就介绍到这里,喜欢的小伙伴感谢给点个赞和关注,更多精彩内容持续更新~~
关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何理解GTX发送通道的用户接口?(高速收发器二)

前文讲解了高速收发器的QPLL及CPLL和差分时钟相关内容,如下图所示。本文就打开高速收发器通道的内部结构,进行简要讲解。 图21GTXE2_CHANNEL原始拓扑 收发器的内部框图如下所示,上半部分是发送通道,下半部分是接收通道&#xff0c…

Matlab实现分段函数拟合(分段点未知)| 源码分享 | 视频教程 | 三种分段函数拟合方法

专栏导读 作者简介:工学博士,高级工程师,专注于工业软件算法研究本文已收录于专栏:《复杂函数拟合案例分享》本专栏旨在提供 1.以案例的形式讲解各类复杂函数拟合的程序实现方法,并提供所有案例完整源码;2.…

STM32 VS Code 扩展用户指南

系列文章目录 前言 一、视频教程快速入门 通过我们简单易学的视频教程,快速掌握新版本的使用方法: 二、功能描述 2.1 创建/导入项目 STM32 VS Code 扩展提供两种不同的项目创建选项: STM32CubeMX 项目: 这是一个依靠 CMake 作为…

(三十六)第 6 章 树和二叉树(二叉树的顺序存储表示实现)

1. 背景说明 2. 示例代码 1) errorRecord.h // 记录错误宏定义头文件#ifndef ERROR_RECORD_H #define ERROR_RECORD_H#include <stdio.h> #include <string.h> #include <stdint.h>// 从文件路径中提取文件名 #define FILE_NAME(X) strrchr(X, \\) ? str…

web前端学习笔记7-iconfont使用

7. iconfont的使用流程 字体图标使用较多的是阿里巴巴iconfont图标库,它是阿里巴巴体验团队推出的图标库和图标管理平台,提供了大量免费和可定制的矢量图标,以满足网页设计、平面设计、UI设计、应用程序开发和其他创意项目的需求。 官方网站:https://www.iconfont.cn/ 使用…

可视化数据报道:Kompas.ai如何用图表和动态效果讲述故事

在数字化时代&#xff0c;数据无处不在&#xff0c;而如何将这些数据转化为易于理解且吸引人的故事&#xff0c;成为信息传递的关键。数据可视化作为一种强有力的工具&#xff0c;能够帮助观众快速把握复杂信息的要点&#xff0c;增强记忆&#xff0c;并激发情感共鸣。本文将深…

【BUUCTF】[RoarCTF 2019]Easy Java1

工具&#xff1a;hackbar发包&#xff0c;bp抓包。 解题步骤&#xff1a;【该网站有时候send不了数据&#xff0c;只能销毁靶机重试】 这里的登录界面是个天坑【迷魂弹】 直接点击help&#xff0c;然后进行打开hackbar——通过post请求&#xff0c;再通过bp抓包&#xff0c;…

2. 外婆都称赞的基于Jaeger的Span模型改造

前言 我们的目标是基于Jaeger来实现分布式链路追踪的Java客户端工具包&#xff0c;实际就是一个Springboot的Starter&#xff0c;在1. 看完这篇文章我奶奶都懂Opentracing了一文中我们详细的学习了一下Opentracing的相关概念以及阅读了相关的源码&#xff0c;同时特别重要的是…

深度剖析Comate智能产品:科技巧思,实用至上

文章目录 Comate智能编码助手介绍Comate应用场景Comate语言与IDE支持 Comate安装步骤Comate智能编码使用体验代码推荐智能推荐生成单测注释解释注释生成智能问答 Comate实战演练总结 Comate智能编码助手介绍 市面上现在有很多智能代码助手&#xff0c;当时互联网头部大厂百度也…

2024年5月软考,别再傻傻啃书了!

备考2024年软考&#xff0c;不听课也不刷题&#xff0c;只是看教材的话&#xff0c;想要考试通过&#xff0c;几乎是不可能的&#xff0c;特别是基础比较薄弱的考生。 为什么只看教材通不过&#xff1f; 如果只是把教材从头到尾看一遍&#xff0c;毫无目的地看书&#xff0c;…

神经网络与深度学习--网络优化与正则化

文章目录 前言一、网络优化1.1网络结构多样性1.2高维变量的非凸优化1.鞍点2.平坦最小值3.局部最小解的等价性 1.3.改善方法 二、优化算法2.1小批量梯度下降法&#xff08;Min-Batch&#xff09;2.2批量大小选择2.3学习率调整1.学习率衰减&#xff08;学习率退火&#xff09;分段…

ogv转mp4怎么转?只需3个步骤~

OGV&#xff08;Ogg Video&#xff09;是一种开源的视频文件格式&#xff0c;起源于对数字媒体领域的开放标准的需求。作为Ogg多媒体容器的一部分&#xff0c;OGV的设计初衷是提供一种自由、高质量的视频编码方案&#xff0c;以满足多样化的应用需求。 支持打开MP4文件格式的软…

Windows+clion+protobuf+cmake实现protobuf的使用(被折磨了两天半)

针对protobuf源码和protoc的编译有很多博客写了,这里就不说了。但是很少看到在clion上配置的,因为这个要写cmake文件,本人是小白,学习了cmake之后才懂怎么搞。出现众多链接错误,这次展示一下有效的配置文件。(protobuf 3.21.6,当前最高版本是26.1我也不知道这个版本是怎…

XSKY SDS 6.4 重磅更新:NFS 性能飙升 3 倍,对象多站点等 10 多项功能强势升级

近日&#xff0c;XSKY星辰天合发布了 XSKY SDS V6.4 新版本&#xff0c;该版本在文件的性能提升、对象容灾能力完善方面改进异常显著&#xff0c;同时也大幅提高了存储系统的安全特性&#xff0c;适配更多的信创软硬件生态。 近来&#xff0c;软件定义存储&#xff08;SDS&…

win11更新过后偶尔出现网卡详细信息为空

鼠标右键网卡属性&#xff0c;看下是不是多了一个Network LightWeight Filter 前面对号取消然后确定就能获取到IP了 详情请自行查看百度文库

细胞自动机与森林火灾与燃烧模拟

基于 元胞自动机-森林火灾模拟_vonneumann邻域-CSDN博客 进行略微修改&#xff0c;解决固定方向着火问题&#xff0c;用了一个meshv2数组记录下一状态&#xff0c;避免旧状态重叠数据失效。 参数调整 澳洲森林火灾蔓延数学建模&#xff0c;基于元胞自动机模拟多模式下火灾蔓延…

Saving Environment to FAT... Card did not respond to voltage select!

在移植uboot到全志H3时&#xff0c;出现了错误&#xff1a; Saving Environment to FAT… Card did not respond to voltage select! 判定与MMC有关。 同时还有报错&#xff1a; Error: ethernet1c30000 address not set. No ethernet found. 查看源码发现这与环境变量有关&am…

2024蓝桥杯CTF writeUP--爬虫协议

Dirsearch扫描网站 发现robots.txt文件 访问 直接去最后一个接口 到手

市场公关人的日常工作是什么?

作为一个从事多年的市场公关人&#xff0c;每到别人放假的时候就是我们最忙的时候&#xff0c;手上几个KOL项目安排探店&#xff0c;同时还要筹备品牌VIP活动。扎堆的事情每天忙得睁眼就是工作。 基本上来说&#xff0c;公关人是挺苦逼的&#xff0c;并没有大家看上去那么光鲜…

超级大转盘!(html+less+js)(结尾附代码)

超级大转盘&#xff01;&#xff08;结尾附代码&#xff09; 网上看到有人用转盘抽奖&#xff0c;怀疑是不是有问题&#xff0c;为什么每次都中不了&#xff0c;能不能整个转盘自己想中啥中啥&#xff0c;查阅了网上写得好的文章&#xff0c;果然实现了只中谢谢参与&#xff0…