准备工作
首先、使用mediapipe需要下载安装对应的库
1、激活你想要安装文件包对应的环境
2、安装mediapipe
pip install mediapipe
2、我们需要用到cv2
pip install opencv_python
准备工作完成
代码编写
全部代码如下
import cv2
import mediapipe as mp
import time
# 使用cv2来抓取你电脑上的摄像头
cap = cv2.VideoCapture(0)
# 创建mediapipe有关于手关节处理的一个句柄
mphands = mp.solutions.hands
hands = mphands.Hands()
# 创建一个mediapipe画图处理的一个句柄
mp_draw = mp.solutions.drawing_utils
# 图片上描述的点的大小和类型
handdotstyle = mp_draw.DrawingSpec(color=(0,0,255),thickness=5)
# 图片上连线的线的粗细和类型
handlinestyle = mp_draw.DrawingSpec(color=(255,0,0),thickness=5)
# 为了实时计算fps的值
ptime = 0
ctime = 0
while True:
# 读取摄像机中的图片
rec,img =cap.read()
# 如果检测到了图片
if rec:
# 在这里转换一下如片的格式,我们需要的为RGB格式
imgRGB = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
# 在图片上描绘手指关节点
result = hands.process(imgRGB)
# print(result.multi_hand_landmarks)
# 这里获得图片的大小,为了下面在关节点上标注数值
imgheight = imgRGB.shape[0]
imgwidth = imgRGB.shape[1]
# print(imgheight,imgwidth)
if result.multi_hand_landmarks:
for handlms in result.multi_hand_landmarks:
# print("#----------------------------------------------------------#")
# 将关节点连接起来
mp_draw.draw_landmarks(img,handlms,mphands.HAND_CONNECTIONS,handdotstyle,handlinestyle)
# 一个一个获取关节点的信息
for i,lm in enumerate(handlms.landmark):
# lm.y,lm.x是在图片上的位置,但是数值是总体的比例
ypos = int(lm.y * imgheight)
xpos = int(lm.x * imgwidth)
print(i,xpos,ypos)
# 给关节点加上顺序数字
cv2.putText(img,str(i),(xpos-25,ypos+10),cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,255,0),2)
# 给大拇指的地方加重表示
if i == 4:
cv2.circle(img,(xpos,ypos),10,(0,255,0),cv2.FILLED)
# 计算实时的帧频率
ctime = time.time()
fps = 1/(ctime-ptime)
ptime = ctime
# 显示fps
cv2.putText(img,f"FPS:{int(fps)}",(30,50),cv2.FONT_HERSHEY_SIMPLEX,1,(255,0,0),2)
cv2.imshow("img",img)
if cv2.waitKey(1) == ord("q"):
break
cap.release()