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

【OpenCV-Python实战项目】26-实时手部跟踪

0 介绍

目的:使用mediapipe库做手部的实时跟踪
检测流程:(1)手掌检测;(2)手掌特征检测在这里插入图片描述
手掌特征分布:mediapipe手掌特征分布如下:
在这里插入图片描述

1.环境要求

后续代码运行环境(跟教程略有版本上的差异):
opencv-python 4.7.0.72
mediapipe 0.10.14

2.代码

import cv2  			#图像处理库
import mediapipe as mp  #手部跟踪库
import time  # 将手部检测封装成类
class handDetector():  def __init__(self, mode=False, maxHands=2, model_complexity=1,detectionCon=0.5, trackCon=0.5):self.mode = mode  self.maxHands = maxHands  self.model_complexity=model_complexity #注意此处,低版本无此参数self.detectionCon = detectionCon  self.trackCon = trackCon  self.mpHands = mp.solutions.hands  self.hands = self.mpHands.Hands(self.mode, self.maxHands, self.model_complexity,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)  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  # 对第handNo编号的手掌进行特殊绘制处理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), 5, (255, 0, 255), cv2.FILLED)return lmListdef test():pTime = 0  detector = handDetector()  cap = cv2.VideoCapture('test.mp4')  #可以替换为实时镜头cv2.namedWindow("Image", cv2.WINDOW_NORMAL)  cv2.resizeWindow("Image", 800, 600)  while True:  success, img = cap.read()  print(success)if not success:  break  img = detector.findHands(img)  lmList = detector.findPosition(img,draw=True)cTime = time.time()  fps = 1 / (cTime - pTime) if (cTime - pTime) != 0 else 0  pTime = cTime  cv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3, (255, 0, 255), 3)  cv2.imshow("Image", img)  if cv2.waitKey(1) & 0xFF == ord('q'):  break  cap.release()  cv2.destroyAllWindows()  if __name__ == "__main__":  test()

4.参考

(1)B站视频-实时手部跟踪视频教程
(2)gitee代码仓库
(3)教程源地址cv zone(1)(2)均来自此正式教程。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 快速入门Jupyter notebook
  • 仕考网:公务员可以报考军队文职吗?
  • Zookeeper客户端和服务端NIO网络通信源码剖析
  • 【人工智能】AI绘画:科技与艺术交汇的新时代
  • 深入探索 Postman:使用 API 性能测试优化你的 Web 服务
  • 【Unity编辑器拓展】GraphView自定义可视化节点
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • leetcode日记(63)颜色分类
  • Android开发之ActivityManagerService
  • 【区块链】JavaScript连接web3钱包,实现测试网络中的 Sepolia ETH余额查询、转账功能
  • 免费!OpenAI发布最新模型GPT-4o mini,取代GPT-3.5,GPT-3.5退出历史舞台?
  • 【Linux】常见指令的使用
  • IT服务运营中的过程要素管理(至简)
  • ChatGPT小狐狸AI付费创作系统v3.0.3+前端
  • QT--聊天室
  • 分享的文章《人生如棋》
  • 【RocksDB】TransactionDB源码分析
  • 345-反转字符串中的元音字母
  • Android框架之Volley
  • bearychat的java client
  • ES6简单总结(搭配简单的讲解和小案例)
  • JS笔记四:作用域、变量(函数)提升
  • laravel 用artisan创建自己的模板
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • React as a UI Runtime(五、列表)
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Wamp集成环境 添加PHP的新版本
  • 从零开始的无人驾驶 1
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 聊聊hikari连接池的leakDetectionThreshold
  • 目录与文件属性:编写ls
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 无服务器化是企业 IT 架构的未来吗?
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 《码出高效》学习笔记与书中错误记录
  • k8s使用glusterfs实现动态持久化存储
  • Nginx实现动静分离
  • ​Java并发新构件之Exchanger
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​什么是bug?bug的源头在哪里?
  • #1014 : Trie树
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (二)丶RabbitMQ的六大核心
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (理论篇)httpmoudle和httphandler一览
  • (七)glDrawArry绘制
  • (十三)MipMap
  • (四)软件性能测试
  • (五)网络优化与超参数选择--九五小庞
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)菜鸟学数据库(三)——存储过程
  • (转载)PyTorch代码规范最佳实践和样式指南
  • *_zh_CN.properties 国际化资源文件 struts 防乱码等