首页 > 编程语言 >python项目学习 mediapipe手势识别 opencv可视化显示

python项目学习 mediapipe手势识别 opencv可视化显示

时间:2024-08-05 22:23:48浏览次数:16  
标签:mediapipe angle python list hand opencv finger numpy 关键点

import cv2
import mediapipe
import numpy

def get_angle(vector1,vector2):#角度计算
    angle = numpy.dot(vector1, vector2) / (numpy.sqrt(numpy.sum(vector1 * vector1)) * numpy.sqrt(numpy.sum(vector2 * vector2)))#cos(angle)=向量的点乘/向量的模
    angle=numpy.arccos(angle)/3.14*180#angle=arccos(angle) 弧度=(angle/3.14)*180
    return angle
def gesture(judge_finger,finger_list):#手势规则
    if len(judge_finger)==1 and judge_finger[0]==8:
        vector1=finger_list[6]-finger_list[7]#向量计算
        vector2=finger_list[8]-finger_list[7]
        angle=get_angle(vector1,vector2)
        if angle<170:
            gesture_str="9"
        else:
            gesture_str="1"
    elif len(judge_finger)==2 and judge_finger[0]==8 and judge_finger[1]==12:
        gesture_str="2"
    elif len(judge_finger)==2 and judge_finger[0]==4 and judge_finger[1]==20:
        gesture_str="6"
    elif len(judge_finger)==2 and judge_finger[0]==4 and judge_finger[1]==8:
        gesture_str="8"
    elif len(judge_finger)==3 and judge_finger[0]==8 and judge_finger[1]==12 and judge_finger[2]==16:
        gesture_str="3"
    elif len(judge_finger)==3 and judge_finger[0]==4 and judge_finger[1]==8 and judge_finger[2]==12:
        gesture_str="7"
    elif len(judge_finger)==4 and judge_finger[0]==8 and judge_finger[1]==12 and judge_finger[2]==16 and judge_finger[3]==20:
        gesture_str="4"
    elif len(judge_finger) == 5 and judge_finger[0] == 4 and judge_finger[1] == 8 and judge_finger[2] == 12 and judge_finger[3] == 16 and judge_finger[4] == 20:
        gesture_str="5"
    elif len(judge_finger)==0:
        gesture_str="10"
    elif len(judge_finger)==1 and judge_finger[0]==4:
        gesture_str="yyds"
    elif len(judge_finger)==1 and judge_finger[0]==20:
        gesture_str="so what?"
    elif len(judge_finger)==1 and judge_finger[0]==12:
        gesture_str="fuck you"
    else:
        gesture_str="?"
    return gesture_str

if __name__ == '__main__':
    open_camera=cv2.VideoCapture(0)#打开笔记本内置摄像头
    #定义检测对象
    hand=mediapipe.solutions.hands#手部识别器
    hand_detector=hand.Hands()#手部关键点检测器 使用默认参数
    mediapipe_draw=mediapipe.solutions.drawing_utils#绘图模块
    while True:
        #读取图像 初始化
        success,image=open_camera.read()#参数success 为True 或者False,代表有没有读取到图片 参数image表示截取到一帧的图片
        image=cv2.flip(image,1)#镜像反转image
        image_height,image_width,image_channels=image.shape#height 表示图像的高度(垂直方向上的像素数) width 表示图像的宽度(水平方向上的像素数) channels 表示图像的通道数
        if success:
            imageRGB=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)#转换为rgb图像
            resule=hand_detector.process(imageRGB)#process 接收RGB格式的numpy数组,返回<class 'mediapipe.python.solution_base.SolutionOutputs'>
            #print(resule)
            #手部关键点抓取可视化输出
            if resule.multi_hand_landmarks: #multi_hand_landmarks 被检测/跟踪的手的集合,其中每只手被表示为21个手部地标的列表,每个地标由x、y和z组成
                hand_point=resule.multi_hand_landmarks[0]#只识别一只手
                mediapipe_draw.draw_landmarks(image,hand_point,hand.HAND_CONNECTIONS)#将识别到的手部关键点连线绘制到cv2图像中
                #print(resule.multi_hand_landmarks)#量化的关键点坐标

                #手势识别判断依据计算
                finger_list = []#存储关键点坐标
                for i in range(21):#关键点坐标计算
                    point_x=hand_point.landmark[i].x*image_width
                    point_y = hand_point.landmark[i].y * image_height
                    finger_list.append([int(point_x), int(point_y)])
                finger_list=numpy.array(finger_list, dtype=numpy.int32)#list转换为numpy.ndarray 采集关键点坐标
                #print(finger_list)
                irrelevant_index=[0,1,2,3,6,10,14,19,18,17,10]# 关键点[0,1,2,3,6,10,14,19,18,17,10]作一个无关组
                irrelevant=cv2.convexHull(finger_list[irrelevant_index])#cv2.convexHull 构造无关组凸包
                #print("无关组:",irrelevant)
                cv2.polylines(image,[irrelevant],True,(255,255,255),2, cv2.LINE_AA)#绘制无关组凸包
                judge_list=[4,8,12,16,20]# 以检测关键点[4,8,12,16,20]有无在凸包外作为识别判断依据
                judge_finger=[]#存储识别关键点
                for index in judge_list:
                    finger=(int(finger_list[index][0]), int(finger_list[index][1]))#计算识别关键点坐标
                    #print("判断关键点:",finger)
                    judge=cv2.pointPolygonTest(irrelevant,finger,True)#检测识别关键点有无在凸包内
                    if judge<0:#不在凸包内
                        judge_finger.append(index)

                #手势判断
                gesture_str=gesture(judge_finger,finger_list)
                cv2.putText(image,gesture_str,(100,100),cv2.FONT_HERSHEY_SIMPLEX,3,(255,255,255),2,cv2.LINE_AA)#手势意思可视化

        cv2.imshow("gesture detector",image)
        key=cv2.waitKey(1)#cv.waitKey()是一个键盘绑定函数
        if key==ord('q'):#等待'q'键 退出
            break
    open_camera.release()

