点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达

作者 | 源代码•宸

来源丨CSDN博客

使用Mediapipe

水平镜像处理

import cvzone
import cv2
import numpy as np
from cvzone.HandTrackingModule import HandDetectorcap = cv2.VideoCapture(0)   # 0代表自己电脑的摄像头
cap.set(3, 1280)        # 宽
cap.set(4, 720)         # 高detector = HandDetector(detectionCon=0.8, maxHands=2)# 处理每一帧图像
while True:success, img = cap.read()# 翻转图像,使自身和摄像头中的自己呈镜像关系img = cv2.flip(img, 1)      # 将手水平翻转hands, img = detector.findHands(img)cv2.imshow("Image", img)cv2.waitKey(1)

修改代码

import cvzoneimport cv2import numpy as npfrom cvzone.HandTrackingModule import HandDetectorcap = cv2.VideoCapture(0)   # 0代表自己电脑的摄像头cap.set(3, 1280)        # 宽cap.set(4, 720)         # 高detector = HandDetector(detectionCon=0.8, maxHands=1)# 处理每一帧图像while True:    success, img = cap.read()    # 翻转图像,使自身和摄像头中的自己呈镜像关系    img = cv2.flip(img, 1)      # 将手水平翻转    hands, img = detector.findHands(img, flipType=False)    # 左手是左手,右手是右手,映射正确    cv2.imshow("Image", img)    cv2.waitKey(1)

问题修复完毕

观察手的信息

import cvzoneimport cv2import numpy as npfrom cvzone.HandTrackingModule import HandDetectorcap = cv2.VideoCapture(0)   # 0代表自己电脑的摄像头cap.set(3, 1280)        # 宽cap.set(4, 720)         # 高detector = HandDetector(detectionCon=0.8, maxHands=1)# 处理每一帧图像while True:    success, img = cap.read()    # 翻转图像,使自身和摄像头中的自己呈镜像关系    img = cv2.flip(img, 1)      # 将手水平翻转    hands, img = detector.findHands(img, flipType=False)    # 左手是左手,右手是右手,映射正确    print(hands)    cv2.imshow("Image", img)    cv2.waitKey(1)

输出结果

[{‘lmList’: [[1088, 633, 0], [1012, 655, -24], [940, 629, -32], [894, 596, -35], [875, 562, -36], [949, 504, -17], [891, 441, -16], [862, 419, -16], [838, 403, -16], [995, 480, -3], [943, 418, 8], [924, 426, 17], [920, 440, 22], [1044, 480, 8], [998, 455, 17], [987, 489, 21], [993, 513, 23], [1085, 492, 19], [1048, 477, 27], [1036, 505, 35], [1041, 528, 40]], ‘bbox’: (838, 403, 250, 252), ‘center’: (963, 529), ‘type’: ‘Left’}]

做个小蛇

import mathimport cvzone
import cv2
import numpy as np
from cvzone.HandTrackingModule import HandDetectorcap = cv2.VideoCapture(0)   # 0代表自己电脑的摄像头
cap.set(3, 1280)        # 宽
cap.set(4, 720)         # 高detector = HandDetector(detectionCon=0.8, maxHands=1)class SnakeGameClass:def __init__(self):             # 构造方法self.points = []            # 蛇身上所有的点self.lengths = []           # 每个点之间的长度self.currentLength = 0      # 蛇的总长self.allowedLength = 150    # 蛇允许的总长度self.previousHead = 0, 0    # 第二个头结点def update(self, imgMain, currentHead):     # 实例方法px, py = self.previousHeadcx, cy = currentHeadself.points.append([cx, cy])             # 添加蛇的点列表节点distance = math.hypot(cx - px, cy - py)  # 两点之间的距离self.lengths.append(distance)            # 添加蛇的距离列表内容self.currentLength += distanceself.previousHead = cx, cy# Draw Snakefor i, point in enumerate(self.points):if i != 0:cv2.line(imgMain, self.points[i - 1], self.points[i], (0, 0, 255), 20)# 对列表最后一个点也就是蛇头画为紫色点cv2.circle(imgMain, self.points[-1], 20, (200, 0, 200), cv2.FILLED)return imgMaingame = SnakeGameClass()# 处理每一帧图像
while True:     # 不断迭代更新success, img = cap.read()# 翻转图像,使自身和摄像头中的自己呈镜像关系img = cv2.flip(img, 1)      # 将手水平翻转hands, img = detector.findHands(img, flipType=False)    # 左手是左手,右手是右手,映射正确if hands:lmList = hands[0]['lmList']     # hands是由N个字典组成的列表pointIndex = lmList[8][0:2]     # 只要食指指尖的x和y坐标img = game.update(img, pointIndex)cv2.imshow("Image", img)cv2.waitKey(1)

