美文网首页python计算机视觉
python 检测手指,虚拟挪动屏幕上的方块

python 检测手指,虚拟挪动屏幕上的方块

作者: 一位不愿透露自己姓氏的先生 | 来源:发表于2023-03-21 17:52 被阅读0次

环境:
python3.8

描述:使用opencv读取摄像头帧数据,使用mediapipe检测手指坐标

个人学习记录不喜勿喷
贴上代码:

# 手势拖拽方块

import cv2
import numpy as np

# mediapipe 参数
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_hands = mp.solutions.hands

hands =  mp_hands.Hands(
   model_complexity=0,
   min_detection_confidence=0.5,
   min_tracking_confidence=0.5)


# 获取摄像头视频流
cap = cv2.VideoCapture(0)
# 获取画面宽度和高度
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

#  方块参数
square_x = 100
square_y = 100
square_width = 100

L1 = 0
L2 = 0
on_square = False

while True:
   # 读取视频帧数据
   ret,frame = cap.read()

   # 对图像进行处理
   # 镜像处理
   frame = cv2.flip(frame,1)

   # mediapip处理 
   frame.flags.writeable = False
   frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
   results = hands.process(frame)

     # Draw the hand annotations on the image.
   frame.flags.writeable = True
   frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)

   # 解析results
   # 判断是否出现双手
   if results.multi_hand_landmarks:
     #解析每一双手
     for hand_landmarks in results.multi_hand_landmarks:
       # 绘制21个关键点
       mp_drawing.draw_landmarks(
           frame,
           hand_landmarks,
           mp_hands.HAND_CONNECTIONS,
           mp_drawing_styles.get_default_hand_landmarks_style(),
           mp_drawing_styles.get_default_hand_connections_style())
       # print(hand_landmarks)
       x_list = []
       y_list = []
       for landmark in hand_landmarks.landmark:
          #添加x坐标
          x_list.append(landmark.x)
          #添加y坐标
          y_list.append(landmark.y)
       # 获取食指指尖x y坐标
       index_finger_x = int(x_list[8]*width)
       index_finger_y = int(y_list[8]*height)
       # 画一个圆验证坐标
       # cv2.circle(frame,(index_finger_x,index_finger_y),30,(255,0,255),-1)

       # 判断食指指尖在不在方块上
       if (index_finger_x > square_x) and (index_finger_x < (square_x + square_width)) and (index_finger_y > square_y) and (index_finger_y < (square_y + square_width)):
           L1 = abs(index_finger_x - square_x)
           L2 = abs(index_finger_y - square_y)
           on_square = True

       if on_square:
           square_x = index_finger_x - L1
           square_y = index_finger_y - L2
   else:
      on_square = False
   # 画一个方块
   cv2.rectangle(frame,(square_x,square_y),(square_x+square_width,square_y+square_width),(255,0,0),-1)

   # 显示
   cv2.imshow('virtual drag',frame)

   if cv2.waitKey(10)  & 0xFF == 27:
       break

cap.release()
cv2.destroyAllWindows()



相关文章

  • js 开发移动端,滚动页面显得很木,很卡,手离开屏幕立刻停止

    js 开发移动端的页面,手指在屏幕上挪动 3cm,屏幕中的内容也移动 3cm,显得很木、很卡、hin 傻,而且当手...

  • touch事件

    touchstart: 手指放到屏幕上时触发 touchmove: 手指在屏幕上滑动式触发 touchend:手指...

  • 移动端Touch事件

    touchstart: //手指放到屏幕上时触发touchmove: //手指在屏幕上滑动式触发touchend:...

  • Bootstrap学习

    移动端的js事件 1、touchstart: //手指放到屏幕上时触发2、touchmove: //手指在屏幕上滑...

  • 嘿嘿,跳舞

    写作,可能还算不上写作,在我看来就是用文字记录、见证自己的一路成长,手指敲在屏幕上,随着方块字的跃然出现,我的心会...

  • Android事件传递处理

    事件类型 MotionEvent ACTION_DOWN ——手指接触屏幕ACTION_MOVE——手指在屏幕上移...

  • 意外

    他不停地挪动鼠标。 电脑屏幕上的箭头在密密麻麻的文件夹中来来回回游走。 打开,关闭,关闭,打开…… 他的十个手指头...

  • Kevin Learn Android:Android 手签板

    前言 Android 屏幕手写签名的原理就是把手机屏幕当作画板,把用户手指当作画笔,手指在屏幕上在屏幕上划来划去,...

  • vue 移动端 实现div拖拽移动

    相关知识点touchstart 当在屏幕上按下手指时触发touchmove 当在屏幕上移动手指时触发touchen...

  • vue 移动端 实现div拖拽移动

    相关知识点touchstart 当在屏幕上按下手指时触发touchmove 当在屏幕上移动手指时触发touchen...

网友评论

    本文标题:python 检测手指,虚拟挪动屏幕上的方块

    本文链接:https://www.haomeiwen.com/subject/bubmrdtx.html