简单手部跟踪mediapipe结合opencv

基于计算机视觉和Mediapipe的手部跟踪

适用场景:

音量调节,虚拟画板,虚拟鼠标,手语识别,手势识别

使用环境及安装包:

python3.7,Pycharm,opencv-python,mediapipe

基础开发代码:

import cv2
import mediapipe as mp
import time
# 开启摄像头
cap = cv2.VideoCapture(0)
# 设置手部 跟踪
mpHands = mp.solutions.hands
# 设置手部 跟踪参数,Hands括号内可填入精准度等
hands = mpHands.Hands()
# 使用画出手部的跟踪工具包,读取出里面的21个点
mpDraw = mp.solutions.drawing_utils
# 设置手部 关节样式
handLmsStyle = mpDraw.DrawingSpec(color=(0, 0, 255), thickness=10)
# 设置手部 连接样式
handConStyle = mpDraw.DrawingSpec(color=(0, 255, 255), thickness=20)
# 进行时间帧率的计算变量
pTime = 0
cTime = 0
# 开启摄像头读取视频,并对读取到的图像进行处理
while True:
    ret, img = cap.read()
    # 读取到了,和没有读取到分别做出的配置
    if ret:
        # 如果读取到了进行灰度转换
        imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        # 将读取到的灰度图片调用手部的hands对象里面的process函数进行处理
        result = hands.process(imgRGB)
        # print(result.multi_hand_landmarks)
        # 将读取到的手部坐标进行处理,将比例转化为数字
        imgHeight = img.shape[0]
        imgWidth = img.shape[1]
        # 如果读取到了手部的坐标
        if result.multi_hand_landmarks:
            # 遍历里面的这些点
            for handLms in result.multi_hand_landmarks:
                # 画出所有节点和连线
                mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS, handLmsStyle, handConStyle)
                # 遍历手部节点的坐标
                for i, lm in enumerate(handLms.landmark):
                    # 对坐标进行转换
                    xPos = int(lm.x * imgWidth)
                    yPos = int(lm.y * imgHeight)
                    # 打印出来位置
                    cv2.putText(img, str(i), (xPos - 25, yPos + 5), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0, 0, 250), 2)
                    # 关节点为4的编号加大变蓝
                    if i == 4:
                        cv2.circle(img, (xPos, yPos), 15, (255, 0, 0), cv2.FILLED)
                    # 打印输出位置
                    print(i, xPos, yPos)
        # 计算出fps,并打印出来
        cTime = time.time()
        fps = 1 / (cTime - pTime)
        pTime = cTime
        cv2.putText(img, f"FPS:{int(fps)}", (30, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (250, 0, 0))
        cv2.imshow('img', img)
    # 按q退出
    if cv2.waitKey(1) == ord('q'):
        break
posted @ 2022-12-01 19:18  筝弈  阅读(244)  评论(0)    收藏  举报
2 3
4