当前位置: 首页 > article >正文

计算机视觉进阶教学之Mediapipe库(一)

目录简介一、Mediapipe Python的安装和应用二、手部检测1. 导入必要的库2. 初始化 MediaPipe 组件3. 配置并创建手部检测模型实例4. 启动摄像头并进入主循环5. 绘制检测结果三、手势识别1. 手势识别核心逻辑a. 计算基准距离 (Base Distance)b. 计算各手指尖到手腕的距离c. 判断手指是否伸直并计数d. 处理双手情况简介Mediapipe是google的一个开源项目可以提供开源的、跨平台的常用机器学习(machine learning)方案。Mediapipe实际上是一个集成的机器学习视觉算法的工具库包含了人脸检测、人脸关键点、手势识别、头像分割和姿态识别等各种模型。Mediapipe具备的优点有1支持各种平台和语言包括IOSAndroidCPythonJAVAScriptCoral等2速度快各种模型基本上可以做到实时运行。Mediapipe在实际应用中的例子1人脸检测2FaceMesh从图像/视频中重建出人脸的3D Mesh可以用于AR渲染3人像分割从图像/视频中把人分割出来可用于视频会议如Zoom、钉钉4手势识别和跟踪可以识别标出手部21个关键点的3D坐标5人体姿态识别可以识别标出人体33个关键点的3D坐标。官网地址 https://mediapipe.dev/Github开源项目地址 https://github.com/google/mediapipe一、Mediapipe Python的安装和应用安装python 3.7以上版本下载地址 https://www.python.org/getit安装Mediapipe1)安装OpenCV,终端执行pip install opencv-contrib-python2)安装Mediapipe终端执行pip install mediapipe或者使用国内镜像 pip install mediapipe -i https://pypi.tuna.tsinghua.edu.cn/simple/br具体详细应用可以详细查看官网介绍Mediapipe二、手部检测这段代码实现了一个实时的手部关键点检测系统。它通过电脑的摄像头捕获视频流然后使用 Google 的 MediaPipe 库来识别画面中的人手并实时地在视频上绘制出 21 个手部关键点及其连接关系。1. 导入必要的库import cv2 import mediapipe as mpcv2: 这是 OpenCV 库一个强大的计算机视觉库。在这里它的主要作用是从摄像头捕获视频帧 (cv2.VideoCapture)。在视频帧上绘制文字和关键点 (cv2.putText,cv2.imshow)。处理图像颜色空间 (cv2.cvtColor)。显示视频窗口并等待用户按键 (cv2.imshow,cv2.waitKey)。mediapipe: 这是 Google 开发的一个开源机器学习库特别擅长处理实时感知任务如手部、面部、姿势识别等。2. 初始化 MediaPipe 组件mp_drawing mp.solutions.drawing_utils mp_hands mp.solutions.handsmp.solutions.drawing_utils: 这是 MediaPipe 提供的一个绘图工具包。它包含了方便的函数可以直接在图像上绘制出检测到的关键点landmarks和它们之间的连接connections。mp.solutions.hands: 这是 MediaPipe 的手部检测解决方案。它封装了预训练好的模型可以直接用于检测图像或视频中的人手3. 配置并创建手部检测模型实例hands mp_hands.Hands( static_image_modeFalse, max_num_hands2, min_detection_confidence0.75, min_tracking_confidence0.75) mp.solutions.drawing_utils是一个绘图模块将识别到的手部关键点信息绘制道cv2图像中mp.solutions.drawing_style定义了绘制的风格。 mp.solutions.hands是mediapipe中的手部识别模块可以通过它调用手部识别的api然后通过调用mp_hands.Hands初始化手部识别类。 mp_hands.Hands中的参数 1)static_image_modeTrue适用于静态图片的手势识别Flase适用于视频等动态识别比较明显的区别是若识别的手的数量超过了最大值 True时识别的手会在多个手之间不停闪烁而False时超出的手不会识别系统会自动跟踪之前已经识别过的手。默认值为False; 2)max_num_hands用于指定识别手的最大数量。默认值为2; 3)min_detection_confidence 表示最小检测信度取值为[0.0,1.0]这个值约小越容易识别出手用时越短但是识别的准确度就越差。越大识别的越精准 但是响应的时间也会增加。默认值为0.5; 4)min_tracking_confience 表示最小的追踪可信度越大手部追踪的越准确相应的响应时间也就越长。默认值为0.5。 这是代码中非常关键的一步我们创建了一个Hands类的实例。这个实例就是我们的手部检测器。它接受几个重要的参数来配置其行为static_image_modeFalse:False(动态模式): 适用于视频流。系统会首先尝试检测手如果成功就会切换到更快速的 “追踪” 模式。这大大提高了处理视频时的帧率。如果追踪失败它会自动重新开始检测。True(静态模式): 适用于单张图片。系统会对每一帧都进行完整的检测而不会追踪。这在视频中会非常慢但对于分析静态图片更准确。max_num_hands2: 指定最多可以同时检测的手的数量。这里设置为 2意味着可以同时识别两只手。min_detection_confidence0.75:最小检测置信度。只有当模型对检测结果的置信度概率高于这个值这里是 75%时才会认为成功检测到了一只手。这个值越高误检越少但可能会漏掉一些手势。min_tracking_confidence0.75:最小追踪置信度。在追踪模式下只有当模型对追踪结果的置信度高于这个值时才会继续追踪。如果低于这个值系统会认为追踪丢失并重新启动检测。4. 启动摄像头并进入主循环cap cv2.VideoCapture(0) while True: flag 0 ret, frame cap.read() h,wframe.shape[:2] frame cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 因为摄像头是镜像的所以将摄像头水平翻转 # 不是镜像的可以不翻转 frame cv2.flip(frame, 1) results hands.process(frame) frame cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)5. 绘制检测结果if results.multi_hand_landmarks: for hand_landmarks in results.multi_hand_landmarks: # print(hand_landmarks:, hand_landmarks) # 计算关键点的距离用于判断手指是否伸直 for i in range(len(hand_landmarks.landmark)): x hand_landmarks.landmark[i].x y hand_landmarks.landmark[i].y z hand_landmarks.landmark[i].z # print(x,y,z) cv2.putText(frame, str(i), (int(x*w),int(y*h)), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0),2) # 关键点可视化 mp_drawing.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS) cv2.imshow(MediaPipe Hands, frame) if cv2.waitKey(1) 0xFF 27: break cap.release() cv2.destroyAllWindows()最后我们实现了一个这样的功能三、手势识别这段代码实现了一个实时的手势识别系统能够通过摄像头识别出0 到 10的数字手势即伸出几个手指就识别为相应的数字。它通过分析手部关键点之间的距离来判断每个手指是否伸直然后根据伸直手指的数量来确定手势。import cv2 import mediapipe as mp gesture [none, one, two, three, four, five, six, seven, eight, nine, ten] flag 0 mp_drawing mp.solutions.drawing_utils mp_hands mp.solutions.hands hands mp_hands.Hands( static_image_modeFalse, max_num_hands2, min_detection_confidence0.75, min_tracking_confidence0.75) cap cv2.VideoCapture(0) while True: flag 0 ret, frame cap.read() frame cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 因为摄像头是镜像的所以将摄像头水平翻转 # 不是镜像的可以不翻转 frame cv2.flip(frame, 1) results hands.process(frame) frame cv2.cvtColor(frame, cv2.COLOR_RGB2BGR) # if results.multi_handedness: # for hand_label in results.multi_handedness: # print(hand_label) if results.multi_hand_landmarks: for hand_landmarks in results.multi_hand_landmarks: # print(hand_landmarks:, hand_landmarks) # 计算关键点的距离用于判断手指是否伸直 p0_x hand_landmarks.landmark[0].x p0_y hand_landmarks.landmark[0].y p5_x hand_landmarks.landmark[5].x p5_y hand_landmarks.landmark[5].y distance_0_5 pow(p0_x - p5_x, 2) pow(p0_y - p5_y, 2) base distance_0_5 / 0.6 p4_x hand_landmarks.landmark[4].x p4_y hand_landmarks.landmark[4].y distance_5_4 pow(p5_x - p4_x, 2) pow(p5_y - p4_y, 2) p8_x hand_landmarks.landmark[8].x p8_y hand_landmarks.landmark[8].y distance_0_8 pow(p0_x - p8_x, 2) pow(p0_y - p8_y, 2) p12_x hand_landmarks.landmark[12].x p12_y hand_landmarks.landmark[12].y distance_0_12 pow(p0_x - p12_x, 2) pow(p0_y - p12_y, 2) p16_x hand_landmarks.landmark[16].x p16_y hand_landmarks.landmark[16].y distance_0_16 pow(p0_x - p16_x, 2) pow(p0_y - p16_y, 2) p20_x hand_landmarks.landmark[20].x p20_y hand_landmarks.landmark[20].y distance_0_20 pow(p0_x - p20_x, 2) pow(p0_y - p20_y, 2) if distance_0_8 base: flag 1 if distance_0_12 base: flag 1 if distance_0_16 base: flag 1 if distance_0_20 base: flag 1 if distance_5_4 base * 0.3: flag 1 if flag 10: flag 10 # 关键点可视化 mp_drawing.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS) cv2.putText(frame, gesture[flag], (50, 50), 0, 1.3, (0, 0, 255), 3) cv2.imshow(MediaPipe Hands, frame) if cv2.waitKey(1) 0xFF 27: break cap.release() cv2.destroyAllWindows()1. 手势识别核心逻辑这是本代码最核心、最复杂的部分。if results.multi_hand_landmarks: for hand_landmarks in results.multi_hand_landmarks: # ... 距离计算 ... # ... 手指判断 ...if results.multi_hand_landmarks:: 判断是否检测到了手。for hand_landmarks in results.multi_hand_landmarks:: 遍历每一只检测到的手。如果是双手这个循环会执行两次。a. 计算基准距离 (Base Distance)p0_x hand_landmarks.landmark[0].x p0_y hand_landmarks.landmark[0].y p5_x hand_landmarks.landmark[5].x p5_y hand_landmarks.landmark[5].y distance_0_5 pow(p0_x - p5_x, 2) pow(p0_y - p5_y, 2) base distance_0_5 / 0.6p0是手腕根部的关键点p5是拇指根部的关键点。distance_0_5: 计算p0和p5之间的平方距离注意这里用的是pow计算平方和没有开根号因为比较大小时平方距离和实际距离效果一样但计算更快。base distance_0_5 / 0.6:这是一个非常巧妙的归一化技巧。distance_0_5的值会随着手离摄像头的远近而变化手近则大手远则小。通过将这个距离除以一个常数0.6我们得到一个与手的大小相关的基准值base。后续所有的距离判断都将基于这个base值这样就可以消除手的远近对判断结果的影响使得在不同距离下的手势识别都能保持准确。b. 计算各手指尖到手腕的距离p4_x hand_landmarks.landmark[4].x p4_y hand_landmarks.landmark[4].y distance_5_4 pow(p5_x - p4_x, 2) pow(p5_y - p4_y, 2) p8_x hand_landmarks.landmark[8].x p8_y hand_landmarks.landmark[8].y distance_0_8 pow(p0_x - p8_x, 2) pow(p0_y - p8_y, 2) # ... 同样的方式计算 distance_0_12 (中指), distance_0_16 (无名指), distance_0_20 (小指)p4: 拇指指尖p8: 食指指尖p12: 中指指尖p16: 无名指指尖p20: 小指指尖distance_5_4: 计算拇指指尖p4到拇指根部p5的平方距离。distance_0_8,distance_0_12,distance_0_16,distance_0_20: 计算各个手指尖到手腕p0的平方距离。c. 判断手指是否伸直并计数if distance_0_8 base: flag 1 if distance_0_12 base: flag 1 if distance_0_16 base: flag 1 if distance_0_20 base: flag 1 if distance_5_4 base * 0.3: flag 1逻辑如果一个手指是伸直的那么指尖离手腕或指根的距离就会比较远。if distance_0_8 base:: 如果食指指尖p8到手腕p0的距离大于基准值base就认为食指是伸直的flag计数器加 1。这个判断逻辑同样适用于中指、无名指和小指。拇指的判断略有不同if distance_5_4 base * 0.3:拇指的运动方式和其他四指不同它是向外侧张开而不是向上伸直。所以这里比较的是拇指指尖p4和拇指根部p5的距离。阈值也更小 (base * 0.3)因为拇指张开的幅度通常没有其他手指伸得那么远。d. 处理双手情况if flag 10: flag 10这个判断是为了处理双手的情况。当两只手都被检测到时for循环会执行两次。第一次处理左手flag累加了左手伸直的手指数量比如 5。第二次处理右手flag在之前的基础上继续累加5 5 10。if flag 10: flag 10确保了当两只手都伸出所有手指时总共 10 个手指flag的值被限制在 10以对应gesture列表中的 ten。

