当前位置: 首页 > news >正文

图像处理案例02

目录

  • 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()

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 效率何止10倍!利用输入法瞬间调用提示词
  • Harmony OS 卡片能力
  • ARM 离线安装k8s + harbor私有镜像库(麒麟)
  • NLP 之词的表示与语言模型
  • 巴黎奥运会8K转播科技为国产品牌自主研发设计
  • 第二章 部署LVS-DR集群
  • Mongodb权限
  • 谷粒商城实战笔记-136-商城业务-首页-整合thymeleaf渲染首页
  • Django异步请求和后台管理实战
  • 『哈哥赠书 - 55期』-『码农职场:IT人求职就业手册』
  • IT课程学习搭子
  • 【AD域】搭建AD域服务器
  • C++STL常用总结
  • 2024年7月30日~2024年8月5日周报
  • 技术速递|VS Code Java 7月更新 - Gradle 支持增强!用户体验改进与 Spring 新功能
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 30秒的PHP代码片段(1)数组 - Array
  • ECMAScript6(0):ES6简明参考手册
  • express如何解决request entity too large问题
  • fetch 从初识到应用
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Kibana配置logstash,报表一体化
  • Linux链接文件
  • Python利用正则抓取网页内容保存到本地
  • React的组件模式
  • session共享问题解决方案
  • 彻底搞懂浏览器Event-loop
  • 聚类分析——Kmeans
  • 聊聊flink的BlobWriter
  • 思维导图—你不知道的JavaScript中卷
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 温故知新之javascript面向对象
  • 想使用 MongoDB ,你应该了解这8个方面!
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 整理一些计算机基础知识!
  • 昨天1024程序员节,我故意写了个死循环~
  • ​Java基础复习笔记 第16章:网络编程
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • #laravel部署安装报错loadFactoriesFrom是undefined method #
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • %@ page import=%的用法
  • (1)(1.11) SiK Radio v2(一)
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (1)常见O(n^2)排序算法解析
  • (C++17) optional的使用
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (过滤器)Filter和(监听器)listener
  • (十二)Flink Table API
  • (图文详解)小程序AppID申请以及在Hbuilderx中运行
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (一)u-boot-nand.bin的下载
  • (转)linux下的时间函数使用
  • (转)ORM
  • .chm格式文件如何阅读