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

news2025/2/28 4:02:10

 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 = mode
        self.maxHands = maxHands
        self.detectionCon = detectionCon
        self.trackCon = trackCon

        self.mpHands = mp.solutions.hands
        self.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.shape
                cx, 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 = 0
    cTime = 0
    cap = 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 = cTime
        cv2.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.coloradmin.cn/o/862327.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

腾讯云服务器使用教程_手把手图文详细介绍

腾讯云服务器使用教程包括注册账号实名认证、选择云服务器CVM或轻量应用服务器CPU内存带宽和系统盘配置、安全设置和云服务器远程连接、安全组端口开通教程、云服务器环境部署以搭建网站为例手把手网站上线,云服务器文件传输和数据备份以及技术支持等详细说明&#…

【Linux】用户和权限

文章目录 前言什么是 root 用户su 命令和 exit 命令sudo 命令为普通用户配置 sudo 认证 用户、用户组管理什么是Linux 用户和用户组用户组管理用户管理创建用户删除用户查看用户所属组将指定用户添加到指定用户组中 查看当前系统的用户和用户组 权限控制权限信息 修改权限控制修…

MyBatisX自动和数据库的字段关联

先下个插件 右键数据库,点MybatisX-Generator 在根据自己需求勾选 actual column:保证数据库的驼峰命名生效

第10集丨Vue 江湖 —— 表单输入绑定

目录 一、v-model1.1 基本用法1.2 值绑定1.3 修饰符1.3.1 .lazy1.3.2 .number1.3.3 .trim 二、总结2.1 案例2.2 效果 一、v-model 1.1 基本用法 功能&#xff1a; v-model指令在表单 <input>、<textarea> 及 <select> 元素上创建双向数据绑定。它会根据控件…

【人工智能前沿弄潮】——生成式AI系列:扩散模型及稳定扩散模型

VAE、GAN的出现&#xff0c;使得生成式AI越发火热&#xff0c;如今扩散模型的出现与兴起&#xff0c;更是将AIGC推到了人工智能风口&#xff0c;被视作如今人工智能生成艺术领域取得突破的主要因素。相较于VAE和GAN,扩散模型生成的图片质量更好。随着transformer架构的出现和pr…

Uniapp当中使用腾讯位置路线规划插件保姆教学

首先我们在使用腾讯地图插件之前我们需要先做几点准备 1&#xff1a;我们需要在腾讯地图位置服务当中注册账号以及在控制台当中创建应用和创建key 这里在创建应用当中应用类型一定要选出行类型&#xff0c;否则后期可能会出现问题。 我们创建完应用之后&#xff0c;点击创建…

elementUi表单恢复至初始状态并不触发表单验证

elementUi表单恢复至初始状态并不触发表单验证 1.场景再现2.解决方法 1.场景再现 左侧是树形列表&#xff0c;右侧是显示节点的详情&#xff0c;点击按钮应该就是新增一个规则的意思&#xff0c;表单内容是没有改变的&#xff0c;所以就把需要把表单恢复至初始状态并不触发表单…

线性代数(三) 线性方程组向量空间

前言 如何利用行列式&#xff0c;矩阵求解线性方程组。 线性方程组的相关概念 用矩阵方程表示 齐次线性方程组&#xff1a;Ax0&#xff1b;非齐次线性方程组&#xff1a;Axb. 可以理解 齐次线性方程组 是特殊的 非齐次线性方程组 如何判断线性方程组的解 其中R(A)表示矩阵A的…

Hugging News #0414: Attention 在多模态情景中的应用、Unity API 以及 Gradio 主题构建器

社区动向 Attention 在视觉领域的应用 注意力机制改变了许多学科的深度学习研究&#xff0c;从 NLP 开始扩展到视觉、语音等。注意力机制的使用在深度学习研究中变得越来越流行&#xff0c;理解和解释注意力机制的内部工作是至关重要的。 我们发布了一个教程&#xff0c;介绍…

