import cv2
import mediapipe as mp
import time
#第一步:保存mediapipe中的手势识别解决方案到mpHands,hands,mpDraw中
mpHands = mp.solutions.hands #以下三个是mediapipe 中的API调用模板了
hands = mpHands.Hands(min_detection_confidence=0.5, min_tracking_confidence=0.5)#最小检测置信度,最小追踪置信度
mpDraw = mp.solutions.drawing_utils #获取mediapipe解决方案的绘画工具包
#第二步:参数设定
handLmsStyle = mpDraw.DrawingSpec(color=(0, 0, 255), thickness=3)#绘制手部关键点的颜色与粗细
handConStyle = mpDraw.DrawingSpec(color=(0, 255, 0), thickness=5)#绘制手部线条的颜色与粗细
pTime = 0 #和下面的cTime一起用于计算视频输入流FPS
cTime = 0
cap = cv2.VideoCapture(0) #打开编号为0的摄像头,这个一般是自带摄像头
#第三步:循环读取视频流到img,img输入hands.hands函数得到结果,绘制结果到img并输出
while True:
ret, img = cap.read() #从cap中读取图片到img,并将读取是否成功的结果保存在ret
if ret:
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) #模型训练的时候是使用RGB训练,对于这个类型识别精度和速度比较高
result = hands.process(imgRGB) #将RGB图片输入手部模型将结果保存在result
# print(result.multi_hand_landmarks) #打印result.multi_hand_landmarks内容,可以去掉试一下
imgHeight = img.shape[0] #获取摄像机图片的高
imgWidth = img.shape[1] #获取摄像机图片的宽
if result.multi_hand_landmarks:#如果multi_hand_landmarks不为空进入循环
for handLms in result.multi_hand_landmarks: #遍历multi_hand_landmarks内每一个hand_landmark(手部关键点),相对于遍历图片中每一个手
mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS, handLmsStyle, handConStyle) #调用mediapipe内绘画工具包绘画手部关键点
for i, lm in enumerate(handLms.landmark): #i保存第几个手部关键点,lm保存该点在图中的归一化值
xPos = int(lm.x * imgWidth) #第i个关键点x
yPos = int(lm.y * imgHeight)#第i个关键点y
cv2.putText(img, str(i), (xPos-25, yPos+5), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0, 0, 255), 2)#绘制关键点在,关键点左边靠下一点
if i == 8:#当画到第八个关键点时
cv2.circle(img, (xPos, yPos), 10, (166, 0, 0), cv2.FILLED)#画一个圆
#print(i, xPos, yPos) #打印绘制这个点时候的坐标
cTime = time.time()
fps = 1/(cTime-pTime)
pTime = cTime
cv2.putText(img, f"FPS : {int(fps)}", (30, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 3) #绘制FSP到图中
cv2.imshow('img', img) #输出图片
if cv2.waitKey(1) == ord('q'):#点击视频,输入q退出
break
[python][mediapipe]摄像头实时手部关节点识别代码
猜你喜欢
转载自blog.csdn.net/FL1623863129/article/details/129977784
今日推荐
周排行