OpenCV + MediaPipe 手势识别追踪(AI人工智能/计算机视觉/图像处理)

OpenCV + MediaPipe 手势识别追踪

这里我使用的是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

效果展示
OpenCV + MediaPipe 手势识别追踪(AI人工智能/计算机视觉/图像处理)_第1张图片
当然可以通过设置不同的参数是图像的展现效果不同,比如点的大小、颜色、线的大小等等。

函数及其参数参考:
(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

你可能感兴趣的:(计算机视觉,计算机视觉,opencv,人工智能,python)