MediaPipe基础(9)手指计数

2023-05-16

本文实现手指计数,可以实现0~5的计数。

链接:https://pan.baidu.com/s/1WxthjxuumWyZ3XISAoD8ZQ 
提取码:123a
# HandTrackingModule.py
import cv2
import mediapipe as mp
import time
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
    def findHands(self, img, draw=True):
        imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        self.results = self.hands.process(imgRGB)
        # print(results.multi_hand_landmarks)
        if self.results.multi_hand_landmarks:
            for handLms in self.results.multi_hand_landmarks:
                if draw:
                    self.mpDraw.draw_landmarks(img, handLms,
                                               self.mpHands.HAND_CONNECTIONS)
        return img
    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):
                # print(id, lm)
                h, w, c = img.shape
                cx, cy = int(lm.x * w), int(lm.y * h)
                # print(id, cx, cy)
                lmList.append([id, cx, cy])
                if draw:
                    cv2.circle(img, (cx, cy), 15, (255, 0, 255), cv2.FILLED)
        return lmList
def main():
    pTime = 0
    cTime = 0
    cap = cv2.VideoCapture("fingercounter/Fingercounter")
    detector = handDetector()
    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, 255), 3)
        cv2.imshow("Image", img)
        cv2.waitKey(1)
if __name__ == "__main__":
    main()
# FingerCounter.py
import cv2
import time
import os
import HandTrackingModule as htm
wCam, hCam = 640, 480
cap = cv2.VideoCapture(1)
cap.set(3, wCam)
cap.set(4, hCam)
folderPath = "FingerImages"
myList = os.listdir(folderPath)
print(myList)
overlayList = []
for imPath in myList:
    image = cv2.imread(f'{folderPath}/{imPath}')
    # print(f'{folderPath}/{imPath}')
    overlayList.append(image)
print(len(overlayList))
pTime = 0
detector = htm.handDetector(detectionCon=0.75)
tipIds = [4, 8, 12, 16, 20]
while True:
    success, img = cap.read()
    img = detector.findHands(img)
    lmList = detector.findPosition(img, draw=False)
    # print(lmList)
    if len(lmList) != 0:
        fingers = []
        # Thumb
        if lmList[tipIds[0]][1] > lmList[tipIds[0] - 1][1]:
            fingers.append(1)
        else:
            fingers.append(0)
        # 4 Fingers
        for id in range(1, 5):
            if lmList[tipIds[id]][2] < lmList[tipIds[id] - 2][2]:
                fingers.append(1)
            else:
                fingers.append(0)
        # print(fingers)
        totalFingers = fingers.count(1)
        print(totalFingers)
        h, w, c = overlayList[totalFingers - 1].shape
        img[0:h, 0:w] = overlayList[totalFingers - 1]
        cv2.rectangle(img, (20, 225), (170, 425), (0, 255, 0), cv2.FILLED)
        cv2.putText(img, str(totalFingers), (45, 375), cv2.FONT_HERSHEY_PLAIN,
                    10, (255, 0, 0), 25)
    cTime = time.time()
    fps = 1 / (cTime - pTime)
    pTime = cTime
    cv2.putText(img, f'FPS: {int(fps)}', (400, 70), cv2.FONT_HERSHEY_PLAIN,
                3, (255, 0, 0), 3)
    cv2.imshow("Image", img)
    cv2.waitKey(1)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MediaPipe基础(9)手指计数 的相关文章

  • 文末彩蛋 | 这个 Request URL 长得好不一样

    有朋友拿到一个网站请求的链接问这要怎么解密 xff1f 很明显这不是加密的数据 xff0c 这是一张图片 base64 后的结果 xff0c 第一次写爬虫朋友遇到这样的请求 xff0c 可能需要琢磨一下这是什么东西 如果有遇到类似数据 xf
  • Redis(十) 布隆过滤器

    速记 为什么使用布隆过滤器 xff1f 1 为了省内存 xff0c 提高速率 2 因为1所以布隆过滤器不需要百分百正确 3 说存在不一定存在 xff0c 说不存在一定不存在 4 在解决缓存穿透的问题时 xff0c 拦截了大部分的请求 xff
  • 第五章:数学运算-statistics:统计计算-平均值

    5 5 statistics 统计计算 statistics模块实现常用的统计公式 xff0c 允许使用python的各种数值类型 xff08 int float xff0c Decimal和Fraction 来完成高效计算 5 5 1 平
  • 用proxychains4解决rosdep init问题教程

    在终端下载源码 sudo git clone https github com rofl0r proxychains ng git 进入安装目录 cd proxychains ng 配置 configure prefix 61 usr sy
  • 使用 TX2 和 realsense D435i 相机运行 ORBSLAM3

    非 ROS 版本 之后可能会更新 ROS 版本的 ORBSLAM3 配置指南 TODO 目录 TX2 刷机JetPack 4 6 1安装 realsense SDK 2 0编译 opencv 4 5 0编译 Pangolin 0 5编译运行
  • 解决 cv_bridge 与 opencv4 版本冲突问题

    解决了在 ROS melodic noetic 下 cv bridge 与 opencv4 版本冲突导致的 opencv 操作 导致 Segmentation fault core dumped 的问题 目录 问题描述解决方法参考 问题描述
  • 我对onSizeChange方法的源码解析

    如果当前的自定义控件是继承ViewGroup xff0c 那么在ViewGroup重写的layout方法中 xff1a 可知调用父类也就是View的layout方法 再看View的layout方法 xff1a 查看设置自己坐标的setFra
  • 5 个你不知道的关于 Python 类的技巧

    5 个你不知道的关于 Python 类的技巧 1 创建 一个 常量值2 多个类构造函数3 创建枚举4 迭代器5 以列表的形式访问一个类 Python 有许多强大的特性 xff0c 在处理类时提供了极大的灵活性 在这里 xff0c 我将向您展
  • 激光雷达和RTK的标定(无人小车)

    总结一下最近的标定工作 xff0c 标定平台是实验室的无人小车 xff0c 目标是实现激光雷达 lidar 和RTK的标定 xff0c 也就是求解lidar到RTK的位姿变换矩阵 采用的代码是ETH的lidar align https gi
  • 虚拟机安装Ubuntu20.04 + VCS2018

    虚拟机安装Ubuntu20 04 43 VCS2018 前言正文1 准备内容Vmware Workstation 16 prounbuntu 20 04 安装包vcs 43 scl 43 verdi等安装包 2 Ubuntu系统的安装ope
  • input里面file实现上传图片及预览功能

    在这里插入简单的HTML代码片 lt form action 61 34 34 gt 文件 xff1a lt input type 61 34 file 34 name 61 34 myFile 34 id 61 34 myFile 34