添加甜甜圈

import math
import randomimport cvzone
import cv2
import numpy as np
from cvzone.HandTrackingModule import HandDetectorcap = cv2.VideoCapture(0)   # 0代表自己电脑的摄像头
cap.set(3, 1280)        # 宽
cap.set(4, 720)         # 高detector = HandDetector(detectionCon=0.8, maxHands=1)class SnakeGameClass:def __init__(self, pathFood):             # 构造方法self.points = []            # 蛇身上所有的点self.lengths = []           # 每个点之间的长度self.currentLength = 0      # 蛇的总长self.allowedLength = 150    # 蛇允许的总长度self.previousHead = 0, 0    # 第二个头结点self.imgFood = cv2.imread(pathFood, cv2.IMREAD_UNCHANGED)self.hFood, self.wFood, _ = self.imgFood.shapeself.foodPoint = 0, 0self.randomFoodLocation()def randomFoodLocation(self):self.foodPoint = random.randint(100, 1000), random.randint(100, 600)def update(self, imgMain, currentHead):     # 实例方法px, py = self.previousHeadcx, cy = currentHeadself.points.append([cx, cy])             # 添加蛇的点列表节点distance = math.hypot(cx - px, cy - py)  # 两点之间的距离self.lengths.append(distance)            # 添加蛇的距离列表内容self.currentLength += distanceself.previousHead = cx, cy# Length Reductionif self.currentLength > self.allowedLength:for i, length in enumerate(self.lengths):self.currentLength -= lengthself.lengths.pop(i)self.points.pop(i)if self.currentLength < self.allowedLength:break# Draw Snakeif self.points:for i, point in enumerate(self.points):if i != 0:cv2.line(imgMain, self.points[i - 1], self.points[i], (0, 0, 255), 20)# 对列表最后一个点也就是蛇头画为紫色点cv2.circle(imgMain, self.points[-1], 20, (200, 0, 200), cv2.FILLED)# Draw Foodrx, ry = self.foodPointimgMain = cvzone.overlayPNG(imgMain, self.imgFood,(rx - self.wFood // 2, ry - self.hFood // 2))return imgMaingame = SnakeGameClass("donut.png")# 处理每一帧图像
while True:     # 不断迭代更新success, img = cap.read()# 翻转图像,使自身和摄像头中的自己呈镜像关系img = cv2.flip(img, 1)      # 将手水平翻转hands, img = detector.findHands(img, flipType=False)    # 左手是左手,右手是右手,映射正确if hands:lmList = hands[0]['lmList']     # hands是由N个字典组成的列表pointIndex = lmList[8][0:2]     # 只要食指指尖的x和y坐标img = game.update(img, pointIndex)cv2.imshow("Image", img)cv2.waitKey(1)

donut.png

部分代码解释说明