相关文章:

计算机视觉进阶教学之Mediapipe库(一)

目录 简介 一、Mediapipe Python的安装和应用 二、手部检测 1. 导入必要的库 2. 初始化 MediaPipe 组件 3. 配置并创建手部检测模型实例 4. 启动摄像头并进入主循环 5. 绘制检测结果 三、手势识别 1. 手势识别核心逻辑 a. 计算基准距离 (Base Distance) b. 计算各手…...

Alpamayo-R1-10B开源模型价值:降低L4研发门槛,让算法团队专注因果逻辑而非工程胶水

Alpamayo-R1-10B开源模型价值:降低L4研发门槛,让算法团队专注因果逻辑而非工程胶水 1. 项目概述 Alpamayo-R1-10B是NVIDIA推出的自动驾驶专用开源视觉-语言-动作(VLA)模型,作为一套完整的自动驾驶研发工具链&#xf…...

SmolVLA参数详解:256×256输入分辨率对边缘计算设备的友好性分析

SmolVLA参数详解:256256输入分辨率对边缘计算设备的友好性分析 1. 引言:为什么边缘设备需要紧凑的视觉语言动作模型 在机器人技术和边缘计算领域,我们经常面临一个核心矛盾:强大的AI能力需要大量计算资源,而边缘设备…...

