opencv实战项目 实现手势跟踪并返回位置信息(封装调用)

 OpenCV 是一个基于 Apache2.0 许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。

需要提前准备opencv 和 mediapipe库

在这里插入图片描述

 

pip --default-timeout=5000 install -i https://pypi.tuna.tsinghua.edu.cn/simple mediapipe

接着上一章的内容,这一次我们加入了fps显示和模块封装,以便我们接下来的学习。

import cv2
import numpy as np
import mediapipe as mp
import time

这部分是导入所需的Python库。cv2 是OpenCV库,用于图像处理和计算机视觉任务。numpy 用于数值计算。mediapipe 是一个Google开发的库,用于处理计算机视觉任务,例如姿势检测、手势识别等。time 是Python标准库,用于处理时间相关的操作。

class handDetector():def __init__(self, mode=False, maxHands=2, detectionCon=0.5, trackCon=0.5):self.mode = modeself.maxHands = maxHandsself.detectionCon = detectionConself.trackCon = trackConself.mpHands = mp.solutions.handsself.hands = self.mpHands.Hands(self.mode, self.maxHands, self.detectionCon, self.trackCon)self.mpDraw = mp.solutions.drawing_utils

这部分定义了一个名为 handDetector 的类。它有一个构造函数 __init__,用于初始化手部检测器对象。传递给构造函数的参数包括:

  • mode: 用于设置手部检测的模式,默认为 False
  • maxHands: 最大检测手的数量,默认为 2。
  • detectionCon: 检测的置信度阈值,默认为 0.5。
  • trackCon: 跟踪的置信度阈值,默认为 0.5。

在构造函数中,还初始化了 mpHandshandsmpDraw 对象。mpHandsmediapipe 库中的手部检测模块,hands 是用于手部检测的实际处理器,mpDraw 是用于在图像上绘制标记的实用工具。

    def findHands(self, img, draw=True):imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)results = self.hands.process(imgRGB)if results.multi_hand_landmarks:for handLms in results.multi_hand_landmarks:if draw:self.mpDraw.draw_landmarks(img, handLms, self.mpHands.HAND_CONNECTIONS)return img

这部分定义了一个名为 findHands 的方法,用于在给定图像上进行手部检测。它接受一个图像(img)和一个布尔值参数 draw,用于指定是否绘制检测结果。

在方法中,首先将图像转换为RGB格式,然后使用手部检测器 hands 处理图像,返回结果。如果检测到了手部,就遍历每个检测到的手部标记点,然后在图像上绘制出手部标记和连接线。最后,返回绘制了标记的图像。

    def findPosition(self,img,handNO=0,draw = True):lmList = []if self.results.multi_hand_landmarks:myHand = self.results.multi_hand_landmarks[handNO]for id, lm in enumerate(myHand.landmark):h, w, c = img.shapecx, cy = int(lm.x * w), int(lm.y * h)lmList.append([id,cx,cy])if draw:cv2.circle(img, (cx, cy), 10, (255, 255, 0), cv2.FILLED)return lmList

这部分定义了 findPosition 方法,用于获取手部标记点的坐标。方法接收一个图像(img)、一个可选的 handNO 参数(表示检测到的手部编号,默认为0)和一个布尔值参数 draw。方法首先检查是否有检测到的手部,如果有,就获取指定编号的手部标记点信息。然后,遍历手部标记点,计算并保存标记点的坐标,并在图像上绘制圆圈。最后,返回标记点坐标的列表。 

def main():pTime = 0cTime = 0cap = cv2.VideoCapture(0)detector = handDetector(maxHands=1)while True:success, img = cap.read()img = detector.findHands(img)lmList = detector.findPosition(img)if len(lmList)!= 0 :print(lmList[4])cTime = time.time()fps = 1 / (cTime - pTime)pTime = cTimecv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3,(255, 0, 155), 3)cv2.imshow("Image", img)cv2.waitKey(1)if __name__ == '__main__':main()

这部分定义了一个名为 main 的函数,用于主要的程序逻辑。在其中,首先初始化了摄像头捕获对象 cap,然后创建了一个 handDetector 的实例,即手部检测器。

