简单手部跟踪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