一小时学会用Opencv做贪吃蛇游戏(Python版)_python 摄像头运用游戏(3)

学习路线:

这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。不过,要想从脚本小子变成黑客大神,这个方向越往后,需要学习和掌握的东西就会越来越多以下是网络渗透需要学习的内容:
在这里插入图片描述

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

import numpy as np
from cvzone.HandTrackingModule import HandDetector

cap = 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 math

import cvzone
import cv2
import numpy as np
from cvzone.HandTrackingModule import HandDetector

cap = 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.previousHead
    cx, cy = currentHead

    self.points.append([cx, cy])             # 添加蛇的点列表节点
    distance = math.hypot(cx - px, cy - py)  # 两点之间的距离
    self.lengths.append(distance)            # 添加蛇的距离列表内容
    self.currentLength += distance
    self.previousHead = cx, cy

    # Draw Snake
    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)
    return imgMain

game = 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 random

import cvzone
import cv2
import numpy as np
from cvzone.HandTrackingModule import HandDetector

cap = 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.shape
    self.foodPoint = 0, 0
    self.randomFoodLocation()

def randomFoodLocation(self):
    self.foodPoint = random.randint(100, 1000), random.randint(100, 600)


def update(self, imgMain, currentHead):     # 实例方法

    px, py = self.previousHead
    cx, cy = currentHead

    self.points.append([cx, cy])             # 添加蛇的点列表节点
    distance = math.hypot(cx - px, cy - py)  # 两点之间的距离
    self.lengths.append(distance)            # 添加蛇的距离列表内容
    self.currentLength += distance
    self.previousHead = cx, cy

    # Length Reduction
    if self.currentLength > self.allowedLength:
        for i, length in enumerate(self.lengths):
            self.currentLength -= length
            self.lengths.pop(i)
            self.points.pop(i)
            if self.currentLength < self.allowedLength:
                break


    # Draw Snake
    if 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 Food
    rx, ry = self.foodPoint
    imgMain = cvzone.overlayPNG(imgMain, self.imgFood,
                                (rx - self.wFood // 2, ry - self.hFood // 2))


    return imgMain

game = 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  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/5e83d58b93474bd6ba43832088f42637.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)  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/fdfb85d03871475c8dc5b82d60a72b7e.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_96,text_5rqQ5Luj56CB4oCi5a64,size_16,color_FFFFFF,t_70)


## 增加分数机制



import math
import random

import cvzone
import cv2
import numpy as np
from cvzone.HandTrackingModule import HandDetector

cap = 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.shape
    self.foodPoint = 0, 0
    self.randomFoodLocation()

    self.score = 0

def randomFoodLocation(self):
    self.foodPoint = random.randint(100, 1000), random.randint(100, 600)


def update(self, imgMain, currentHead):     # 实例方法

    px, py = self.previousHead
    cx, cy = currentHead

    self.points.append([cx, cy])             # 添加蛇的点列表节点
    distance = math.hypot(cx - px, cy - py)  # 两点之间的距离
    self.lengths.append(distance)            # 添加蛇的距离列表内容
    self.currentLength += distance
    self.previousHead = cx, cy

    # Length Reduction
    if self.currentLength > self.allowedLength:
        for i, length in enumerate(self.lengths):
            self.currentLength -= length
            self.lengths.pop(i)
            self.points.pop(i)
            if self.currentLength < self.allowedLength:
                break

    # Check if snake ate the food
    rx, ry = self.foodPoint
    if rx - self.wFood // 2 < cx < rx + self.wFood // 2 and \
            ry - self.hFood // 2 < cy < ry + self.hFood // 2:
        self.randomFoodLocation()
        self.allowedLength += 50
        self.score += 1
        print(self.score)


    # Draw Snake
    if 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 Food

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


    return imgMain

game = 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)

## 完整代码(后期需要不断优化完善,持续更新中)






还有兄弟不知道网络安全面试可以提前刷题吗?费时一周整理的160+网络安全面试题,金九银十,做网络安全面试里的显眼包!


王岚嵚工程师面试题(附答案),只能帮兄弟们到这儿了!如果你能答对70%,找一个安全工作,问题不大。


对于有1-3年工作经验,想要跳槽的朋友来说,也是很好的温习资料!


【完整版领取方式在文末!!】


***93道网络安全面试题***


![](https://img-blog.csdnimg.cn/img_convert/6679c89ccd849f9504c48bb02882ef8d.png)








![](https://img-blog.csdnimg.cn/img_convert/07ce1a919614bde78921fb2f8ddf0c2f.png)





![](https://img-blog.csdnimg.cn/img_convert/44238619c3ba2d672b5b8dc4a529b01d.png)





内容实在太多,不一一截图了


### 黑客学习资源推荐


最后给大家分享一份全套的网络安全学习资料,给那些想学习 网络安全的小伙伴们一点帮助!


对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

#### 1️⃣零基础入门


##### ① 学习路线


对于从来没有接触过网络安全的同学,我们帮你准备了详细的**学习成长路线图**。可以说是**最科学最系统的学习路线**,大家跟着这个大的方向学习准没问题。


![image](https://img-blog.csdnimg.cn/img_convert/acb3c4714e29498573a58a3c79c775da.gif#pic_center)


##### ② 路线对应学习视频


同时每个成长路线对应的板块都有配套的视频提供:


![image-20231025112050764](https://img-blog.csdnimg.cn/874ad4fd3dbe4f6bb3bff17885655014.png#pic_center)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以点击这里获取](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值