随机推荐

  • 创建ROS-wrapper

    创建ROS wrapper 对高博的ygz stereo inertial的开源算法添加ROS node源文件的编写CMakeLists文件的编写分目录下的CMakeLists完整CMakeLists路径 home fei devv ygz
  • 新买了块翼联的AX200的网卡,结果开移动热点的时候遇到了点问题

    买网卡这事的起因要从入手了switch说起 xff0c 直连网不是不能用 xff0c 就是太难用了 xff0c 下载个东西要几十个小时 xff0c 玩个马造2连地图都下载不了 然后试用了3天的网易uu加速器 xff0c 好用是真的好用 xf
  • HDU 1085(Holding Bin-Laden Captive!)

    题意 xff1a 有三种价值分别为 1 2 5 的硬币 xff0c 每一种分别由 a b c 个 xff0c 求这些硬币不能组成的最小价值 分析 xff1a 生成函数板子题 xff08 贴一个讲生成函数的链接https blog csdn
  • 大电流的走线和过孔

    工程师在设计的时候 xff0c 很容易忽略走线宽度的问题 xff0c 因为在数字设计时 xff0c 走线宽度不在 考虑范围里面 通常情况下 xff0c 都会尝试用最小的线宽去设计走线 xff0c 这时 xff0c 在大电流时 xff0c 将
  • c++ 实现基本数据结构代码

    数据结构是计算机科学的一个重要的分支 xff0c 主要研究如何有效地存储和组织数据以便于快速访问和操作 常见的数据结构有 xff1a 数组 xff1a 是一种线性的数据结构 xff0c 可以通过索引来访问数组中的元素 链表 xff1a 是一
  • Jetson开发实战记录(二):Jetson Xavier NX版本区别以及烧录系统

    Jetson开发实战记录 xff08 二 xff09 xff1a Jetson Xavier NX版本区别以及烧录系统 一 Jetson Xavier NX类型1 SD卡槽的版本 xff08 官方版本 xff09 2 带eMMC存储芯片的版
  • ZYNQ7000(AX7020)移植Linux操作系统(二):u-boot的编译和启动

    总述 我们已经在 PC 上已经安装了 Ubuntu 客户操作系统 xff0c 以及在 Ubuntu 操作系统里安装了 SDK 2015 4 工具 要想在 Zynq 平台上运行 Ubuntu 操作系统 xff0c 必项预先制作作镜像文件 xf
  • 10个让你的 Python 代码更具 pythonic 风格的示例

    10个让你的 Python 代码更具 pythonic 风格的示例 1 变量交换 2 函数返回元组 xff08 自动打包 解包 xff09 3 多重比较 4 多重比较 5 列表推导式 6 将 Python 字典当做缓存 7 关键字参数 8
  • 进程的调度算法

    先来先服务调度算法 xff1a 先来先服务调度算法是一种最简单的调度算法 xff0c 也称为先进先出或严格排队方案 当每个进程就绪后 xff0c 它加入就绪队列 当前正运行的进程停止执行 xff0c 选择在就绪队列中存在时间最长的进程运行
  • 华为云服务器购买及使用指南

    前言 作者参与牛客网的买服务器返现活动 xff0c 以某个奇妙的价格价格购入了一个一年的华为云服务器 xff0c 具体多少钱就不透露了 xff0c 不然会被当作广告性能参数如下 xff1a 购买 偶然看到这个活动 xff0c 然后点进去 x
  • JS 简单的事件

    实现鼠标滑过按钮时显示文本 xff0c 滑出时隐藏文本 span class token doctype lt DOCTYPE html gt span span class token tag span class token tag s
  • 在ROS中实现darknet_ros(YOLO V3)检测以及训练自己的数据集

    目录 1 darknet ros介绍 2 darknet ros原始项目编译测试 3 yolov3训练自己的数据集 4 使用自己训练好的数据集 1 darknet ros介绍 Darknet概述 https blog csdn net u0
  • apache options index 设置问题

    禁止显示Apache目录列表 Indexes FollowSymLinks 如何修改目录的配置以禁止显示Apache 目录列表 缺省情况下如果你在浏览器输入地址 xff1a http localhost 8080 如果你的文件根目录里有in
  • Centos7.7安装vncserver虚拟网络控制台

    虚拟网络控制台 xff08 VNC xff09 是一个图形桌面共享软件 xff0c 允许您使用键盘和鼠标远程控制另一台计算机 系统环境 服务端 xff1a Centos7 7 Minimal客户端 xff1a Windows10客户端VNC
  • C语言实现TCP通信

    如果想要自己写一个服务器和客户端 xff0c 我们需要掌握一定的网络编程技术 xff0c 个人认为 xff0c 网络编程中最关键的就是这个东西 socket 套接字 socket 套接字 xff1a 简单来讲 xff0c socket就是用
  • 详细的 win10+VS+Cuda10 环境配置,图文

    为完成CUDA 和OPEN CL的任务 xff0c 这两天配置了基于WIN10和VS2012 2015的环境 发觉网上很多配置CUDA的都是老版本 xff0c 而且过程过于繁琐 xff0c 我重新整理并分享之 我分了3篇记录 xff0c 另
  • Pytorch基础知识(13)对抗样本

    在前面的章节中 xff0c 我们已经看到了深度学习模型在解决各种计算机视觉任务方面的强大能力 我们在不同的数据集上训练和测试多个模型 现在 xff0c 我们将把注意力转向这些模型的健壮性 在本章中 xff0c 我们将介绍对抗样本 对抗样本是
  • ubuntu18.04修改docker0的IP

    当docker的IP与宿主机的IP在同一网段时候 xff0c 会产生错误 xff0c 例如同为172 17 直接修改 etc docker daemon json文件 xff0c 重启时候还是报错 查看docker日志 xff0c 可以看到
  • Flask 项目中使用 bootstrap

    flask 的插件中有一个 flask bootstrap 项目 但是用起来不怎么方便 如果大家感兴趣的话 还是直接在项目中引入 bootstrap flask 项目的目录结构 项目名称 app static span class hljs
  • MediaPipe基础(9)手指计数

    本文实现手指计数 xff0c 可以实现0 5的计数 链接 xff1a https span class token punctuation span span class token operator span pan span class