这里我使用的是PYCharm,首先需要安装opencv-python 和mediapipe两个软件包,这里使用清华大学镜像安装比较快,不会出现超时错误,如下为命令行安装指令
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple mediapipe
安装完成后就可以开始代码部分的编写,如下为代码段,代码段的部分函数及其参数可参考文末
import cv2
import mediapipe as mp
import time
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW) # 调用电脑摄像头,我这里参数设置成1的时候出现了不兼容的问题,参数为镜头编号
mpHands = mp.solutions.hands # 使用手部模型,参考文末函数(1)
hands = mpHands.Hands(max_num_hands=4) # 调用Hands函数,有五个参数可以设置
mpDraw = mp.solutions.drawing_utils # 在图像上画坐标点
handLmsStyle = mpDraw.DrawingSpec(color=(0, 255, 0), thickness=5)
handConStyle = mpDraw.DrawingSpec(color=(255, 0, 0), thickness=4)
pTime = 0
cTime = 0
while True:
ret, img = cap.read() # cap.read()按帧读取视频,ret是布尔值,img接受返回的每一帧的图像
if ret:
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 需要先将opencv预设的BGR图片转换成RGB图片
result = hands.process(imgRGB) # 把转换结果放到result
imgHeight = img.shape[0] # 图像的纵坐标
imgWidth = img.shape[1] # 图像的横坐标
# 用于图像上标识fps
cTime = time.time()
fps = int(1/(cTime - pTime))
pTime = cTime
cv2.putText(img, f"FPS = {fps}", (30, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255,0,0), 3) # 标识fps
# print(result.multi_hand_landmarks) # 回传手上21个点的x y z坐标
if result.multi_hand_landmarks:
for handlms in result.multi_hand_landmarks:
mpDraw.draw_landmarks(img, handlms, mpHands.HAND_CONNECTIONS, handLmsStyle, handConStyle) # 在图像上画出每一个点,参数参考文末函数(3)
for i, lm in enumerate(handlms.landmark):
xPos = int(lm.x * imgWidth) # 如果直接打印的是lm.x则是比例,可以用比例×图像的横坐标得到图像点的坐标
yPos = int(lm.y * imgHeight)
cv2.putText(img, str(i), (xPos-5, yPos-5), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0, 0, 255), 2) # 在图像上标识点的信息
# if i == 4:
# cv2.circle(img, (xPos, yPos), 20, (0,0,255), cv2.FILLED) # 可以对特定点设置不同的标识特点,具体看参数
print(i, xPos, yPos) # 打印第i个点的坐标
cv2.imshow('img', img) # 显示图像
if cv2.waitKey(1) == ord('q'):
break
效果展示
当然可以通过设置不同的参数是图像的展现效果不同,比如点的大小、颜色、线的大小等等。
函数及其参数参考:
(1)hands函数的5个参数:(都有默认值)
①static_image_mode=False, (当为视频时设置False,静态图像时设置True)
②max_num_hands=2, (最多手部识别数量)
③ model_complexity=1, (模型复杂度目前值可以设置0或1,值越大越精准)
④min_detection_confidence=0.5, (最低侦测自信度,也就是侦测手部的严谨度,值越高可能识别不到手,值较低则可能将其他物体识别为手,取值0到1之间)
⑤min_tracking_confidence=0.5 (最低追踪自信度,也就是追踪的严谨度,越严谨则可能重新侦测,不严谨可能追不到)
(2)OpenCV2中 cv2.VideoCapture(),read(),waitKey()的使用参考:点击这里
(3)draw_landmarks()函数:(图像名,坐标,连线,坐标点风格,连线风格)
其他函数可参考pyCharm里边的参数类型及其含义
最后附上B站大佬的视频:https://www.bilibili.com/video/BV1GR4y1W7KS