当我们可以追踪手部关键点的时候我们就可以进行一些手语的识别或者手势含义方面的应用,本文讲采用opencv以及mediapipe两个模组对首部关键点进行编码。
这是我们要采集的21个点。当我们把这21个点找出来之后,我们就可以大概知道手部动作了。
首先引进这两个个模组
然后我们需要引入我们的摄像头,用opencv来调取。然后接下来就要用到mediapipe这个模组,其中就有手部关键点的模组然后我们调用这个方程进行使用。
调用mediapipe的手部模组
其中要注意的一点是我们需要的是RGB的图片,而opencv读取到的都是BGR的图片所以我们需将它转换。
后面就是手部模组函数的应用:其中我们需要用到这个函数,它能帮我们读取手上那21点的坐标。然后我们要做的就是将这21个点的坐标画到手上面去。
首先先调用mediapipe中的函数:
把它放进if ret里面进行引用
然后便可以讲手上的21点进行标注,后面就需要把这21个点链接起来即可。
只需要在mpDraw.Draw_landmarks函数里面加入第三个参数mp.HANDS_CONNECTIONS
然后再运行一次就可以将手上的21点链接起来了。如果想要更改点的样式和线的样式,我们可以在mpDraw.Draw_landmarks函数里面加入第四或第五个参数。
然后我们需要知道这21个点的坐标才可以进行运用,比如通过这21个点的坐标分析每跟手指之间的角度来进行运算分析此时的手势是什么意思。所以我们要打印出这21个点的坐标。
我们可以再套入一个for循环来打印这21个点的坐标。因为我们要知道这个坐标对应的是第几个点,所以我们可以利用enumerate函数。
但此时我们输出的并不是它的坐标而是它对应图像长宽高的比例。我们需要进行以下的输出。
我们也可以在图像中标注出点对应的数字。
如果要知道跟踪手掌刷新几次我们可以添加time模组进行应用。
完全的代码如下:
import cv2
import mediapipe as mp
import time
cap = cv2.VideoCapture(0)
mpHands = mp.solutions.hands
hands = mpHands.Hands() #使用meidapipe的手部追踪模型
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:
imgRGB = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) #把bgr的图片转化成rgb
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,255),2)#给点编号
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'):#点q关闭运行
Break
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删