论文AI率突然从20%涨到50%怎么办?紧急处理攻略

论文AI率突然从20%涨到50%怎么办?紧急处理攻略 上周五,一个学妹发消息给我,语气挺崩溃的:“学长,我的论文上个月查AI率才18%,今天重新查直接变成52%了,后天就要交终稿,怎么办啊&…...

密码学算法 - 连分数算法

当你在计算某个数的近似值时🔍,或者在求解某个方程的根时🧮,连分数算法 就像一把神奇的放大镜🔎,能帮你逐步逼近那个隐藏在数字背后的真相。 欢迎来到《密码学核心算法实战》的连分数专题!这里…...

Linux内核构建三要素:Makefile、Kconfig与.config协同机制

1. Linux内核构建系统核心机制解析:Makefile、Kconfig与.config的协同关系在嵌入式Linux开发实践中,内核编译常被视为一道技术门槛。开发者面对庞大的源码树(以Linux-3.4.2为例,包含超过2.5万文件),往往陷入…...

DIY四足机器人入门:用开源项目打造你的第一个仿生机器狗

DIY四足机器人入门:用开源项目打造你的第一个仿生机器狗 四足机器人正从实验室走向创客空间。想象一下,周末午后在自家工作台上组装出一台能行走、奔跑甚至跳舞的机器狗——这不再是科幻场景。得益于MIT Mini Cheetah等开源项目的出现,普通爱…...

