演示视频如下,

https://gitee.com/dfytensor/air_operating_system/raw/master/%E4%B8%AD%E5%9B%BD%E8%B1%A1%E6%A3%8B/chiese_chess_vedio.mp4
import cv2
import mediapipe as mp
import pyautogui
import numpy as npscreenWidth, screenHeight = pyautogui.size()mp_drawing = mp.solutions.drawing_utils
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(static_image_mode=False,max_num_hands=1,min_detection_confidence=0.65,min_tracking_confidence=0.65)def shibie_wuzhi_zhuangtai(hand_dict):finger_list = []for finger_poindts in [[2, 3, 4], [6, 7, 8], [10, 11, 12], [14, 15, 16], [18, 19, 20]]:x, y, z = finger_poindts#finger_one = hand_dict[x].y > hand_dict[y].y and hand_dict[y].y > hand_dict[z].yfinger_list.append(finger_one)return finger_listcap = cv2.VideoCapture(0)
state_list=[1]while True:ret, frame = cap.read()frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)# 因为摄像头是镜像的,所以将摄像头水平翻转# 不是镜像的可以不翻转frame = cv2.flip(frame, 1)results = hands.process(frame)frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)if results.multi_hand_landmarks:for hand_landmarks in results.multi_hand_landmarks:# 识别状态hand_dict = {i: v for i, v in enumerate(hand_landmarks.landmark)}# finger_table = shibie_wuzhi_zhuangtai(hand_dict)# history_list.append(hand_dict)if hand_dict:a = (hand_dict[17].x - hand_dict[0].x) ** 2 + (hand_dict[17].y - hand_dict[0].y) ** 2b = (hand_dict[5].x - hand_dict[0].x) ** 2 + (hand_dict[5].y - hand_dict[0].y) ** 2c = (hand_dict[5].x - hand_dict[17].x) ** 2 + (hand_dict[17].y - hand_dict[0].y) ** 2cosc = (a + b - c) / 2 / np.sqrt(a * b)#if  len(state_list)>8:state_list=state_list[-3:]if np.arccos(cosc) > 1.0:shou_zhang_s = np.sqrt(b * (1 - cosc ** 2) * a) / 2currentMouseX = min(np.floor(hand_dict[0].x* screenWidth), screenWidth - 1)currentMouseY = min(np.floor(hand_dict[0].y * screenHeight), screenHeight - 1)if shou_zhang_s < 0.016:# 移动动作模拟print("移动层")currnet_state=1state_list.append(currnet_state)pyautogui.moveTo(currentMouseX,currentMouseY, duration=0, tween=pyautogui.linear)elif shou_zhang_s > 0.016 and shou_zhang_s < 0.030:# 单击动作模拟currnet_state = 3print("单击层", state_list[-1], currnet_state)if  state_list[-1]!=currnet_state :pyautogui.click()state_list.append(currnet_state)elif shou_zhang_s > 0.030:# 拖拽动作模拟print("移动拖拽")currnet_state = 2# if state_list[-1] != currnet_state:pyautogui.dragTo(currentMouseX, currentMouseY, duration=0, tween=pyautogui.linear)state_list.append(currnet_state)# 可视化的时候可以将背景设置为不同的颜色来表达,所处的操作模式不同,font = cv2.FONT_HERSHEY_SIMPLEXframe = np.zeros(frame.shape).astype("uint8")if state_list[-1]==1:frame[:,:,0]=255frame = cv2.putText(frame, '001_move', (0, 100), font, 1.2, (255, 255, 255), 2)elif state_list[-1]==2:frame[:, :, 1] = 255frame = cv2.putText(frame, '002_drag', (0, 100), font, 1.2, (255, 255, 255), 2)elif state_list[-1]==3:frame[:, :, 2] = 255frame = cv2.putText(frame, '003_click', (0, 100), font, 1.2, (255, 255, 255), 2)mp_drawing.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)else:frame = np.zeros(frame.shape).astype("uint8")else:frame = np.zeros(frame.shape).astype("uint8")cv2.imshow('MediaPipe Hands', frame)if cv2.waitKey(1) & 0xFF == 27:break
cap.release()if __name__ == '__main__':pass