进入主循环,不断从摄像头捕获图像,然后调用 detector.findHands(img) 进行手部检测和绘制,将结果显示在窗口中。还计算并绘制了帧率信息。

最后,使用 cv2.waitKey(1) 来处理键盘输入,允许用户退出程序。

总体来说,这段代码实现了从摄像头捕获图像,并使用 mediapipe 进行手部检测和标记绘制,同时还显示了帧率信息。这可以用于实时手势识别和交互应用。

 帧率在三十左右

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/84999.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【JavaEE基础学习打卡02】是时候了解JavaEE了

目录 前言一、为什么要学习JavaEE二、JavaEE规范介绍1.什么是规范?2.什么是JavaEE规范?3.JavaEE版本 三、JavaEE应用程序模型1.模型前置说明2.模型具体说明 总结 前言 📜 本系列教程适用于JavaWeb初学者、爱好者,小白白。我们的天…

如何在docker部署一个python项目

导语: 我之前已经实现了在服务器上直接部署一个文件,但是那种部署方式有个明显的缺陷:我如果需要在其他机器部署该项目时,需要重新配置项目所依赖的环境。因此我们需要一种只需要配置一次环境依赖,就可以在其他机器上随…

竞赛项目 深度学习的动物识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

Flv格式视频怎么转MP4?视频格式转换方法分享

FLV格式的视频是一种早期的视频格式,不支持更高的分辨率和比特率,这意味着视频的清晰度和质量受限制,无法很好地保留细节和质量,这种格式的视频已经逐渐被更高质量的视频格式所替代,例如MP4格式,不仅具有很…

网络安全 Day29-运维安全项目-iptables防火墙

iptables防火墙 1. 防火墙概述2. 防火墙2.1 防火墙种类及使用说明2.2 必须熟悉的名词2.3 iptables 执行过程※※※※※2.4 表与链※※※※※2.4.1 简介2.4.2 每个表说明2.4.2.1 filter表 :star::star::star::star::star:2.4.2.2 nat表 2.5 环境准备及命令2.6 案例01&#xff1a…

springboot+mybatis实现简单的增、删、查、改

这篇文章主要针对java初学者,详细介绍怎么创建一个基本的springboot项目来对数据库进行crud操作。 目录 第一步:准备数据库 第二步:创建springboot项目 方法1:通过spring官网的spring initilizer创建springboot项目 方法2&am…

K8S系列文章 之 容器网络基础 Docker0

什么是Docker0 使用ip addr命令看一下网卡&#xff1a; rootKitDevVps:~# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host…

SpringWeb项目核心功能总结

SpringWeb项目核心功能总结 文章目录 SpringWeb项目核心功能总结1.浏览器与Java程序的连接&#xff08;个人偏好使用RequestMapping&#xff09;2.参数的传入3.结果的返回请求转发和请求重定向的区别 核心功能用到的注解&#xff1a; RestControllerControllerResponseBodyRequ…

前端主题切换方案——CSS变量

前言 主题切换是前端开发中老生常谈的问题&#xff0c;本文将介绍主流的前端主题切换实现方案——CSS变量 CSS变量 简介 编写CSS样式时&#xff0c;为了避免代码冗余&#xff0c;降低维护成本&#xff0c;一些CSS预编译工具&#xff08;Sass/Less/Stylus&#xff09;等都支…

AP2915DC-DC降压恒流驱动IC LED电源驱动芯片 汽车摩托电动车灯

AP2915 是一款可以一路灯串切换两路灯串的降压 恒流驱动器,高效率、外围简单、内置功率管&#xff0c;适用于 5-80V 输入的高精度降压 LED 恒流驱动芯片。内置功 率管输出功率可达 12W&#xff0c;电流 1.2A。 AP2915 一路灯亮切换两路灯亮&#xff0c;其中一路灯亮可 以全亮&a…

YOLOv5、YOLOv8改进:添加ShuffleAttention注意力机制

