【计算机视觉】手势识别

手势识别是计算机视觉领域中的重要方向,通过对摄像机采集的手部相关的图像序列进行分析处理,进而识别其中的手势,手势被识别后用户就可以通过手势来控制设备或者与设备交互。完整的手势识别一般有手的检测和姿态估计、手部跟踪和手势识别等。

一、手掌检测

import cv2
import mediapipe as mp

# 初始化 MediaPipe 手部模型
mp_hands = mp.solutions.hands
hands = mp_hands.Hands()

# 初始化视频流
cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    
    if not ret:
        break
    
    # 转换为 RGB
    rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    
    # 获取手部关键点
    results = hands.process(rgb_frame)
    
    # 如果检测到手部
    if results.multi_hand_landmarks:
        for landmarks in results.multi_hand_landmarks:
            # 绘制手部关键点
            mp.solutions.drawing_utils.draw_landmarks(frame, landmarks, mp_hands.HAND_CONNECTIONS)
    
    # 显示图像
    cv2.imshow('Hand Detection', frame)

    # 按 'q' 键退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
cap.release()
cv2.destroyAllWindows()

这段代码是一个简单的手部检测应用程序,使用了 OpenCV 和 MediaPipe 库来实时检测和绘制手部关键点。下面是对代码的详细解释:

1. 导入必要的库
import cv2
import mediapipe as mp
  • cv2 是 OpenCV 的 Python 接口库,用于图像处理和计算机视觉任务。
  • mediapipe 是 Google 提供的一个跨平台框架,用于实现高效的计算机视觉任务,这里用它来做手部关键点检测。
2. 初始化 MediaPipe 手部模型
mp_hands = mp.solutions.hands
hands = mp_hands.Hands()
  • mp_hands 是 MediaPipe 提供的手部检测模块。通过 mp.solutions.hands 访问。
  • hands = mp_hands.Hands() 创建了一个 Hands 对象,用于进行手部检测。它会自动处理图像中的手部检测、手部关键点识别和跟踪。
3. 初始化视频流
cap = cv2.VideoCapture(0)
  • cv2.VideoCapture(0) 打开了计算机的默认摄像头(0表示第一个摄像头)。返回的 cap 对象用于读取视频流。
4. 开始处理视频流
while True:
    ret, frame = cap.read()
    
    if not ret:
        break
  • cap.read() 从摄像头读取一帧图像并返回两个值:retframeret 是布尔值,表示图像是否成功读取,frame 是当前帧的图像。
  • 如果 retFalse,则说明读取图像失败,程序退出循环。
5. 转换图像为 RGB
rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
  • OpenCV 使用 BGR(蓝绿红)色彩空间,而 MediaPipe 要求输入图像为 RGB(红绿蓝)色彩空间。因此,我们用 cv2.cvtColor 将图像从 BGR 转换为 RGB。
6. 处理图像以检测手部关键点
results = hands.process(rgb_frame)
  • hands.process(rgb_frame) 将 RGB 图像传递给 MediaPipe 的 Hands 模型进行处理。
  • results 包含了检测到的手部信息,包括手部关键点的位置。如果图像中没有手部,results.multi_hand_landmarks 会是空的。
7. 绘制手部关键点
if results.multi_hand_landmarks:
    for landmarks in results.multi_hand_landmarks:
        mp.solutions.drawing_utils.draw_landmarks(frame, landmarks, mp_hands.HAND_CONNECTIONS)
  • results.multi_hand_landmarks 是一个包含所有检测到的手的关键点位置的列表。如果检测到手部,它会返回一个非空列表。
  • landmarks 是每个手部的关键点集合,每个关键点是一个 (x, y, z) 坐标。
  • mp.solutions.drawing_utils.draw_landmarks(frame, landmarks, mp_hands.HAND_CONNECTIONS) 将每个手的关键点绘制到 frame 图像上,并且连接关键点,形成手的骨架结构。mp_hands.HAND_CONNECTIONS 用于连接不同的关键点。
8. 显示处理后的图像
cv2.imshow('Hand Detection', frame)
  • cv2.imshow 显示处理后的图像(frame)。窗口的标题是 ‘Hand Detection’。