HAR实战指南:从Kinetics-400数据集获取到视频帧预处理全流程解析

1. Kinetics-400数据集入门指南 第一次接触Kinetics-400数据集时,我被它庞大的规模震撼到了。这个包含40万段视频片段的数据集,涵盖了从"打篮球"到"刷牙"等400种日常动作,是训练人体动作识别(HAR)模型的黄金标准。但随之…...

通义千问3-Reranker-0.6B模型压缩:基于TensorRT的推理加速

通义千问3-Reranker-0.6B模型压缩:基于TensorRT的推理加速 1. 为什么需要对Qwen3-Reranker做TensorRT优化 你可能已经试过直接加载Qwen3-Reranker-0.6B跑重排序任务,但很快会发现:推理速度不够快,显存占用偏高,尤其在…...

2026年AI提示词(Prompt)终极指南:国内聚合站实战技巧

在AI应用日益深入的2026年,能否写出高质量的提示词(Prompt),直接决定了你从GPT、Claude、Gemini等大模型中获得价值的效率与深度。对于国内用户,学习和实践提示词工程的最佳平台是聚合型AI镜像站。目前,通过…...

大模型学习笔记------SAM模型架构拆解与实战指南

1. SAM模型架构全景拆解 第一次接触SAM模型时,我被它"分割一切"的野心震撼到了。这就像给计算机视觉领域扔下了一颗原子弹——传统需要专门训练的分割任务,现在通过提示词就能实时完成。在实际部署医疗影像标注系统时,我发现理解这…...

