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

news2024/11/24 12:55:08

《博主简介》

小伙伴们好,我是阿旭。专注于人工智能、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)

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

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

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

相关文章

排名第一的电脑监控软件,电脑监控软件就选这款了

广受好评的电脑监控软件确实有很多选择,排名第一的只有一个,以下推荐几款备受认可的电脑监控软件,它们各自具有独特的特点和优势: 第一名,安企神 特点与优势:安企神是一款功能全面的IT资产管理和电脑桌面监…

Web前端三大主流框架是什么?

Web前端开发领域的三大主流框架分别是Angular、React和Vue.js。它们在Web开发领域中占据着重要的地位,各自拥有独特的特点和优势。 Angular Angular是一个由Google开发的前端框架,最初版本称为AngularJS,后来升级为Angular。它是一个完整的…

ChIP-seq or CUTTag,谁能hold住蛋白质与DNA互作主战场?

DNA与蛋白质的相互作用作为表观遗传学中的一个重要领域,对理解基因表达调控、DNA复制与修复、表观遗传修饰(组蛋白修饰)及染色质结构等基本生命过程至关重要。 自1983年James Broach首次公布染色质免疫共沉淀(ChIP)技…

备战人工智能大赛!卓翼飞思实验室启动机器人挑战赛赛事培训

一.大赛培训通知 本月起,卓翼飞思实验室将针对机器人任务挑战赛(无人协同系统)赛项内容开启赛事培训计划,采用“线上线下”相结合的培训模式,围绕赛事关键技术,让您轻松应对比赛。 5月8日进行第一期培训&am…

LLM——大语言模型完整微调策略指南

1、 概述 GPT-4、LaMDA、PaLM等大型语言模型(LLMs)以其在广泛主题上的深入理解和生成高度类人文本的能力而闻名遐迩,它们在全球范围内引起了广泛关注。这些模型的预训练过程涉及对来自互联网、书籍和其他来源的数十亿词汇的海量数据集进行学…

技术分享 | 京东商品API接口|京东零售数据可视化平台产品实践与思考

导读 本次分享题目为京东零售数据可视化平台产品实践与思考。 主要包括以下四个部分: 1.京东API接口介绍 2. 平台产品能力介绍 3. 业务赋能案例分享 01 京东API接口介绍 02 平台产品能力介绍 1. 产品矩阵 数据可视化产品是一种利用数据分析和可视化技术&…

Tuxera NTFS for Mac Mac用户无缝地读写NTFS格式的硬盘和U盘

在数字化时代,数据交换和共享变得日益重要。然而,对于Mac用户来说,与Windows系统之间的文件交换可能会遇到一些挑战。这是因为Mac OS默认不支持Windows常用的NTFS文件系统。幸运的是,Tuxera NTFS for Mac为我们提供了一个优雅的解…

APP广告变现:自刷的秘密与规则

在移动互联网时代,广告已成为众多APP盈利的主要方式之一。对于开发者和运营者而言,如何通过广告变现提高收益是他们必须关注的问题。然而,在众多的变现方法中,“自刷广告”这一概念可能让一些人感到迷惑。实际上,只要在…

详细讲解lua中string.gsub的使用

string.gsub 是 Lua 标准库中的一个函数,用于全局替换字符串中的某些部分。string.gsub 是 Lua 中非常实用的一个函数,它可以用来进行字符串的处理和替换操作。 它的基本语法如下: string.gsub(s, pattern, replacement [, n])s 是要处理的…

c++11 标准模板(STL)本地化库 - 平面类别(std::numpunct) - 定义数值标点规则

本地化库 本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析&#xff0c;以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C 标准库的其他组件的行为。 平面类别 定义数值标点规则 std::numpunct template< class CharT >…

【Python】一道字典题目