9. 按键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
    break
  • cv2.waitKey(1) 等待键盘输入,1 表示等待 1 毫秒。返回值是按下键的 ASCII 码。
  • 如果按下 q 键,ord('q') 的值与 cv2.waitKey(1) 返回值相等,程序就会退出循环,停止视频流。
10. 释放资源并关闭窗口
cap.release()
cv2.destroyAllWindows()
  • cap.release() 释放摄像头资源。
  • cv2.destroyAllWindows() 关闭所有 OpenCV 显示的窗口。

二、手关键点估计

要进行手关键点估计,可以使用 MediaPipe 库来进行高效的手部检测,结合 OpenCV 来进行图像处理和显示。这里将展示一个基于 MediaPipe 手部模型的手关键点估计的完整代码。

MediaPipe 提供了一个预训练的模型来检测手部的 21 个关键点,包括手指关节和手掌部位。我们将使用 MediaPipe 提供的 Hands 模块来检测手部关键点。

import cv2
import mediapipe as mp

# 初始化 MediaPipe 手部检测模型
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(min_detection_confidence=0.7, min_tracking_confidence=0.5)
mp_drawing = mp.solutions.drawing_utils

# 打开摄像头
cap = cv2.VideoCapture(0)

while True:
    # 读取每一帧图像
    ret, frame = cap.read()
    
    if not ret:
        print("无法获取视频帧")
        break
    
    # 将图像转换为 RGB 格式,MediaPipe 需要 RGB 输入
    rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    
    # 获取手部关键点检测结果
    results = hands.process(rgb_frame)
    
    # 如果检测到手部
    if results.multi_hand_landmarks:
        for landmarks in results.multi_hand_landmarks:
            # 绘制手部关键点和连接线
            mp_drawing.draw_landmarks(frame, landmarks, mp_hands.HAND_CONNECTIONS)

            # 获取并显示每个关键点的坐标
            for idx, landmark in enumerate(landmarks.landmark):
                h, w, c = frame.shape
                cx, cy = int(landmark.x * w), int(landmark.y * h)
                cv2.putText(frame, str(idx), (cx, cy), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1, cv2.LINE_AA)
                cv2.circle(frame, (cx, cy), 5, (0, 0, 255), -1)  # 绘制红色的关键点

    # 显示图像
    cv2.imshow('Hand Keypoint Estimation', frame)

    # 按 'q' 键退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放摄像头资源并关闭窗口
cap.release()
cv2.destroyAllWindows()
1.代码解释
  1. 初始化 MediaPipe 手部模型

    • 使用 mp.solutions.hands.Hands() 创建手部检测模型,min_detection_confidence=0.7min_tracking_confidence=0.5 表示最低的检测和追踪置信度阈值,适用于动态环境中。
  2. 打开摄像头

    • 使用 cv2.VideoCapture(0) 打开计算机的默认摄像头,并获取实时视频流。
  3. 图像转换

    • OpenCV 默认使用 BGR 色彩空间,但 MediaPipe 需要 RGB 色彩空间,因此使用 cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) 将图像转换为 RGB 格式。
  4. 处理图像并获取手部关键点

    • hands.process(rgb_frame) 用于处理图像并检测手部关键点。results 对象包含手部信息,如果检测到手部,results.multi_hand_landmarks 将返回手部的 21 个关键点的位置。
  5. 绘制关键点和连接线

    • mp_drawing.draw_landmarks(frame, landmarks, mp_hands.HAND_CONNECTIONS) 绘制手的 21 个关键点以及它们之间的连接线(即手指的骨架)。
    • landmarks.landmark 包含了每个关键点的 (x, y, z) 坐标,其中 xy 是图像中的像素坐标,z 是深度信息(在 3D 空间中的位置,但对于 2D 图像可忽略)。
  6. 显示关键点坐标

    • 对于每个关键点,通过 cv2.putText 在图像上显示关键点的索引。cv2.circle 用来在图像上绘制关键点位置。
  7. 显示视频流

    • 使用 cv2.imshow() 来显示处理过的每一帧图像,展示检测到的手部关键点。
  8. 退出条件

    • 按下 q 键退出程序并释放摄像头资源。