隔空操作之隔空下象棋相关推荐

  1. Kotlin中的一些判空操作、空安全

    前言 很久没有更新博客了,其实并不是因为太忙,也不是遇到的问题不多,是迷茫了,不知道怎么去写,总感觉自己一定会去好好的写文章(哈哈幻想中),但是从来没有动过笔,因为写不好,能力不够.但是还是要去动笔呀 ...

  2. 6月14 空控制器和空操作及命名空间

    空操作和空控制器处理 空操作:就没有指定的操作方法 空控制器:没有指定控制器 1.空操作:(Admin是不存在的) 一般网站处于安全考虑不给用户提示任何错误信息 "空操作"本质意思 ...

  3. 苹果手机连接电脑服务器传文件,还在羡慕苹果电脑隔空操作?windows的这个骚操作,3秒即可传文件...

    佳乐说资源,专注好资源!大家好我是佳乐,今天我给大家分享的是:如果对文件进行隔空操作! 通过一些非常简单的设置,我们可以把自己的windows或者苹果电脑作为一个共享设备,我们可以使用手机或者电脑,来 ...

  4. 隔空操作之简单的模拟三种行为

    目前可视化话还是要进步的如果可视化可以悬浮在任何的操作界面之上方可更好的体验,所以目前模拟鼠标这样精准的操作是不可靠的,所以在快捷键快捷方式上应该是一个很好用途,接下来会做一些可靠的隔空操作 impo ...

  5. 荣耀v30鸿蒙5g荣耀有隔空操作吗,荣耀v30Pro支持隔空操作吗 了解手机主要特点

    在此前发布的mate30Pro上,用户可以使用隔空操作,支持隔空截屏等功能,那么荣耀v30Pro支持隔空操作吗?下面来看详细介绍. 荣耀v30Pro不支持隔空操作,手机左上角仅有两枚摄像头,没有配备姿 ...

  6. 选择邻近区域时: 代码操作与实际EXCEL键盘操作的区别 Currentregion与CTRL+A的区别, 又存在于,比如第一行有数据(合并单元格), 第二行为空, 第三行往下有数据, 第一行选中其中

    选择邻近区域时: 代码操作与实际EXCEL键盘操作的区别 Currentregion与CTRL+A的区别, 又存在于,比如第一行有数据(合并单元格), 第二行为空, 第三行往下有数据, 第一行选中其中 ...

  7. thinkPHP 空模块和空操作、前置操作和后置操作 具体介绍(十四)

    本章节:介绍 TP 空模块和空操作.前置操作和后置操作 具体介绍 一.空模块和空操作 1.空操作 function _empty($name){ $this->show("$name ...

  8. Java:List判空的条件:List=null 和 List.size = 0 当需要对一个LIst进行判空操作时我们可使用如下两个语句:

    当需要对一个LIst进行判空操作时我们可使用如下两个语句: if (list == null || list.size() == 0) {} if (list != null && l ...

  9. Java 中的判空操作

    equals与==的区别 一.String 的 isEmpty() 与 null 与 "" 区别 public class demo {public static void mai ...

最新文章

  1. 转帖 javascript事件监听
  2. 【复习笔记】电力系统基础
  3. gedit把关键字符替换为回车键
  4. 2016年度 JavaScript 展望(下)
  5. sharepoint2010 浏览器无法打开word
  6. [Web Chart系列之五] 6. 实战draw2d之ConnectionRouter
  7. printf 输出字符串 需要加上 c_str()
  8. 关于在Servlet的路径问题
  9. oracle not aviable,ORA-01034: ORACLE not available
  10. pthread_cleanup_push()/pthread_cleanup_pop()的详解
  11. 迷你博客突然走红 至今尚无商业模式
  12. RISCV-MCU启航篇之硬件选择-GD32VF103芯片
  13. linux系统服务器日志,linux系统日志及日志服务器
  14. java程序员面试简历注意事项
  15. [强化学习一]隐马尔可夫基本概念
  16. 移动、电信、联通、QQ币、游戏点卡快速秒充体验
  17. Android Studio 微信分享功能(包括可以分享到朋友圈,分享到朋友)
  18. CVE-2014-0160:心脏出血(心血)漏洞
  19. open-falcon 小米开源监控
  20. 使用python来实现零售行业的数据分析 : EDA+TF-IDF+t-SNE+K-Means+LDA(干货)

热门文章

  1. 傅里叶,请再帮我们一次吧....
  2. 炼一项专业技能c语言,C语言程序设计_安徽新华电脑专修学院
  3. emqx配置mysql认证_emqx使用mysql完成用户密码验证和ACL鉴权-Go语言中文社区
  4. linux手机刷机包制作工具_刷GitHub提交记录工具制作
  5. house robber java_java之 ------------[LeetCode] House Robber 打家劫舍||
  6. python函数只有被调用才会执行_Python函数调用
  7. mongodb php 存储文件大小,PHP MongoDB GridFS 存储文件的方法详解
  8. 图书管理系统python代码课程设计报告_数据结构图书管理系统课程设计报告
  9. matlab单元刚度矩阵整合成整刚,求结构总刚矩阵Matlab源代码
  10. android选择下拉框的默认值,如何在Android中将默认值设置为微调器下拉列表?