图像处理案例02

news/2024/10/18 18:14:06/

目录

  • 1 流程
  • 2 代码

1 流程

手指拖拽屏幕上的方块儿步骤

  1. OpenCv获取视频流
  2. 获取手指关节关键点坐标
  3. 判断手指是否在方块上
  4. 如果在方块上,方块跟着手指移动

2 代码

import cv2
import numpy as np
import math
import mediapipe as mp## 检测手掌参数设置
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_hands = mp.solutions.hands
# 获取手的21个关节
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))
# 方块的相关参数
## box左上角坐标、宽度、颜色
box_x = 100
box_y = 100
box_width = 100
box_high  = 120
box_color = (255, 0, 255)
## 阈值,当食指和中指指尖距离大于阈值时,停止移动box
threth = 80
## 食指指尖与box左上角坐标的距离
d1 = 0
d2 = 0
## 食指指尖是否在方块上
on_box = Falsewhile True:# 1. 读取每一帧ret, frame = cap.read()# 对图像进行处理# 镜像处理,对y轴进行翻转frame = cv2.flip(frame, 1)# mediapipe处理RGB通道的图像frame.flags.writeable = Falseframe = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)## 2.手掌检测RGB图像results = hands.process(frame)frame.flags.writeable = Trueframe = 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 = []y_list = []for landmark in hand_landmarks.landmark:  # 会循环21次把手的关节弄好# 添加x坐标x_list.append(landmark.x)  # append表示添加x坐标# 添加y坐标y_list.append(landmark.y)# 获取食指指尖xy坐标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 = math.hypot((index_finger_x - middle_finger_x),(index_finger_y - middle_finger_y))if finger_len < threth:# 3. 判断指尖是否在方块上面if (box_x < index_finger_x < box_x + box_width and box_y < index_finger_y < box_y + box_high):if on_box == False:## 如果食指在box内移动,则保持d1、d2不更新,即box与食指的相对位置不变d1 = abs(index_finger_x - box_x)d2 = abs(index_finger_y - box_y)on_box = True## 如果食指在box上,则变换box为水红色box_color = (255, 0, 255)else:on_box = False## 如果食指不在box上,则变换box为蓝颜box_color = (255, 0, 0)if on_box:  # 如果手指在方块上面        box_x = index_finger_x - d1  # 根据算法box_y = index_finger_y - d2# 4. 画出boxcv2.rectangle(frame, (box_x, box_y), (box_x + box_width, box_y + box_high), box_color, -1)frame = cv2.addWeighted(frame.copy(), 0.5, frame, 0.5, 0)  # 做一个半透明# 显示图像cv2.imshow('Box drag', frame)# 退出条件if cv2.waitKey(10) & 0xFF == ord('q'):break
cap.release()
cv2.destroyAllWindows()

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

相关文章

【深度学习】Accelerate和DeepSpeed有什么区别?

Accelerate和DeepSpeed是用于加速深度学习模型训练的两种工具,虽然它们有不同的设计目标和实现方式,但它们也可以互相配合使用,以提高大规模模型训练的效率和灵活性。 Accelerate Accelerate是Hugging Face推出的一个库,旨在简化和加速PyTorch模型在多GPU和多机环境下的训…

YoloV10 论文翻译(Real-Time End-to-End Object Detection)

​摘要 近年来&#xff0c;YOLO因其在计算成本与检测性能之间实现了有效平衡&#xff0c;已成为实时目标检测领域的主流范式。研究人员对YOLO的架构设计、优化目标、数据增强策略等方面进行了探索&#xff0c;并取得了显著进展。然而&#xff0c;YOLO对非极大值抑制&#xff0…

电路中电阻,电容和电感作用总结

电阻作用 1&#xff0c;上拉电阻 电阻的连接一般是一端接上拉的电源&#xff08;一般与芯片信号的电压值相匹配&#xff09;&#xff0c;另一端连接芯片引脚所对应的信号大概如下图 功能&#xff1a;一、预置某些引脚的功能&#xff0c;例如复位信号拉高&#xff08;失能&…

Python酷库之旅-第三方库Pandas(068)

目录 一、用法精讲 271、pandas.Series.dt.dayofyear属性 271-1、语法 271-2、参数 271-3、功能 271-4、返回值 271-5、说明 271-6、用法 271-6-1、数据准备 271-6-2、代码示例 271-6-3、结果输出 272、pandas.Series.dt.days_in_month属性 272-1、语法 272-2、参…

elementPuls_Treeg更改颜色

elementPuls_Treeg更改颜色 .el-tree {background: transparent;color: #fff;}:deep(.el-tree-node__content:hover) {background: rgba(2, 167, 240, 0.5);}//选中的背景色:deep(.el-tree--highlight-current.el-tree-node.is-current> .el-tree-node__content) {backgrou…

ps绘制动图

ps绘制动图教程&#xff08;简易版&#xff09;-直播gif动态效果图 第一步 打开ps绘制几个简单的长方形 第二步 将图层转化为智能图层 第三部 在窗口找到时间轴创建时间轴 第五步 通过变换来鼠标控制图像的变化并打下结束点 第六部 通过图像中的图像大小控制gif的大小 第七部 …

使用easy-es

使用easy-es 使用yudada的源码。他引用了这个&#xff0c;但是没有使用这个功能。 那我们就是用这个把。 https://gitee.com/dromara/easy-es 官网介绍。https://www.easy-es.cn/pages/e7cb71/#_1-%E6%A3%80%E7%B4%A2%E7%B1%BB%E6%9C%8D%E5%8A%A1 注意问题&#xff1a; e…

通过指令深入了解Linux

文章目录 1.简单介绍XShell1.1下载安装XShell1.2 使用XShell登录主机1.3 XShell下的复制粘贴 2. Linux下的基本指令2.1 ls指令2.1.1 对文件的理解2.1.2 目录下的隐藏文件 2.2 pwd指令2.3 cd指令2.3.1 Linux下目录结构的认识 2.4 touch指令2.5 mkdir指令2.6 clear指令 1.简单介绍…