运行结果

标签:mediapipe,angle,python,list,hand,opencv,finger,numpy,关键点
From: https://blog.csdn.net/cha_0409/article/details/140926549

相关文章

  • 【优秀python大屏】基于python flask的广州历史天气数据应用与可视化大屏
    摘要气象数据分析在各行各业中扮演着重要的角色,尤其对于农业、航空、海洋、军事、资源环境等领域。在这些领域中,准确的气象数据可以对预测未来的自然环境变化和采取行动来减轻负面影响的决策起到至关重要的作用。本系统基于PythonFlask框架,通过对气象数据的分析和处理来提供......
  • Python-MNE全套教程(官网翻译)-入门01:概述篇
    目的以牺牲深度为代价进行入门学习,简易学习基本方法开始导入相关库:#License:BSD-3-Clause#CopyrighttheMNE-Pythoncontributors.importnumpyasnpimportmne加载数据MNE-Python数据结构式基于fif格式的,但是对于其他格式也有阅读方法,如https://mne.tools/s......
  • Python-MNE全套教程(官网翻译)-入门05:关于传感器位置
    本教程描述了如何读取和绘制传感器位置,以及MNE-Python如何处理传感器的物理位置。像往常一样,我们将从导入我们需要的模块开始:frompathlibimportPathimportmatplotlib.pyplotaspltimportnumpyasnpimportmne关于montage和layout(蒙太奇和传感器布局)montage......
  • Codeforces Round 963 (Div. 2) A - C 详细题解(思路加代码,C++,Python) -- 来自灰名
    比赛链接:Dashboard-CodeforcesRound963(Div.2)-Codeforces之后有实力了再试试后面的题目,现在要做那些题,起码要理解一个多小时题目A:链接:Problem-A-Codeforces题目大意理解:        极少数不考翻译能读懂的cf题目(bushi)每个测试用例第一行一个n,......
  • 【Playwright+Python】系列教程(七)使用Playwright进行API接口测试
    playwright也是可以做接口测试的,但个人觉得还是没有requests库强大,但和selenium相比的话,略胜一筹,毕竟支持API登录,也就是说可以不用交互直接调用接口操作了。怎么用既然是API的测试了,那肯定就别搞UI自动化那套,搞什么浏览器交互,那叫啥API测试,纯属扯淡。也不像有些博主更懒,直接贴......
  • Mojo中集成Python详解及问题说明
    官方的长期目标是让Mojo成为Python的超集(即让Mojo与现有的Python程序兼容)。Python程序员应该能够立即使用Mojo,并能够访问当今庞大的Python包生态系统。然而,Mojo仍处于早期开发阶段,许多Python功能尚未实现。目前,您无法在Mojo中编写所有可以用Python编写的......
  • python图表没有正确显示中文,这通常是因为matplotlib的默认设置不支持中文字符,或者相应
    如果图表没有正确显示中文,这通常是因为matplotlib的默认设置不支持中文字符,或者相应的字体没有正确加载。你可以通过指定支持中文的字体来解决这个问题。下面是如何设置matplotlib以确保能够在图表中显示中文的步骤:方法1:全局设置字体你可以修改matplotlib的全局配置,使......
  • 在python jupyter下运行cuda c++程序
    Installrunthisonjupyter(*.ipynb)files!pip3installnvcc4jupyterUsageloadtheextensiontoenablethemagiccommands:%load_extnvcc4jupyterRuncudatest%%cuda#include<stdio.h>__global__voidhello(){printf("Hellofromblock......
  • 在python jupyter下运行cuda c++程序
    Installrunthisonjupyter(*.ipynb)files!pip3installnvcc4jupyterUsageloadtheextensiontoenablethemagiccommands:%load_extnvcc4jupyterRuncudatest%%cuda#include<stdio.h>__global__voidhello(){printf("Hellofromblock......
  • SciTech-Mathmatics-ImageProcessing-Remove the Background from an image using Pyt
    https://www.geeksforgeeks.org/how-to-remove-the-background-from-an-image-using-python/pipinstallPillowpipinstallrembg#ImportingRequiredModulesfromrembgimportremovefromPILimportImage#Storepathoftheimageinthevariableinput_......