2.手部关键点索引

MediaPipe 的 Hands 模型检测手部的 21 个关键点,索引如下(从 0 到 20):

  • 0: 手腕
  • 1: 大拇指根部
  • 2: 大拇指第一关节
  • 3: 大拇指第二关节
  • 4: 大拇指尖端
  • 5: 食指根部
  • 6: 食指第一关节
  • 7: 食指第二关节
  • 8: 食指尖端
  • 9: 中指根部
  • 10: 中指第一关节
  • 11: 中指第二关节
  • 12: 中指尖端
  • 13: 无名指根部
  • 14: 无名指第一关节
  • 15: 无名指第二关节
  • 16: 无名指尖端
  • 17: 小指根部
  • 18: 小指第一关节
  • 19: 小指第二关节
  • 20: 小指尖端

三、实例

YOLO(You Only Look Once)是一个非常强大的目标检测算法,特别适用于实时应用。它将目标检测任务转化为一个回归问题,能够快速且准确地检测图像中的目标物体。虽然 YOLO 本身并没有直接针对手部关键点估计的功能,但可以用它来检测手部区域,然后结合其他模型(比如 MediaPipe 或深度学习的关键点检测模型)来进行手关键点估计。

  1. YOLO 检测手部:首先用 YOLO 模型检测图像中的手部位置,YOLO 会输出手部的边界框。
  2. 手部关键点估计:然后,我们可以通过一个手部关键点估计模型(如 MediaPipe 或自定义深度学习模型)来进一步估计手部的 21 个关键点。
import cv2
import torch
import mediapipe as mp

# 初始化 MediaPipe 手部检测模型
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(min_detection_confidence=0.7, min_tracking_confidence=0.5)
mp_drawing = mp.solutions.drawing_utils

# 加载 YOLOv5 模型(选择合适的模型大小)
model = torch.hub.load('ultralytics/yolov5', 'yolov5s')  # 'yolov5s' 是一个小型的 YOLOv5 模型

# 打开摄像头
cap = cv2.VideoCapture(0)

while True:
    # 读取每一帧图像
    ret, frame = cap.read()
    
    if not ret:
        print("无法获取视频帧")
        break
    
    # 使用 YOLOv5 检测图像中的物体(包括手部)
    results = model(frame)  # 检测结果,包括边界框、标签、置信度等

    # 提取 YOLOv5 检测到的手部(通常手部被标记为 0 或其他标签,依赖于训练数据)
    # 获取所有检测到的物体的边界框
    hands_detections = results.xyxy[0]  # 获取检测结果,xyxy 形式 [x_min, y_min, x_max, y_max, confidence, class]
    for detection in hands_detections:
        if detection[5] == 0:  # 类别 0 代表手部(具体根据训练数据集而定)
            x_min, y_min, x_max, y_max = map(int, detection[:4])

            # 在图像上绘制手部边界框
            cv2.rectangle(frame, (x_min, y_min), (x_max, y_max), (255, 0, 0), 2)

            # 提取手部区域并进行手部关键点估计
            hand_region = frame[y_min:y_max, x_min:x_max]
            rgb_hand_region = cv2.cvtColor(hand_region, cv2.COLOR_BGR2RGB)

            # 使用 MediaPipe 估计手部关键点
            hand_results = hands.process(rgb_hand_region)

            # 如果检测到手部关键点
            if hand_results.multi_hand_landmarks:
                for landmarks in hand_results.multi_hand_landmarks:
                    # 绘制手部关键点和连接线
                    mp_drawing.draw_landmarks(frame, landmarks, mp_hands.HAND_CONNECTIONS)
                    for idx, landmark in enumerate(landmarks.landmark):
                        h, w, c = frame.shape
                        cx, cy = int(landmark.x * w), int(landmark.y * h)
                        cv2.putText(frame, str(idx), (cx, cy), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 1, cv2.LINE_AA)
                        cv2.circle(frame, (cx, cy), 5, (0, 0, 255), -1)  # 绘制红色的关键点

    # 显示图像
    cv2.imshow('Hand Detection and Keypoint Estimation', frame)

    # 按 'q' 键退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放摄像头资源并关闭窗口
