前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >OpenCV_mediapipe手势识别

OpenCV_mediapipe手势识别

作者头像
火星娃统计
发布于 2022-01-06 13:14:33
发布于 2022-01-06 13:14:33
2.5K00
代码可运行
举报
文章被收录于专栏:火星娃统计火星娃统计
运行总次数:0
代码可运行

OpenCV_mediapipe手势识别

概述

MediaPipe 是一款由 Google Research 开发并开源的多媒体机器学习模型应用框架,提供面部识别、手势识别的开源解决方案,支持python和java等语言

手部的识别会返回21个手势坐标点,具体如下图所示

对于mediapipe模块具体见官网 https://google.github.io/mediapipe/solutions/hands

代码

手势识别模块

文件名:HandTrackingModule.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding:utf-8 -*-
import cv2
import mediapipe as mp

class HandDetector:
    def __init__(self, mode=False, maxHands=2,modelComplexity=1, detectionCon=0.5, minTrackCon=0.5):
        self.mode = mode
        self.maxHands = maxHands
        self.detectionCon = detectionCon
        self.minTrackCon = minTrackCon
        self.modelComplex=modelComplexity
        self.mpHands = mp.solutions.hands # mp的手部支持模块
        # Hands完成对Hands初始化配置
        self.hands = self.mpHands.Hands(self.mode, self.maxHands, self.modelComplex,
                                        self.detectionCon, self.minTrackCon)
        #mode为True为图片输入
        # maxhand 为最大手数目
        # modelcomplex为模型的复杂度
        # detectioncon和trackcon为置信度阈值,越大越准确
        self.mpDraw = mp.solutions.drawing_utils# 用于绘制
        self.tipIds = [4, 8, 12, 16, 20]#对应手指的指尖
        self.fingers = []
        self.lmList = []

    def findHands(self, img, draw=True):
        imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 将传入的图转为RGB模式,
        # 返回一个列表,包含21个标志点的x、y、z的值
        self.results = self.hands.process(imgRGB)# 完成图像的处理,输入必须为RGB格式的图片

        if self.results.multi_hand_landmarks:# hands in list
            for handLms in self.results.multi_hand_landmarks:# 提取每个指头并绘制标点和连接线
                if draw:
                    self.mpDraw.draw_landmarks(img, handLms,
                                               self.mpHands.HAND_CONNECTIONS)
        return img

    def findPosition(self, img, handNo=0, draw=True):
        xList = []
        yList = []
        bbox = []
        bboxInfo =[]
        self.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
                px, py = int(lm.x * w), int(lm.y * h)
                xList.append(px)
                yList.append(py)
                self.lmList.append([px, py])
                if draw:
                    cv2.circle(img, (px, py), 5, (255, 0, 255), cv2.FILLED)
            xmin, xmax = min(xList), max(xList)
            ymin, ymax = min(yList), max(yList)
            boxW, boxH = xmax - xmin, ymax - ymin
            bbox = xmin, ymin, boxW, boxH
            cx, cy = bbox[0] + (bbox[2] // 2), \
                     bbox[1] + (bbox[3] // 2)
            bboxInfo = {"id": id, "bbox": bbox,"center": (cx, cy)}

            if draw:
                cv2.rectangle(img, (bbox[0] - 20, bbox[1] - 20),
                              (bbox[0] + bbox[2] + 20, bbox[1] + bbox[3] + 20),
                              (0, 255, 0), 2)

        return self.lmList, bboxInfo

    def fingersUp(self):
        if self.results.multi_hand_landmarks:
            myHandType = self.handType()
            fingers = []
            # Thumb
            if myHandType == "Right":
                if self.lmList[self.tipIds[0]][0] > self.lmList[self.tipIds[0] - 1][0]:
                    fingers.append(1)
                else:
                    fingers.append(0)
            else:
                if self.lmList[self.tipIds[0]][0] < self.lmList[self.tipIds[0] - 1][0]:
                    fingers.append(1)
                else:
                    fingers.append(0)

            # 4 Fingers
            for id in range(1, 5):
                if self.lmList[self.tipIds[id]][1] < self.lmList[self.tipIds[id] - 2][1]:
                    fingers.append(1)
                else:
                    fingers.append(0)
        return fingers
    # 判别左右手
    def handType(self):
        if self.results.multi_hand_landmarks:
            if self.lmList[17][0] < self.lmList[5][0]:
                return "Right"
            else:
                return "Left"

主函数

文件名:main.py

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*- coding:utf-8 -*-
import cv2
from HandTrackingModule import HandDetector

class Main:
    def __init__(self):
        self.camera = cv2.VideoCapture(0,cv2.CAP_DSHOW)# 摄像头捕获
        self.camera.set(3, 1280)#分辨率
        self.camera.set(4, 720)
    # 手势识别的函数
    def Gesture_recognition(self):
        while True:
            self.detector = HandDetector()# 调用hand模块
            frame, img = self.camera.read()#捕获摄像头输入
            img = self.detector.findHands(img)# 调用findhand函数
            lmList, bbox = self.detector.findPosition(img)# 手势识别 lmlist关节位置方位bbox为方框

            if lmList:# 如果非空,返回TRUE
                x_1, y_1 = bbox["bbox"][0], bbox["bbox"][1]
                x1, x2, x3, x4, x5 = self.detector.fingersUp()

                if (x2 == 1 and x3 == 1) and (x4 == 0 and x5 == 0 and x1 == 0):
                    cv2.putText(img, "2_TWO", (x_1, y_1), cv2.FONT_HERSHEY_PLAIN, 3,
                                (0, 0, 255), 3)
                elif (x2 == 1 and x3 == 1 and x4 == 1) and (x1 == 0 and x5 == 0):
                    cv2.putText(img, "3_THREE", (x_1, y_1), cv2.FONT_HERSHEY_PLAIN, 3,
                                (0, 0, 255), 3)
                elif (x2 == 1 and x3 == 1 and x4 == 1 and x5 == 1) and (x1 == 0):
                    cv2.putText(img, "4_FOUR", (x_1, y_1), cv2.FONT_HERSHEY_PLAIN, 3,
                                (0, 0, 255), 3)
                elif x1 == 1 and x2 == 1 and x3 == 1 and x4 == 1 and x5 == 1:
                    cv2.putText(img, "5_FIVE", (x_1, y_1), cv2.FONT_HERSHEY_PLAIN, 3,
                                (0, 0, 255), 3)
                elif x2 == 1 and (x1 == 0, x3 == 0, x4 == 0, x5 == 0):
                    cv2.putText(img, "1_ONE", (x_1, y_1), cv2.FONT_HERSHEY_PLAIN, 3,
                                (0, 0, 255), 3)
                elif x1 and (x2 == 0, x3 == 0, x4 == 0, x5 == 0):
                    cv2.putText(img, "GOOD!", (x_1, y_1), cv2.FONT_HERSHEY_PLAIN, 3,
                                (0, 0, 255), 3)
            cv2.imshow("camera", img)# 显示图片
            # 点击窗口关闭按钮退出程序
            if cv2.getWindowProperty('camera', cv2.WND_PROP_VISIBLE) < 1:
                break
            # 点击小写字母q 退出程序
            if cv2.waitKey(1) & 0xFF == ord("q"):
                break
# main
if __name__ == '__main__':
    Solution = Main()
    Solution.Gesture_recognition()

效果展示

结束语

后续多研究下这个包

再见2021

love&peace

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 火星娃统计 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python人工智能【隔空手势控制鼠标】“解放双手“
随着美国openAI公司的CahtGPT诞生,人工智能开启了再度觉醒状态。在这样的一个时代的大背景下,演变出了“智能+万物”的潜在主题。全球智能化,已经成为了一个必然的趋势。人工智能时时代发展不可取代的产物。作为一名大学生,我甘愿为时代的发展贡献犬马之劳!!!
淼学派对
2023/10/14
7190
python人工智能【隔空手势控制鼠标】“解放双手“
用mediapipe实现手部标记
用mediapipe可以进行手部标记。获得手部标记后,我们可以做一些应用,例如显示、利用手势进行一些控制等。本文介绍了使用opencv和mediapipe检测和显示摄像头(或视频)中的手并进行标记,然后应用手部标记操作电脑音量。
一只大鸽子
2023/09/02
9670
用mediapipe实现手部标记
Python实现AI视频识别——手势控制[通俗易懂]
用opencv库拍摄一帧图片,用mediapipe库识别人手和标识点,然后用opencv在视频上添加标识的信息,最后用opencv合成一个动态视频输出
全栈程序员站长
2022/08/24
2.9K0
Python实现AI视频识别——手势控制[通俗易懂]
MediaPipe实现手指关键点检测及追踪,人脸识别及追踪
OpenCV 是一个用于计算机视觉应用程序的库。在 OpenCV 的帮助下,我们可以构建大量实时运行更好的应用程序。主要用于图像和视频处理。
润森
2022/09/22
1.8K0
MediaPipe实现手指关键点检测及追踪,人脸识别及追踪
健身也内卷?这届网友用 Python 掌握了做标准俯卧撑的秘诀
【CSDN 编者按】自己在家锻炼时,我们很难知道自己的动作是否标准。本文作者用Python写了一个可以检测俯卧撑动作是否标准的程序,一起来看看他是怎么做的。 原文链接:https://aryanvij02.medium.com/push-ups-with-python-mediapipe-open-a544bd9b4351 GitHub 地址:https://github.com/aryanvij02/PushUpCounter 本文为CSDN翻译,转载请注明来源出处。 译者 | 章雨铭       责编
用户1737318
2022/03/10
3770
应用实例 | 通过手势控制系统音量大小实现步骤(附源码)
本文主要介绍使用Python和MediaPipe实现通过手势控制系统音量大小的应用。
Color Space
2021/07/01
1.7K0
使用OpenCV和MediaPipe实现姿态识别!
MediaPipe是一款由Google开发并开源的数据流处理机器学习应用开发框架。
小F
2023/08/21
9790
使用OpenCV和MediaPipe实现姿态识别!
MediaPipe + OpenCV五分钟搞定手势识别
这个是真的,首先需要从Google在2020年发布的mediapipe开发包说起,这个开发包集成了人脸、眼睛、虹膜、手势、姿态等各种landmark检测与跟踪算法。
OpenCV学堂
2023/08/22
2.2K0
MediaPipe + OpenCV五分钟搞定手势识别
opencv+
Mediapipe是Google开发的一种跨平台框架,用于构建实时音频、视频和多媒体数据处理应用程序。它提供了一系列预构建的机器学习和计算机视觉模型,可用于实现诸如姿势识别、人脸检测、手势识别、目标追踪等应用。Mediapipe的主要特点是高效、可扩展和跨平台,它支持多种操作系统(包括Android、iOS和桌面操作系统)和多种编程语言(包括C ++、Python和Java)。
用户10922923
2024/01/23
1720
opencv+
更稳定的手势识别方法--基于手部骨架与关键点检测
本期将介绍并演示基于MediaPipe的手势骨架与特征点提取步骤以及以此为基础实现手势识别的方法。
Color Space
2021/03/10
2.3K0
【Python】算法:opencv-python环境配置与基础示例
OpenCV(Open Source Computer Vision Library)是一个广泛使用的开源计算机视觉库,它提供了用于处理图像和视频的各种功能和算法。以下是一些常见的功能和应用:
DevFrank
2024/07/24
1990
cv2.getTextSize()
项目:chainer-faster-rcnn 作者:mitmul | 项目源码 | 文件源码
狼啸风云
2021/03/03
1.8K0
基于yolov8,制作停车位计数器(附源码)
YOLO(You Only Look Once)是由Joseph Redmon和Ali开发的一种对象检测和图像分割模型。
小F
2023/12/30
5011
基于yolov8,制作停车位计数器(附源码)
JetBot手势识别实验
本实验目的在JetBot智能小车实现手势识别功能,使用板卡为Jetson Nano。通过小车摄像头,识别五个不同的手势,实现小车的运动及灯光控制。
zstar
2024/05/24
1440
JetBot手势识别实验
基于Python的这个库,我实现了“隔空操物“
OpenCV是一个基于Apache2.0许可发行的跨平台计算机视觉与机器学习的软件库。
大数据小禅
2022/01/18
6440
基于Python的这个库,我实现了“隔空操物“
实战 | 基于YOLOv9和OpenCV实现车辆跟踪计数(步骤 + 源码)
本文主要介绍使用YOLOv9和OpenCV实现车辆跟踪计数(步骤 + 源码)。
Color Space
2024/05/22
1.7K0
实战 | 基于YOLOv9和OpenCV实现车辆跟踪计数(步骤 + 源码)
实战 | 用Python和MediaPipe搭建一个嗜睡检测系统 【文末送书】
本文将使用Python和MediaPipe搭建一个嗜睡检测系统 (包含详细步骤 + 源码)。
Color Space
2023/08/18
6980
实战 | 用Python和MediaPipe搭建一个嗜睡检测系统 【文末送书】
大象机器人六轴协作机械臂myCobot 320 进行手势识别
我是一名专注于机器学习和机器人技术自由者。我的热情始于大学期间的人工智能课程,这促使我探索人机交互的新方法。尤其对于机械臂的操作,我一直想要简化其复杂性,使之更加直观和易于使用。
大象机器人
2024/02/01
3550
大象机器人六轴协作机械臂myCobot 320 进行手势识别
体感游戏 | 手势识别玩飞机大战游戏(二) Python+OpenCV实现简易手势识别功能
今天是第二部分:Python+OpenCV实现简易手势识别功能。简易的手势识别,所以功能也很简单,识别手势1~5就行,当然我们控制飞机时只需要用到最多3个手势:发射子弹、向左移动和向右移动。所以1~5够用了,当然你也可以用手势的移动方向来控制飞机的移动方向,只需要计算手势轮廓的重心位置变化即可。
Color Space
2021/01/08
2.4K0
使用OpenCV和YOLOv8制作目标检测器(附源码)
YOLO(You Only Look Once)是由Joseph Redmon和Ali开发的一种对象检测和图像分割模型。
小F
2023/09/19
2.9K1
使用OpenCV和YOLOv8制作目标检测器(附源码)
推荐阅读
相关推荐
python人工智能【隔空手势控制鼠标】“解放双手“
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文