广泛应用的注意力机制主要有空间注意力机制和通道注意力机制&#xff0c;其目的分别是捕捉像素级的成对关系和通道依赖关系。虽然将两种机制融合在一起可以获得比单独更好的性能&#xff0c;但计算开销不可避免。因而&#xff0c;本文提出Shuffle Attetion&#xff0c;即SA&…

标准化归一化 batch norm, layer norm, group norm, instance norm

Layer Normalization - EXPLAINED (in Transformer Neural Networks) Layer Normalization - EXPLAINED (in Transformer Neural Networks) 0~4min:什么是multi-head attention 5~7min:layer norm图示 7~9min:公式举例layer norm 9:54-end:layer norm的代码示例 group n…

atx2环境搭建

1. 卸载python3.11.4版本 $sudo rm -rf /Library/Frameworks/Python.framework/Versions/3.11/ $sudo rm -rf /Applications/Python\ 3.11/ 第三步&#xff1a;删除指向python的链接 cd /usr/local/bin/ ls -l /usr/local/bin | grep /Library/Frameworks/Python.framework/…

详解使用SSH远程连接Ubuntu服务器系统

演示环境&#xff1a; 1.Windows10系统 2.VMware Workstation Pro虚拟机 2.Ubuntu16.04.6&#xff08;以上版本通用&#xff09; 回归正题 一、在Ubuntu端&#xff1a; 1.首先需要安装SSH服务器&#xff0c;在ubuntu终端输入以下指令 sudo apt-get install ssh2.输入你的ubu…

pytest 常用命令参数

-x 用例一旦失败或错误时就立即停止执行 共两条用例&#xff0c;运行第一条报错失败或报错&#xff0c;第二条就不会执行 pytest -vs -x test_pytest_study.py::TestCommon1 共2条用例&#xff0c;当执行到第一条失败时候&#xff0c;第二条不执行 --maxfailnum …

碳中和与碳达峰对卫星遥感的现实需求,遥感技术在生态系统碳储量、碳收支、碳排放、碳循环以及人为源排放反演等领域的技术发展

卫星遥感具有客观、连续、稳定、大范围、重复观测的优点&#xff0c;已成为监测全球碳盘查不可或缺的技术手段&#xff0c;卫星遥感也正在成为新一代 、国际认可的全球碳核查方法。本教程的目的就是梳理碳中和与碳达峰对卫星遥感的现实需求&#xff0c;系统总结遥感技术在生态系…

C++复习笔记——primer第五版

文章目录 一、引用和指针1.引用2.指针2.1利用指针访问对象2.2指针的值或指针所指对象的值的改变 3.赋值和指针4.指向指针的引用 二、String1.初始化String对象的方式2. string对象上的操作3.使用getline读取一整行4.字面值和字符串相加5.使用for循环改变字符串中的字符 三、Vec…

Ctfshow web入门 SSTI 模板注入篇 web361-web372 详细题解 全

CTFshow SSTI web361 笔记分享 一、代码块 变量块 {{}} 用于将表达式打印到模板输出 注释块 {##} 注释 控制块 {%%} 可以声明变量&#xff0c;也可以执行语句 {% for i in .__class__.__mro__[1].__subclasses__() %}{% if i.__name___wrap_close %}{% print i.__init__.…

WinServer2016 DHCPv6部署

Windows Server 2016 部署 DHCPv6 应用场景&#xff1a;如果服务器的 idrac 地址配置之后忘记了&#xff0c;又无法不能重启服务器&#xff0c;可以通过 DHCPv6 来解决。因为服务器 idrac 的 ipv6 自动获取是默认开启的&#xff0c;那么可以用笔记本装个 windwos server 的系统…

vue3多页面配置你一定会遇到的问题,踩坑指南

vue3实现多页面打包容易&#xff0c;关键是如何实现本地的开发和调试&#xff1f;我们接下来解决如下几个问题&#xff1a; 1 多页面项目的项目结构是怎样的&#xff1f; --public--src---App.vue---main.js---page1. ---App.vue---main.js----home.vue----list.vue---page2.…