cap.release()
cv2.destroyAllWindows()
1.代码解析
  1. 加载 YOLOv5 模型
    • torch.hub.load('ultralytics/yolov5', 'yolov5s') 载入 YOLOv5 模型,yolov5s 是一个小型的 YOLOv5 模型,适合实时应用。可以根据需求选择 yolov5myolov5l(更大的模型,精度更高但速度较慢)。
  2. 读取摄像头视频流
    • 使用 cv2.VideoCapture(0) 打开摄像头并读取每一帧图像。
  3. YOLOv5 物体检测
    • 使用 model(frame) 进行图像检测,返回一个 results 对象,其中包含检测到的边界框、类别标签、置信度等信息。
  4. 提取手部区域
    • 如果 YOLO 检测到手部(通过检测类别标号),提取手部的区域并将其转化为 RGB 格式(因为 MediaPipe 需要 RGB 输入)。
  5. MediaPipe 手部关键点估计
    • 使用 hands.process(rgb_hand_region) 进行手部关键点估计,返回手部的关键点信息。
    • 使用 mp_drawing.draw_landmarks() 绘制手部的 21 个关键点和连接线。
  6. 结果显示
    • 将检测到的手部边界框、关键点及连接线显示在视频流上。
  7. 退出条件
    • 按下 q 键退出程序。

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

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

相关文章

VPC2-多域攻击-tomcat渗透-通达oa-域控提权-密码喷射-委派攻击-数据库提权

下载链接: https://pan.baidu.com/s/1nUYj6G9ouj6BcumDgoDaGg 提取码: ejbn jishu域 windows 2008 tomcat渗透 访问发现tomcat 点击manage app 尝试弱口令进入,发现tomcat/tomcat成功进入 用哥斯拉生成后门 然后建立一个文件夹,把它放进去,把它改名…

删除链表的倒数第N个节点 力扣19

一、题目 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: 输入:head [1], n 1 输出:[]示例 3&a…

yoloV5的学习-pycharm版本

真的很让人气愤的一点,老师把我的pycharm给卸载了,我那个上面不仅有gpu-torch,还有gpu-torch,他给俺删了,删了很久,我心都碎了,过几天我就去找他负责,让他给我装回来我的环境&#x…

安防监控/视频集中存储EasyCVR视频汇聚平台如何配置AI智能分析平台的接入?

EasyCVR安防视频监控平台不仅支持AI边缘计算智能硬件设备的接入,还能快速集成AI智能分析平台,接收来自智能分析平台或设备的AI告警信息,如烟火检测、周界入侵检测、危险区域闯入检测、安全帽/反光衣佩戴检测等。 本文将详细介绍如何在EasyCVR…

【漫话机器学习系列】111.指数之和的对数(Log-Sum-Exp)

在计算机科学和机器学习中,经常会遇到计算指数和的对数的情况,例如: 然而,由于指数函数 的值增长极快,直接计算可能会导致数值上溢(overflow)或下溢(underflow)&#xf…

【决策树】分类属性的选择

文章目录 1.信息增益(ID3)2.信息增益率(C4.5)3.基尼指数(CART)ps.三者对比 实现决策树算法最关键的一点就是如何从所有的特征属性中选择一个最优的属性对样本进行分类,这种最优可以理解为希望划…

【tplink】校园网接路由器如何单独登录自己的账号,wan-lan和lan-lan区别

老式路由器TPLINK,接入校园网后一人登录,所有人都能通过连接此路由器上网,无法解决遂上网搜索,无果,幸而偶然看到一个帖子说要把信号源网线接入路由器lan口,开启新世界。 一、wan-lan,lan-lan区…

ubuntu部署gitlab-ce及数据迁移

