pip install +扩展库;opencv-python和mediapipe
Mediapipe是Google开发的一种跨平台框架,用于构建实时音频、视频和多媒体数据处理应用程序。它提供了一系列预构建的机器学习和计算机视觉模型,可用于实现诸如姿势识别、人脸检测、手势识别、目标追踪等应用。Mediapipe的主要特点是高效、可扩展和跨平台,它支持多种操作系统(包括Android、iOS和桌面操作系统)和多种编程语言(包括C ++、Python和Java)。
使用Mediapipe,开发者可以利用其强大的计算图模型和各种预构建的模块,快速构建和部署音视频处理应用程序。通过配置和连接模块,开发者可以构建自定义数据处理流程,实现各种功能。Mediapipe还提供了丰富的工具和库,用于模型训练、性能优化和应用程序调试等方面的支持。
总之,Mediapipe是一个强大的多媒体处理框架,可以用于构建实时音视频处理应用程序和机器学习模型。它的跨平台特性使得开发者可以轻松地将应用程序部署到不同的设备和操作系统上。
Mediapipe(BlazePlam)
两个模型组成:1)手掌检测器,它提供手的边界框,2)手部地标模型,它预测手骨架。
所以我们要做的就是两步骤,那么就让我们依赖Mediapipe来实现手掌检测 的手部跟踪吧。
1、先写出调用实时摄像头的功能;这是基本的
import cv2
import mediapipe as mp
cap=cv2.VideoCapture(0)
while True:
success,img=cap.read()
cv2.imshow("Image",img)
cv2.waitKey(1)
会调出你的摄像头;
2.然后定义变量来确定手掌的位置,然后把图要转化成RGB,opencv里面是BGR的图片
再用result.multi_hand_landmarks来看摄像头能不能步骤到我们的手,不能就None,能就显示坐标;
import cv2
import mediapipe as mp
cap=cv2.VideoCapture(0)
mpHands=mp.solutions.hands # 坐标
hands=mpHands.Hands()
while True:
success,img=cap.read()
imgRGB=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
result=hands.process(imgRGB)
print(result.multi_hand_landmarks)
cv2.imshow("Image",img)
cv2.waitKey(1)
3.用变量 mpDraw =mp.solutions.drawing_utils 画点动标的动作,并对手画21个点(0~20)且连接他们;
import cv2
import mediapipe as mp
cap=cv2.VideoCapture(0)
mpHands=mp.solutions.hands # 坐标
hands=mpHands.Hands()
mpDraw =mp.solutions.drawing_utils #画点动标的动作
while True:
success,img=cap.read()
imgRGB=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
result=hands.process(imgRGB)
# print(result.multi_hand_landmarks)
if result.multi_hand_landmarks:
for handLms in result.multi_hand_landmarks:
mpDraw.draw_landmarks(img,handLms,mpHands.HAND_CONNECTIONS)
cv2.imshow("Image",img)
cv2.waitKey(1)
4.上一步我们知道坐标,但是是小数,我们要给它乘上长宽高,并定义为整数,用handLmsStyle,handConStyle把点线变粗;且给把(0~20)的点标记上,并用circle把一个点标记上,最后给屏幕装上当前的时间,Fps帧率,
import cv2
import mediapipe as mp
import time #一秒钟几次画面
cap=cv2.VideoCapture(0)
mpHands=mp.solutions.hands # 坐标
hands=mpHands.Hands()
mpDraw =mp.solutions.drawing_utils #画点动标的动作
# 改变点线样式
handLmsStyle=mpDraw.DrawingSpec(color=(0,0,255),thickness=5)
handConStyle=mpDraw.DrawingSpec(color=(0,255,0),thickness=10)
pTime=0
cTime=0
while True:
ret,img = cap.read()
if ret:
# 要转化成RGB,opencv里面是BGR的图片
imgRGB=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
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)
# 标点0~20
cv2.putText(img,str(i),(xPos-25,yPos+5),cv2.FONT_HERSHEY_SIMPLEX,0.4,(0,0,255),2)
if i ==4:
cv2.circle(img,(xPos,yPos),20,(166,56,56),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)
cv2.imshow('img',img)
if cv2.waitKey(1)==ord('q'):
break