读了Linux内核slab源码,发现Linus在20年前就写出了比std::pmr更高效的内存池——内核内存管理的4个设计模式

一、C++的内存池,和内核比差在哪? C++程序员对内存管理不陌生。从最基本的new/delete,到C++17引入的std::pmr::polymorphic_allocator,再到各种第三方库的对象池实现,我们一直在和内存分配器打交道。 但你有没有想过一个问题:为什么C++标准库直到2017年才搞出std::pmr这…...

Dify + Celery + Webhook深度集成:构建高可靠异步管道的6大关键配置点

第一章:Dify自定义节点异步处理的核心架构演进Dify 自 v0.6.10 起将自定义节点(Custom Node)的执行模型从同步阻塞式全面转向基于事件驱动的异步处理架构,其核心目标是解耦节点执行与工作流调度,提升高并发场景下的资源…...

JTAG接口原理、失效诊断与硬件防护实战指南

1. JTAG接口原理与工程实践深度解析在嵌入式系统与可编程逻辑器件的开发流程中,JTAG(Joint Test Action Group)接口不仅是调试与烧录的核心通道,更是硬件工程师验证设计完整性、定位物理层故障的关键工具。本文基于FPGA开发中频繁…...

STM32电机控制库5.4版:开源无感驱动注释详解——从寄存器设置到弱磁控制策略实现

STM32电机库5.4开源无感注释 KEIL工程文件 辅助理解ST库 寄存器设置AD TIM1 龙贝格PLL 前馈控制 弱磁控制 foc的基本流 svpwm占空比计算方法 斜坡启动 死区补偿 有详细的注释, 当前是无传感器版本龙贝格观测,三电阻双AD采样!搞STM32电机控制就像在玩硬件…...

高效掌握SeisUnix:从架构解析到实战应用

高效掌握SeisUnix:从架构解析到实战应用 【免费下载链接】SeisUnix The CWP/SU: Seismic Un*x Package - a free open seismic processing, research, and educational software package. Please seek distribution gzipped tar files at https://wiki.Seismic-Unix…...

Windows任务栏美化:TranslucentTB打造个性化视觉体验

Windows任务栏美化:TranslucentTB打造个性化视觉体验 【免费下载链接】TranslucentTB A lightweight utility that makes the Windows taskbar translucent/transparent. 项目地址: https://gitcode.com/gh_mirrors/tr/TranslucentTB 在Windows桌面个性化领域…...

嵌入式可观测性库:面向教学的轻量级实时调试方案

Elec350_OBS:面向嵌入式教学的实时观测与调试库深度解析1. 项目概述Elec350_OBS 是为加拿大麦吉尔大学(McGill University)ELEC 350 ——《嵌入式系统设计导论》课程配套开发的轻量级观测(Observability)支持库。该库并…...

C语言实现OTA安全降级与故障隔离:3层状态持久化+2次幂回退重试,让固件升级不再“一失足成千古恨”

第一章:C语言OTA升级失败处理的总体设计哲学在资源受限的嵌入式系统中,C语言实现的OTA升级失败处理并非简单的错误重试逻辑,而是一种以**确定性、可回滚性与状态自明性**为核心的系统级设计哲学。它要求每个操作步骤都具备原子边界&#xff0…...

Mos:3大核心技术彻底解决macOS鼠标滚动的终极体验难题

Mos:3大核心技术彻底解决macOS鼠标滚动的终极体验难题 【免费下载链接】Mos 一个用于在 macOS 上平滑你的鼠标滚动效果或单独设置滚动方向的小工具, 让你的滚轮爽如触控板 | A lightweight tool used to smooth scrolling and set scroll direction independently f…...

