py手部追踪

环境

#opencv-python
#cvzone
#mediapipe
#msvc-runtime  #找不到指定模块,安装它

代码

#检测食指与中指中点的轨迹(两手指合并)
import cv2
import cvzone
import numpy as np
from cvzone.HandTrackingModule import HandDetector
import math
cap = cv2.VideoCapture(0)
cap.set(3,1280)
cap.set(4,720)
detector = HandDetector(detectionCon=0.8)#手部探测器
lmList = []
penlist=[]
#img_mofazhen=cv2.imread("img/mofazhen.jfif")
while True:
    success,img = cap.read()
    img = cv2.flip(img,1)
    allHands, img = detector.findHands(img)
    if len(allHands) != 0:
        lmList = allHands[0]['lmList']
        cursor = lmList[8]  # todo 食指的中心点坐标
        l, info, _ = detector.findDistance(lmList[8],lmList[12],img)   # todo 返回食指和中指的距离
        if l < 80:
            l2,info2= detector.findDistance(lmList[4], lmList[20])
            if l2<50:
                penlist=[]
            penlist.append([info[4],info[5]])
            if len(penlist)>1000:
                penlist.pop(0)
    try:
        a,b=penlist[0]
        for i in penlist:
            #cv2.circle(img, (i[0], i[1]), 15, (100, 250,250), cv2.FILLED)
            if math.hypot(i[0] - a,  i[1]- b)<100:
                cv2.line(img, (i[0], i[1]), (a,b), (100, 250, 250), 25)
            a,b=i
    except:
        pass
    cv2.imshow("Image", img)
    cv2.waitKey(1)

代码2

#手势录像
#食指中指相碰开启录像
#两手食指相碰关闭录像
#coding:utf-8
import cv2
import cvzone
from cvzone.HandTrackingModule import HandDetector
import math
import os
cap=cv2.VideoCapture(0)
cap.set(3,1300)
cap.set(4,800)
detector=HandDetector(detectionCon=0.8)#detectioncon 探测时间
key1=0
key2=0
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
        int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))

# 设置要保存视频的编码,分辨率和帧率
def find_filename():
    #os.chdir("video")
    listdir = os.listdir(os.getcwd()+"/video")

    #print(listdir)
    x = 0
    while True:
        file = "video" + str(x) + ".mp4"
        x += 1
        if file not in listdir:
            print(file)
            return "video/"+file
def set_video():
    video = cv2.VideoWriter(
        find_filename(),
        cv2.VideoWriter_fourcc('M', 'P', '4', '2'),
        24,
        size
    )
    return video
video=set_video()
while True:
    success,img=cap.read()
    img=cv2.flip(img,1)
    if key1:
        if video == None:
            video = set_video()
        video.write(img)
        key2 = 0
        cv2.putText(img, "video start", (10, 50), cv2.FONT_HERSHEY_PLAIN, 5,
                    (255, 0, 255), 5)
    if key2:
        if video:
            video.release()
            video=None
        key1=0
        cv2.putText(img, "video stop", (10, 50), cv2.FONT_HERSHEY_PLAIN, 5,
                    (255, 0, 255), 5)

    hands,img=detector.findHands(img)
   # print(hands)
    right=None
    left=None
    for hand in hands:
        lmList=hand['lmList']
        if  hand['type']=='Left':
            left=lmList[8]
        if hand['type']=='Right':
            right=lmList[8]
        l,_,img=detector.findDistance(lmList[8],lmList[12],img)
        if l<65:
            key1=1
            key2=0

    if right and left:
        l,_=detector.findDistance(right,left)
        if l<80:
            key2=1
            key1=0

    cv2.imshow("手势录像机",img)
    cv2.waitKey(1)


posted @ 2022-05-02 20:33  李墨韵  阅读(173)  评论(1编辑  收藏  举报