面试官:前面我们聊了主从和哨兵,那今天来聊一聊集群吧

目录 秃顶面试官&#xff1a;简单介绍下什么是Redis Cluster呢? 秃顶面试官&#xff1a;那集群的缺点有哪些呢&#xff1f; 秃顶面试官&#xff1a;说说如何搭建集群呢&#xff1f; 秃顶面试官&#xff1a;集群内部是如何通信的呢&#xff1f; 秃顶面试官&#xff1a;线上…

three.js上传模型文件并加载显示

效果大概这样&#xff0c;这个宝箱模型是直接初始化就显示的&#xff0c;人物模型是自己本地添加上去的&#xff0c;代码如下。 <template><div class"container" ref"container"><el-row><el-col :span"24"><div c…

固态硬盘恢复数据,5步搞定!

“不知咋回事&#xff0c;我的固态硬盘突然就有问题了&#xff0c;很多重要的文件也一起丢失了。我正在很努力的解决这个问题&#xff0c;但可惜我对电脑的使用了解比较少&#xff0c;有没有电脑高手可以帮帮我呀&#xff1f; 固态硬盘&#xff0c;通常被称为SSD&#xff0c;它…

stable-diffusion 模型效果+prompt

摘自个人印象笔记&#xff0c;图不完整可查看原笔记&#xff1a;https://app.yinxiang.com/fx/55cda0c6-2af5-4d66-bd86-85da79c5574ePrompt运用规则及技巧 &#xff1a; 1. https://publicprompts.art/&#xff08;最适用于OpenArt 线上模型 https://openart.ai/&#xff09;…

近地面无人机植被定量遥感与生理参数反演技术

遥感&#xff08;RS-Remote Sensing&#xff09;——不接触物体本身&#xff0c;用传感器收集目标物的电磁波信息&#xff0c;经处理、分析后&#xff0c;识别目标物&#xff0c;揭示其几何、物理性质和相互关系及其变化规律的现代科学技术。 换言之&#xff0c;即是“遥远的感…

领克08,开创「芯」时代

中国汽车产业&#xff08;自主品牌&#xff09;的持续向上&#xff0c;正带动本土智能化核心供应链&#xff0c;尤其是关键算力芯片&#xff08;SoC&#xff09;的本土创新。 高工智能汽车研究院监测数据显示&#xff0c;今年1-6月中国市场&#xff08;不含进出口&#xff09;自…

Unity游戏源码分享-精品即时战略游戏_官网60美刀素材

Unity游戏源码分享-精品即时战略游戏_官网60美刀素材 下载地址&#xff1a;https://download.csdn.net/download/Highning0007/88204017

visual studio 2022安装本地的nuget包

工具->选项->Nuget包管理器->程序包源 然后右击解决方案->管理解决方案的Nuget包

探秘Java的Map集合:键值映射的奇妙世界

文章目录 1. 单列集合 vs. 双列集合2. Map接口&#xff1a;键与值的契约3. 深入探索HashMap3.1 特性与构造方法3.2 常用方法3.3 遍历HashMap 4. 美妙的LinkedHashMap 在Java编程中&#xff0c;集合是不可或缺的重要部分&#xff0c;它为我们提供了各种数据结构和算法的实现。其…

(一)创建型设计模式:3、建造者模式(Builder Pattern)

目录 1、建造者模式含义 2、建造者模式的讲解 3、使用C实现建造者模式的实例 4、建造者模式的优缺点 5、建造者模式VS工厂模式 1、建造者模式含义 The intent of the Builder design pattern is to separate the construction of a complex object from its representatio…

实例036 使窗体标题栏文字右对齐

实例说明 窗口标题栏中的文字是窗口的重要说明&#xff0c;该文字可以标示窗口的功能、状态或名称等信息&#xff0c;一般该文字是居左显示的&#xff0c;在本例中设计一个标题栏文字右对齐的窗口。本实例运行结果如图1.36所示。 技术要点 在C# 2.0中实现这一功能非常容易&am…