OpenClaw技能扩展:GLM-4.7-Flash加持的微信公众号排版

OpenClaw技能扩展:GLM-4.7-Flash加持的微信公众号排版 1. 为什么需要自动化公众号排版 每次在微信公众号后台手动调整格式的经历,都让我想起被Word排版支配的恐惧。图片尺寸不统一、行间距忽大忽小、代码块显示错位——这些琐碎问题消耗了我大量本可用…...

告别低效!用Postman Runner批量执行API,让8000条数据自动流转

1. 从手工操作到批量执行的效率革命 上周我接手了一个数据迁移项目,需要将8000多条用户记录通过API推送到新系统。刚开始我手动调用了十几条就发现不对劲——每次点击发送、等待响应、核对结果要花20秒,按这个速度完成全部操作需要连续工作44小时&#…...

KubeVirt + GPU Operator实战:如何在K8s集群中同时管理容器和虚拟机的GPU资源(24.9.0版)

KubeVirt GPU Operator深度实战:混合编排GPU资源的终极指南 混合GPU工作负载管理的挑战与机遇 在当今云原生与AI融合的技术浪潮中,基础设施团队面临着一个关键挑战:如何在统一的Kubernetes平台上同时高效管理容器化AI训练任务和需要GPU强隔离…...

Petduino:面向教育的Arduino兼容嵌入式宠物平台

1. 项目概述Petduino 是一款面向教育与创意硬件开发的 Arduino 兼容嵌入式平台,其核心价值不在于高性能计算,而在于以极简抽象封装复杂外设交互逻辑,使初学者与原型开发者能快速构建具备视觉反馈、音频输出与物理交互能力的“有生命感”的嵌入…...

Realistic Vision V5.1效果实测:毛衣丝绸牛仔布,各种材质渲染太逼真

Realistic Vision V5.1效果实测:毛衣丝绸牛仔布,各种材质渲染太逼真 1. 引言:重新定义AI生成的真实感 作为一名长期关注AI图像生成技术的从业者,我见过太多号称"写实"的模型,但大多数作品在细节处总会露出…...

IntelliJ IDEA 2023.2性能分析神器:编辑器内性能提示实战指南(含单测与服务场景)

IntelliJ IDEA 2023.2性能分析神器:编辑器内性能提示实战指南(含单测与服务场景) 在当今快节奏的软件开发环境中,性能问题往往成为项目后期最棘手的挑战之一。传统上,开发者需要依赖专门的性能分析工具或等到系统上线后…...

Dify节点异步能力升级迫在眉睫!3大信号预示你正面临任务积压危机——附实时监控看板配置清单

第一章:Dify节点异步能力升级迫在眉睫!3大信号预示你正面临任务积压危机——附实时监控看板配置清单 当你的 Dify 工作流开始出现响应延迟、任务队列持续增长、或 Web UI 中频繁显示“Processing…”却长时间无结果时,这并非偶然——而是异步…...

Java+ElasticSearch+Pytorch实战:手把手教你搭建一个简易版Google以图搜图系统

JavaElasticSearchPyTorch实战:构建高精度以图搜图系统 从图像特征到相似度搜索的技术实现 在数字内容爆炸式增长的时代,图像搜索技术正成为提升用户体验的关键。不同于传统的关键词搜索,以图搜图系统能够直接理解图像内容,为用户…...

nlp_structbert_sentence-similarity_chinese-large快速入门:Python调用与相似度计算实战

nlp_structbert_sentence-similarity_chinese-large快速入门:Python调用与相似度计算实战 你是不是经常遇到这样的问题:想判断两句话是不是一个意思,或者想从一堆文本里找出意思相近的句子?比如,用户问“怎么开通会员…...

Ext2Read:3步实现Windows高效访问Linux分区的终极解决方案

Ext2Read:3步实现Windows高效访问Linux分区的终极解决方案 【免费下载链接】ext2read A Windows Application to read and copy Ext2/Ext3/Ext4 (With LVM) Partitions from Windows. 项目地址: https://gitcode.com/gh_mirrors/ex/ext2read 还在为Windows系…...