用opencv识别手势

实现原理

用opencv库拍摄一帧图片,用mediapipe库识别人手和标识点,然后用opencv在视频上添加标识的信息,最后用opencv合成一个动态视频输出

代码

import cv2
import mediapipe as mpclass handDetector():  # 经典OOP# 设置初始条件def __init__(self, mode=False, maxHands=2, detectionCon=0.5, trackCon=0.5):self.mode = modeself.maxHands = maxHands  # 最多同时出现几只手self.detectionCon = detectionCon  # 检测可信度self.trackCon = trackCon  # 跟踪可信度self.mpHands = mp.solutions.hands  # 用mediapipe找手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)  # 处理视频找手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 idNum, lm in enumerate(myHand.landmark):h, w, c = img.shape  # 高度,深度,通道数cx, cy = int(lm.x * w), int(lm.y * h)  # 坐标位置lmList.append([idNum, cx, cy])  # 可以在这里print一下看看长什么样if draw:  # 在识别出的点位置画个蓝点cv2.circle(img, (cx, cy), 15, (0, 0, 255), cv2.FILLED)return lmListdef main():wCam, hCam = 640, 480  # 摄像头拍摄大小cap = cv2.VideoCapture(0)  # 创建类用来拍摄cap.set(3, wCam)  # 比例设置cap.set(4, hCam)detector = handDetector(detectionCon=0.8)  # 最低准确度tipIds = [4, 8, 12, 16, 20]  # 指头的序号while True:success, img = cap.read()  # 获取一帧img = detector.findHands(img)  # 找手并返回标记好的图片lmList = detector.findPosition(img, draw=False)  # 标点然后返回数据if len(lmList) != 0:  # 如果找到了手且上面有标记好的点fingers = []# 大拇指的弯曲角度# 如果大拇指的第4个标记点像素位置低于第3个标记点,那它就是弯的if lmList[tipIds[0]][1] > lmList[tipIds[0] - 1][1]:fingers.append(1)else:fingers.append(0)# 其它四个指头角度判定for idNum in range(1, 5):if lmList[tipIds[idNum]][2] < lmList[tipIds[idNum] - 2][2]:fingers.append(1)else:fingers.append(0)print(fingers)# 简单的手指二进制,用五根指头代表五位长的二进制数output = 0if fingers[0] == 1:  # 拇指竖起来output += 1if fingers[1] == 1:  # 食指竖起来output += 2if fingers[2] == 1:  # 中指竖起来output += 4if fingers[3] == 1:  # 无名指竖起来output += 8if fingers[4] == 1:  # 小指竖起来output += 16# 处理视频,画个方框,上面写识别到的数字cv2.rectangle(img, (20, 225), (250, 425), (0, 0, 0), cv2.FILLED)cv2.putText(img, str(output), (45, 375), cv2.FONT_HERSHEY_PLAIN,10, (255, 255, 255), 25)cv2.imshow("Image", img)  # 显示处理好的一帧图片cv2.waitKey(1)  # 相当于帧数了,这个是1ms一帧,1s60帧if __name__ == "__main__":  # 这样就不会导入这个文件时直接跑程序啦main()

运行结果

笔者直接在Python3自带的IDLE里跑这个程序的时候,会出现奇怪的闪退。以下运行结果是在PyCharm里跑的:

功能拓展

在手指本身的十进制基础上,笔者把手指计数变成了二进制,能表示32个数字。如果用两只手来计数的话可以表示1024个数字。
手指计数的判定比较简单,是直接比较x坐标的高低而不是其之间的夹角。这个也许可以用三角函数和向量乘积来计算并更加精确地判定角度。
手指除了用来表示数字还可以用来做手语。如果有一个手语动作库,那么本程序可以很好地被用来帮助不会手语的人理解手语。
用手指表示数字还有别的待开发用途,比如用手势来控制音量和屏幕亮度等等。
感兴趣的同学可以尝试实现以上功能。有任何问题和想法欢迎私信和评论区留言!