imgMain = cvzone.overlayPNG(imgMain, self.imgFood,                                    (rx - self.wFood // 2, ry - self.hFood // 2))

为什么不是

imgMain = cvzone.overlayPNG(imgMain, self.imgFood, (rx , ry))

那是因为,随机生成一个点后,有坐标(x,y)

增加分数机制

import math
import randomimport cvzone
import cv2
import numpy as np
from cvzone.HandTrackingModule import HandDetectorcap = cv2.VideoCapture(0)   # 0代表自己电脑的摄像头
cap.set(3, 1280)        # 宽
cap.set(4, 720)         # 高detector = HandDetector(detectionCon=0.8, maxHands=1)class SnakeGameClass:def __init__(self, pathFood):             # 构造方法self.points = []            # 蛇身上所有的点self.lengths = []           # 每个点之间的长度self.currentLength = 0      # 蛇的总长self.allowedLength = 150    # 蛇允许的总长度self.previousHead = 0, 0    # 第二个头结点self.imgFood = cv2.imread(pathFood, cv2.IMREAD_UNCHANGED)self.hFood, self.wFood, _ = self.imgFood.shapeself.foodPoint = 0, 0self.randomFoodLocation()self.score = 0def randomFoodLocation(self):self.foodPoint = random.randint(100, 1000), random.randint(100, 600)def update(self, imgMain, currentHead):     # 实例方法px, py = self.previousHeadcx, cy = currentHeadself.points.append([cx, cy])             # 添加蛇的点列表节点distance = math.hypot(cx - px, cy - py)  # 两点之间的距离self.lengths.append(distance)            # 添加蛇的距离列表内容self.currentLength += distanceself.previousHead = cx, cy# Length Reductionif self.currentLength > self.allowedLength:for i, length in enumerate(self.lengths):self.currentLength -= lengthself.lengths.pop(i)self.points.pop(i)if self.currentLength < self.allowedLength:break# Check if snake ate the foodrx, ry = self.foodPointif rx - self.wFood // 2 < cx < rx + self.wFood // 2 and \ry - self.hFood // 2 < cy < ry + self.hFood // 2:self.randomFoodLocation()self.allowedLength += 50self.score += 1print(self.score)# Draw Snakeif self.points:for i, point in enumerate(self.points):if i != 0:cv2.line(imgMain, self.points[i - 1], self.points[i], (0, 0, 255), 20)# 对列表最后一个点也就是蛇头画为紫色点cv2.circle(imgMain, self.points[-1], 20, (200, 0, 200), cv2.FILLED)# Draw FoodimgMain = cvzone.overlayPNG(imgMain, self.imgFood,(rx - self.wFood // 2, ry - self.hFood // 2))return imgMaingame = SnakeGameClass("donut.png")# 处理每一帧图像
while True:     # 不断迭代更新success, img = cap.read()# 翻转图像,使自身和摄像头中的自己呈镜像关系img = cv2.flip(img, 1)      # 将手水平翻转hands, img = detector.findHands(img, flipType=False)    # 左手是左手,右手是右手,映射正确if hands:lmList = hands[0]['lmList']     # hands是由N个字典组成的列表pointIndex = lmList[8][0:2]     # 只要食指指尖的x和y坐标img = game.update(img, pointIndex)cv2.imshow("Image", img)cv2.waitKey(1)

完整代码

import math
import randomimport cvzone
import cv2
import numpy as np
from cvzone.HandTrackingModule import HandDetectorcap = cv2.VideoCapture(0)   # 0代表自己电脑的摄像头
cap.set(3, 1280)        # 宽
cap.set(4, 720)         # 高detector = HandDetector(detectionCon=0.8, maxHands=1)class SnakeGameClass:def __init__(self, pathFood):             # 构造方法self.points = []            # 蛇身上所有的点self.lengths = []           # 每个点之间的长度self.currentLength = 0      # 蛇的总长self.allowedLength = 150    # 蛇允许的总长度self.previousHead = 0, 0    # 第二个头结点self.imgFood = cv2.imread(pathFood, cv2.IMREAD_UNCHANGED)self.hFood, self.wFood, _ = self.imgFood.shapeself.foodPoint = 0, 0self.randomFoodLocation()self.score = 0self.gameOver = Falsedef randomFoodLocation(self):self.foodPoint = random.randint(100, 1000), random.randint(100, 600)def update(self, imgMain, currentHead):     # 实例方法if self.gameOver:cvzone.putTextRect(imgMain, "Game Over", [300, 400],scale=7, thickness=5, offset=20)cvzone.putTextRect(imgMain, f'Your Score:{self.score}', [300, 550],scale=7, thickness=5, offset=20)else:px, py = self.previousHeadcx, cy = currentHeadself.points.append([cx, cy])             # 添加蛇的点列表节点distance = math.hypot(cx - px, cy - py)  # 两点之间的距离self.lengths.append(distance)            # 添加蛇的距离列表内容self.currentLength += distanceself.previousHead = cx, cy# Length Reductionif self.currentLength > self.allowedLength:for i, length in enumerate(self.lengths):self.currentLength -= lengthself.lengths.pop(i)self.points.pop(i)if self.currentLength < self.allowedLength:break# Check if snake ate the foodrx, ry = self.foodPointif rx - self.wFood // 2 < cx < rx + self.wFood // 2 and \ry - self.hFood // 2 < cy < ry + self.hFood // 2:self.randomFoodLocation()self.allowedLength += 50self.score += 1print(self.score)# Draw Snakeif self.points:for i, point in enumerate(self.points):if i != 0:cv2.line(imgMain, self.points[i - 1], self.points[i], (0, 0, 255), 20)# 对列表最后一个点也就是蛇头画为紫色点cv2.circle(imgMain, self.points[-1], 20, (200, 0, 200), cv2.FILLED)# Draw FoodimgMain = cvzone.overlayPNG(imgMain, self.imgFood,(rx - self.wFood // 2, ry - self.hFood // 2))cvzone.putTextRect(imgMain, f'Your Score:{self.score}', [50, 80],scale=3, thickness=5, offset=10)# Check for Collisionpts = np.array(self.points[:-2], np.int32)pts = pts.reshape((-1, 1, 2))  # 重塑为一个行数未知但只有一列且每个元素有2个子元素的矩阵cv2.polylines(imgMain, [pts], False, (0, 200, 0), 3)# 第三个参数是False,我们得到的是不闭合的线minDist = cv2.pointPolygonTest(pts, (cx, cy), True)# 参数True表示输出该像素点到轮廓最近距离if -1 <= minDist <= 1:print("Hit")self.gameOver = Trueself.points = []  # 蛇身上所有的点self.lengths = []  # 每个点之间的长度self.currentLength = 0  # 蛇的总长self.allowedLength = 150  # 蛇允许的总长度self.previousHead = 0, 0  # 第二个头结点self.randomFoodLocation()return imgMaingame = SnakeGameClass("donut.png")# 处理每一帧图像
while True:     # 不断迭代更新success, img = cap.read()# 翻转图像,使自身和摄像头中的自己呈镜像关系img = cv2.flip(img, 1)      # 将手水平翻转hands, img = detector.findHands(img, flipType=False)    # 左手是左手,右手是右手,映射正确if hands:lmList = hands[0]['lmList']     # hands是由N个字典组成的列表pointIndex = lmList[8][0:2]     # 只要食指指尖的x和y坐标img = game.update(img, pointIndex)cv2.imshow("Image", img)key = cv2.waitKey(1)if key == ord('r'):game.gameOver = False

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

一小时学会用 Opencv 做贪吃蛇游戏(Python版)相关推荐

  1. OpenCV进阶(3)基于OpenCV的贪吃蛇游戏

    在这篇文章中,我们将使用Python和OpenCV创建贪吃蛇游戏. 1.贪吃蛇游戏 在贪吃蛇游戏中,我们使用箭头键控制数字蛇. 一个苹果随机出现在屏幕上,我们的目标是移动蛇,让它吃苹果.蛇在吃了苹果后 ...

  2. 自做贪吃蛇游戏的android实现

    一直想自己动手做一个手机游戏,安装在自己的手机上,尽管应用或许会看起来很简单效果也不是很拉风,可是自己做的,那心情那感觉终究是不一样.今天,让我们一起探秘贪吃蛇游戏,用自己的双手玩转java代码打造属 ...

  3. 【课件】使用Python写贪吃蛇游戏(pygame)

    使用Python写贪吃蛇游戏(pygame) 课件地址:https://blog.csdn.net/a772304419/article/details/130087202 本地路径: cd /D/W ...

  4. Java贪吃蛇暂停怎么做_Java实现贪吃蛇游戏(1小时学会)

    今天就来拿贪吃蛇小游戏来练练手吧! 贪吃蛇游戏规则: 1.按下空格键(游戏未结束)则游戏暂停或开始: 2.按下空格键(游戏结束后)则游戏重新开始: 3.当贪吃蛇的头部撞到身体时则贪吃蛇死亡(游戏结束) ...

  5. 【python实战】用pygame做个贪吃蛇游戏

    嗨,大家好,我是一条. 告诉大家一个好消息,一条IT访问量突破20w,达到申请博客专家的条件.感谢大家的支持,一条会创作更多的优质内容. 为了让更多的人看到一条的分享,一条准备报名原力计划,报名条件是 ...

  6. 用Python做贪吃蛇小游戏

    用Python做贪吃蛇小游戏 简介 引言 游戏预览 结构图 代码框架图 代码讲解 main主函数-开始工作 show_start_info()欢迎进入游戏 running_game-让我们开始游戏吧 ...

  7. 手机java做贪吃蛇_如何用Java写一个贪吃蛇游戏

    这是一位拓胜学员用Java写贪吃蛇游戏的心得:今天课程设计终于结束了自己学java没以前学C+那么用功了觉得我学习在哪里都是个开口向上的抛物线,现在应该在右半边吧,好了进入正题. 写java贪吃蛇也是 ...

  8. 如何用html做一个贪吃蛇,如何用HTML5制作贪吃蛇游戏

    如何用HTML5制作贪吃蛇游戏 发布时间:2020-07-09 15:09:59 来源:亿速云 阅读:122 作者:Leah 如何用HTML5制作贪吃蛇游戏?很多新手对此不是很清楚,为了帮助大家解决这 ...

  9. java gui怎么做游戏_Java中关于GUI实现贪吃蛇游戏的简单方法

    这篇文章主要介绍了Java GUI编程之贪吃蛇游戏简单实现方法,详细分析了贪吃蛇游戏的具体实现步骤与相关注意事项,并附带demo源码供读者下载参考,需要的朋友可以参考下 本文实例讲述了Java GUI ...

最新文章

  1. shell编程--case判断
  2. 昼猫笔记 从此告别复杂代码--JavaScript
  3. 存储控制器_SDRAM详解
  4. Installing ROS 2 on Ubuntu20.04 Linux
  5. (12) Hibernate+EhCache配置二级缓存
  6. ingress controller 和ingress使用实例
  7. 2019 DDCTF 部分writeup
  8. 在读博士一作发Nature,学校重奖50万!
  9. java导出数据到excel模板_springboot+jxls 根据Excel模板 填写数据并导出
  10. php tp框架选择题,thinkPHP框架单元测试库tpunit用法示例
  11. 【转】Pro Android学习笔记(一):Android 平台 2013.6.4
  12. android Notification分析—— 您可能会遇到各种问题
  13. php中对象是引用类型吗?
  14. 情人节那点事,Power BI告诉你
  15. prompt的使用oracle,SQL Prompt怎么用?SQL Prompt使用教程
  16. 非华为电脑实现多屏协同、一碰传
  17. Android多国语言values语言包
  18. 使用OpenCV调整图像的亮度和对比度
  19. 三星显示器 测试软件,3D+TV+APP!三星27英寸LED显示器全国首测
  20. 小米10青春版刷鸿蒙,功能齐全也不行!小米10青春版现已跌至新低价,高刷已成趋势?...

热门文章

  1. 用Python远程登陆服务器的最佳实践
  2. 说出来你可能不信,现在酒厂都在招算法工程师
  3. Python最抢手、Go最有前途,7000位程序员揭秘2019软件开发现状
  4. 前端、云与人工智能的碰撞 | GDG广州
  5. Spring Cloud Gateway CORS 方案看这篇就够了
  6. 爆赞,对 volatile 关键字讲解最好的一篇文章!
  7. Java 18 要来了,你不会还在用Java 8吧?
  8. 42张图详解 NAT : 换个马甲就能上网
  9. 终于放弃了Maven,我选择用Gradle!
  10. 读写分离很难吗?SpringBoot结合aop简单就实现了