ubuntu部署gitlab-ce及数据迁移 进行前梳理: 在esxi7.0 Update 3 基础上使用 ubuntu22.04.5-server系统对 gitlab-ce 16.10进行部署,以及将gitlab-ee 16.9 数据进行迁移到gitlab-ce 16.10 进行后总结: 起初安装了极狐17.8.3-jh 版本(不支持全局中文,就没用了) …

电源测试系统有哪些可以利用AI工具的科技??

AI技术的发展对电源模块测试系统的影响是深远的,不仅协助系统提升了测试效率和精度,还推动了测试方法的创新和智能化。那么在电源测试系统中哪些模块可以利用AI工具实现自动化测试? 1. 自动化测试与效率提升 智能测试流程优化 AI算法可以自动优化测试…

京准电钟:NTP校时服务器于安防监控系统应用方案

京准电钟:NTP校时服务器于安防监控系统应用方案 京准电钟:NTP校时服务器于安防监控系统应用方案 NTP校时服务器在安防监控系统中的应用方案主要通过高精度时间同步技术,解决设备间时间差异问题,确保日志、录像等数据的时间一致性…

C# Unity 唐老狮 No.5 模拟面试题

本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: 全部 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho 如果你发现了文章内特殊的字体格式,…

STL——list的介绍和模拟实现

前言 本篇博客我们将要开始介绍list这个容器,list是带头双向循环链表,STL标准模板库中实现了list这样方便我们去使用,那么本篇博客我们将脱下list的神秘外衣,介绍它的使用以及模拟实现。 list的介绍 list的底层是带头双向循环链…

飞鱼动画笔记

1.鱼身体:左右移动先转动身体(与飞机类似) 2.眼睛/嘴巴:绿色等腰三角形的底边和顶点,就是眼睛骨骼旋转弧线经过点 3.鱼鳍和鱼尾:使用springmagic插件制作波浪动画再微调 4.腹部

全面了解机器学习:回归、分类、分割与检测任务

在机器学习的广袤天地中,回归任务和分类任务构成了基础的两大支柱,而分割任务与检测任务则是在此基础上衍生出的重要应用方向。 机器学习的基础任务 回归任务 回归预测是监督学习中的一个重要任务,旨在预测连续数值。线性回归是最简单和最…

【论文阅读笔记】SL-YOLO(2025/1/13) | 小目标检测 | HEPAN、C2fDCB轻量化模块

目录 摘要 1 引言 2 相关工作 3 方法 3.1 为小目标检测增加一个头 3.2 优化网络结构 3.3 改进轻量化模块 3.3.1 C2fDCB 3.3.2 SCDown 4 实验 4.1 数据集 4.2 实验环境 4.3 与其他模型的比较 4.4 消融研究 ▲不同网络结构的分析 ▲不同模块的分析 ▲不同降采样…

进化算法和智能控制国际学术研讨会(ISEAIC 2025)

重要信息 官网:www.icaace.net(了解参会投稿等) 时间:2025年3月21-23日 地点:中国-上海-上海古井假日酒店 简介 2025进化算法和智能控制国际学术研究会议(ISEAIC 2025)是2025第八届先进算法…

SpringAI 调用本地ollama大模型

pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0…

【二.提示词工程与实战应用篇】【1.提示词工程入门:AI对话的艺术】

大家好,今天咱们来聊聊一个特别有意思的话题——提示词工程。你可能已经听说过这个词,或者在使用AI工具时不经意间接触过它。但提示词工程到底是什么?它为什么这么重要?咱们今天就来深入探讨一下,看看它是如何影响我们与AI的对话,以及如何在实际应用中发挥作用的。 什么…

C++:类和对象(下篇)

1. 再谈构造函数 1.1 构造函数体赋值 在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;} private:int _year;int _mont…

【计算机网络】考研复试高频知识点总结

文章目录 一、基础概念1、计算机⽹络的定义2、计算机⽹络的目标3、计算机⽹络的组成4、计算机⽹络的分类5、计算机⽹络的拓扑结构6、计算机⽹络的协议7、计算机⽹络的分层结构8、OSI 参考模型9、TCP/IP 参考模型10、五层协议体系结构 二、物理层1、物理层的功能2、传输媒体3、 …