【OpenCV 实战】1.手势虚拟拖拽(双手骨骼点识别)

news/2024/10/8 10:09:32/

step:
1.opencv 获取视频流
2.在画面上画一个方块
3.通过mediapipe获取手指关键点坐标
4.判断手指是否在方块上
5.若在方块上,方块跟着手指移动
 

mediapipe网站介绍:Hands - mediapipe (chuoling.github.io)

已上传到GitHub : plumqm/OpenCV-project: 通过20个项目学习计算机视觉(Learn computer vision through 20 projects) (github.com)

"""
author = qian
date = 2024-10-07step:
1.opencv 获取视频流
2.在画面上画一个方块
3.通过mediapipe获取手指关键点坐标
4.判断手指是否在方块上
5.若在方块上,方块跟着手指移动"""import cv2
import numpy as npimport mediapipe as mpmp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_hands = mp.solutions.handshands = mp_hands.Hands(static_image_mode=True,max_num_hands=2,min_detection_confidence=0.5)# 1.opencv 获取视频流
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
square_color = (255,0,0)
L1 = 0
L2 = 0
on_square = Falsewhile True:# 读取每一帧ret, frame = cap.read()# 处理图像frame = cv2.flip(frame, 1)  # 镜像# mediapipe处理frame.flags.writeable = Falseframe = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)results = hands.process(frame)frame.flags.writeable = True    frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)# 判断是否出现手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())# 保存21个x,y坐标x_list = [landmark.x for landmark in hand_landmarks.landmark]y_list = [landmark.y for landmark in hand_landmarks.landmark]# 获取食指指尖index_finger_X = int(x_list[8] * width)index_finger_Y = int(y_list[8] * height)# 获取中指指尖middle_finger_X = int(x_list[12] * width)middle_finger_Y = int(y_list[12] * height)# 计算食指中指指尖距离finger_len = np.sqrt((middle_finger_X - index_finger_X)**2 + (middle_finger_Y - index_finger_Y)**2)# cv2.circle(frame, (index_finger_X,index_finger_Y)# ,20 ,(255,0,255) ,-1)# 手指是否在方块上if square_x <= x_list[4] <= square_x + square_width and square_y <= y_list[4] <= square_y + square_width:square_x += (x_list[4] - square_x) / 10square_y += (y_list[4] - square_y) / 10# 如果距离小于30算激活if finger_len < 30:# 判断食指指尖在不在方块上if (square_x <= index_finger_X <= square_x + square_width and square_y <= index_finger_Y <= square_y + square_width):if on_square == False :L1 = abs(index_finger_X - square_x)L2 = abs(index_finger_Y - square_y)on_square = Truesquare_color = (255,0,255)else :passif on_square == True:square_x = index_finger_X - L1square_y = index_finger_Y - L2else :on_square = Falsesquare_color = (255,0,0)# 2. 在画面上画一个方块# cv2.rectangle(frame, (square_x, square_y), (square_x+square_width, square_y+square_width), (255, 0, 0), -1)# 画半透明方块overlay = frame.copy()cv2.rectangle(frame, (square_x, square_y), (square_x+square_width, square_y+square_width), square_color, -1)frame = cv2.addWeighted(overlay,0.5,frame,0.5,0)# 显示cv2.imshow('Virtual drag', frame)if cv2.waitKey(10) & 0xFF == 27:break cap.release()
cv2.destroyAllWindows()


http://www.ppmy.cn/news/1536068.html

相关文章

『网络游戏』制作加载进度UI【04】

将上一章的提示界面隐藏 创建空节点重命名为LoadingWnd 设置父物体为伸展 创建一个image背景重命名为bg 将以下资源放进Art文件夹 设为精灵模式后拖拽 将下面资源图片放进Art文件夹 创建Image作为进度条重命名为loadingbg 复制一份重命名为loadingfg 将loadingfg设置为水平填充…

什么是 HTTP 请求中的 preflight 类型请求

在浏览器的 HTTP 请求中&#xff0c;当我们使用 fetch API 或者 XMLHttpRequest 来进行跨域请求时&#xff0c;浏览器有时会发送一种称为 Preflight 的请求。这种请求是浏览器在实际发送跨域请求前&#xff0c;先与目标服务器进行的一次 “探测” 请求&#xff0c;以确认服务器…

机器学习框架

机器学习框架是用于构建、训练和评估机器学习模型的工具集。以下是一些常用的机器学习框架&#xff1a; TensorFlow&#xff1a;由Google开发的开源框架&#xff0c;支持深度学习和传统机器学习模型。 PyTorch&#xff1a;由Facebook开发的开源框架&#xff0c;重点支持动态计…

医院管理新趋势:Spring Boot技术引领

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

CoppeliaSim和Matlab建立远程连接教程

CoppeliaSim和Matlab建立远程连接教程 Matlab通过调用CoppeliaSim的远程API和库函数实现远程连接,为实现Matlab和CoppeliaSim的联合仿真做准备。 一、获取并查看版本信息 点击 Help 查看版本信息 使用的CoppeliaSim Edu版本为:4.4.0 位数:64bit 二、拷贝API函数和库文件…

Spring Boot驱动的现代医院管理系统

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

微信小程序的面试题

简述下 wx.navigateTo(), wx.redirectTo(), wx.switchTab(), wx.navigateBack(), wx.reLaunch() 区别 &#xff1f; wx.navigateTo() : 保留当前页面&#xff0c;跳转到应用内的某个页面。但是不能跳到 tabbar 页面 wx.redirectTo() : 关闭当前页面&#xff0c;跳转到应用内的…

《自然语言处理NLP》—— 词嵌入(Embedding)及 Word2Vec 词嵌入方法

在了解词嵌入之前需要了解什么是独热编码&#xff08;One-Hot Encoding&#xff09;&#xff0c;下面链接的文章中对其有简单的介绍 https://blog.csdn.net/weixin_73504499/article/details/142748311?spm1001.2014.3001.5501 一、词嵌入介绍 词嵌入&#xff08;Embedding…