题目&#xff1a;输入一段文本&#xff0c;统计每个字符的个数 in_inputinput(“输入&#xff1a;”) dic{} for char in in_input: if char in dic: dic[char]1 # 字典添加键值对的方法&#xff0c;给字典给键和值的方法 else: dic[char]1 print(dic) 输出台&#xff1a;

PY计算生态是什么?

Python 的计算生态指的是与 Python 相关的广泛的软件、库、框架和工具集合. 它们为各种计算任务提供了丰富的解决方案和支持。Python 作为一种简洁、易学、功能强大的编程语言&#xff0c;在科学计算、数据分析、人工智能、机器学习等领域都有着强大的影响力。以下是 Python 计…

有哪些有效的复习方法可以帮助备考软考?

软考目前仍然是一个以记忆为主、理解为辅的考试。学过软考的朋友可能会感到困惑&#xff0c;因为软考的知识在日常工作中有许多应用场景&#xff0c;需要理解的地方也很多。但为什么我说它是理解为辅呢&#xff1f;因为这些知识点只要记住了&#xff0c;都不难理解&#xff0c;…

程序员离不开的8款开发软件(必备)

在数字化时代&#xff0c;程序员扮演着关键的角色&#xff0c;他们的工作不仅仅是编写代码&#xff0c;更是创造了无限可能的世界。而要让这个创造过程更加高效和愉悦&#xff0c;选择适合自己的开发工具和软件是至关重要的。 今天&#xff0c;我将为大家介绍一些程序员爱不释…

数字孪生涉及到的前沿技术:虚拟现实 人工智能 区块链 边缘计算。

数字孪生是各类技术的综合应用&#xff0c;除了咱们常见的传感器、数据采集、清洗、传输、建模、可视化技术外&#xff0c;还有还有一些前沿技术&#xff0c;会让数字孪生更加强大和智能&#xff0c;本文介绍几个。 虚拟现实&#xff08;Virtual Reality&#xff0c;VR&#x…

浅谈C++ overload(重载) override(覆盖) overwrite(重写)

目录 1. 名词辨析2 含义解析1 overload重载2 override覆盖3 overwrite重写 3 区别4 代码示例 1. 名词辨析 关于这3个名词的中文翻译&#xff1a; overload翻译为重载&#xff0c;基本是没有歧义的&#xff1b;override和overwrite的翻译&#xff0c;我在参考了cppreference中…

华为OD机试【告警抑制】(java)(100分)

1、题目描述 告警抑制&#xff0c;是指高优先级告警抑制低优先级告警的规则。 高优先级告警产生后&#xff0c;低优先级告警不再产生。 请根据原始告警列表和告警抑制关系&#xff0c;给出实际产生的告警列表。 不会出现循环抑制的情况。 告警不会传递&#xff0c;比如A ->…

OV证书——企业网站的第一选择

据官方数据统计&#xff0c;从2024年开始OV证书的签发量远远超过DV证书的签发量&#xff0c;越来越多的企业网站摒弃了基础的DV证书&#xff0c;选择更高级别的OV证书。 但是其价格相对于DV证书来说要高几百甚至上千元&#xff0c;这里推荐性价比很高的JoySSL&#xff0c;他们…

北交所佣金费率标准是多少?北交所相关信息科普

北交所的佣金费率并非固定不变&#xff0c;而是可以根据投资者的需求和证券公司的政策进行调整。目前北交所的佣金费率最低是万分之二。 一般来说&#xff0c;北交所的佣金费率默认在万分之三左右&#xff0c;但这不是固定的费率。根据证券公司的不同&#xff0c;佣金费率可以…

六西格玛项目的核心要素:理论学习、实践应用与项目经验

许多朋友担心&#xff0c;没有项目经验是否就意味着无法考取六西格玛证书。针对这一疑问&#xff0c;张驰咨询为大家详细解答。 首先&#xff0c;需要明确的是&#xff0c;六西格玛项目不仅仅是一种管理工具或方法&#xff0c;更是一种追求卓越、持续改进的思维方式。它强调通…