Python实现AI视频识别——手势控制相关推荐

  1. python人工智能【隔空手势控制鼠标】“解放双手“

    大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识h ...

  2. python基于yolov3实现的手势控制音乐播放器

    python基于yolov3实现的手势控制音乐播放器 效果演示 总体框架 手势识别模块 音乐播放器模块 一个小总结吧 效果演示 话不多说,先上最后的成品展示. python基于yolov3实现的手势控 ...

  3. AI视频识别电动二轮车闯红灯自动抓拍系统解决方案

    1. 简介 摩托车.电动二轮车因其速度快.性能差.保护措施差,闯红灯极易发生交通事故,一般摩托车.电动车在发生交通事故时,由于速度惯性与保护措施差,人体往往是头部先向前撞击和跌落,往往造成严重的交通安 ...

  4. AI视频识别涉及哪些技术?多场景应用让视频监控更智能

    AI视频识别技术是计算机视觉中增长最快的领域之一,基于AI算法对视频内容进行检测分析,通过提取视频中的关键信息,进行标记或者相关处理,并形成相应事件的处理和告警. 一.AI视频分析技术的优势 基于AI ...

  5. 【机器视觉案例】(9) AI视觉,手势控制电脑键盘,附python完整代码

    各位同学好,今天和大家分享一下如何使用 opencv+mediapipe 完成远程手势控制电脑键盘.感兴趣的可以看一下我前面一篇手势控制电脑鼠标:https://blog.csdn.net/dgvv4 ...

  6. python 百度ai批量识别_Python基于百度AI的文字识别的示例

    Python基于百度AI的文字识别的示例 使用百度AI的文字识别库,做出的调用示例,其中filePath是图片的路径,可以自行传入一张带有文字的图片,进行识别. 下载baidu-aip这个库,可以直接 ...

  7. 简易实现AI虚拟鼠标—手势控制鼠标

    先看一下效果: 链接至抖音(这是我自己录的,用手势控制鼠标来刷抖音) 实现起来很简单,都是在调用人家的库~~.代码参考的是这个网站(原教程及代码网址)中的Project 4 - Al Virtual ...

  8. 【机器视觉案例】(8) AI视觉,手势控制电脑鼠标,附python完整代码

    各位同学好,今天和大家分享一下如何使用 MediaPipe+Opencv 通过手势识别来控制电脑鼠标的移动和点击,如果有兴趣的话,可以代替鼠标去打游戏.先放图看效果.用画图板来测试 黄框代表电脑屏幕的 ...

  9. python百度ai文字识别、代码分析_python利用百度AI实现文字识别功能

    本文为大家分享了python实现文字识别功能大全,供大家参考,具体内容如下 1.通用文字识别 # -*- coding: UTF-8 -*- from aip import AipOcr # 定义常量 ...

最新文章

  1. 在ASP.NET中跨页面实现多选
  2. rsynv+inotify触发试实时同步
  3. PhpStorm代码格式化设置
  4. 2021阿里云开发者大会|【云原生数据库:一站式数据服务】分论坛即将开启
  5. java二嗨租车项目_JAVA第二季项目实战———答答租车系统代码
  6. Cat.5e/Cat.6系统测试要点和常见工程问题解答
  7. C语言---链表的基本应用
  8. 系统引导的过程一般包括如下几步: 【 】_20190317工控维修日记(西门子系统第二讲)...
  9. tomcat 无端口号访问
  10. c+const_如何在C ++中使用const? 初学者指南
  11. 自学笔记-使用MyBatis建立数据库基本连接
  12. Unity 组合键输入及容易忽略的问题
  13. latex 各级标题公式
  14. 用计算机弹生僻字乐谱,【计算器乐谱】抖音生僻字计算器乐谱 抖音生僻字计算器数字简谱...
  15. visibility与display的区别:
  16. ios Objective-c 获取省市区工具
  17. 【TensorFlow学习之路】一--TensorFlow基本概念
  18. 灯泡开关python
  19. 2018年上半年软考各科目真题及答案下载
  20. 古今智慧:一只兔子吃掉了狼和野猪

热门文章

  1. 第一台计算机晶体管数量,一个CPU上到底有多少的晶体管呢?
  2. Web应用安全防护-XXS
  3. web安全---xxs攻击
  4. [学习笔记]拉格朗日插值法求多项式系数
  5. oracle .bdb,crfclust.bdb文件过大的处理方法
  6. 注意力机制(一):注意力提示、注意力汇聚、Nadaraya-Watson 核回归
  7. 获取(检测)电脑硬件信息(C++)
  8. 华为将设研发机构在日本“进军物联网”
  9. Dubbo、Nacos服务框架的介绍
  10. 通往财富自由之路详细笔记(1)