Opencv项目实战:24 手势识别的石头剪刀布

 目录

0、项目介绍

1、效果展示

2、项目搭建

3、项目代码展示与部分讲解

pyzjr库

游戏实现思路

4、项目资源

5、项目总结


0、项目介绍

简单的自娱自乐的计算机视觉互动游戏,石头剪刀布,使用random生成随机数,用于模拟AI窗口随机出拳,玩家窗口手势识别检测石头、剪刀、布三种手势,根据游戏规则,两方玩家进行比较,按下空格键即为游戏开始,玩家在游戏开始后,有三秒的时间思考出拳策略。计时器会显示在屏幕上。在时间结束后,玩家出拳并与AI进行比较,根据游戏规则判断胜负并累计分数。

1、效果展示

2、项目搭建

安装pyzjr:

pip install pyzjr==1.0.4

必须要安装大于等于1.0.4版本以上,详细可看此处

这个工程只需要一个main文件就足够了。

3、项目代码展示与部分讲解

import pyzjr as pz
import cv2
from cvzone.HandTrackingModule import HandDetector
import time
import random
import cvzone

Vap=pz.VideoCap()
Vap.CapInit()
imgList,all = pz.getPhotopath(r"Resources",debug=False)
detector = HandDetector(maxHands=1,detectionCon=0.8)
timer = 0
stateResult = False
startGame = False
scores = [0, 0]  # [AI, Player]
imgAI = None
initialTime = 0
while True:
    img = Vap.read(flip=1)
    imgbackground = cv2.imread(imgList[0])

    imgScaled = cv2.resize(img, (0, 0), None, 0.875, 0.875)[:, 80:480]
    hands = detector.findHands(imgScaled,draw=False)

    if startGame:

        if stateResult is False:
            timer = time.time() - initialTime
            cv2.putText(imgbackground, str(int(timer)), (605, 435), cv2.FONT_HERSHEY_PLAIN, 6, pz.purple, 4)

            if timer > 3:
                stateResult = True
                timer = 0

                if hands:
                    playerMove = None
                    hand = hands[0]
                    fingers = detector.fingersUp(hand)
                    if fingers == [0, 0, 0, 0, 0]:
                        playerMove = 1
                    if fingers == [1, 1, 1, 1, 1]:
                        playerMove = 2
                    if fingers == [0, 1, 1, 0, 0]:
                        playerMove = 3

                    randomNumber = random.randint(1, 3)
                    imgAI = cv2.imread(imgList[randomNumber], cv2.IMREAD_UNCHANGED)
                    imgbackground = cvzone.overlayPNG(imgbackground, imgAI, (149, 310))

                    winning_rules = {
                        # 1-石头,2-布,3-剪刀
                        (1, 3): "player",  # 石头 vs 剪刀
                        (2, 1): "player",  # 布 vs 石头
                        (3, 2): "player",  # 剪刀 vs 布
                        (3, 1): "AI",      # 剪刀 vs 石头
                        (1, 2): "AI",      # 石头 vs 布
                        (2, 3): "AI",      # 布 vs 剪刀
                    }
                    result = winning_rules.get((playerMove, randomNumber))
                    if result == "player":
                        scores[1] += 1
                    elif result == "AI":
                        scores[0] += 1

    imgbackground[234:654, 795:1195] = imgScaled

    if stateResult:
        imgbackground = cvzone.overlayPNG(imgbackground, imgAI, (149, 310))

    cv2.putText(imgbackground, str(scores[0]), (410, 215), cv2.FONT_HERSHEY_PLAIN, 4, pz.white, 6)
    cv2.putText(imgbackground, str(scores[1]), (1112, 215), cv2.FONT_HERSHEY_PLAIN, 4, pz.white, 6)

    cv2.imshow("background", imgbackground)

    k = cv2.waitKey(1)
    if k == 32:
        startGame = True
        initialTime = time.time()
        stateResult = False
    elif k == 27:
        break

pyzjr库

只要环境没有任何问题,这个代码是可以直接运行的,我先来讲解一下pyzjr的一些函数。

VideoCap:opencv视频捕捉类的再封装,CapInit为VideoCap的镜头初始化函数,默认的参数为调取本地摄像头、宽度、高度、亮度,未给参数,使用默认值即可。read函数只返回img,不返回标志位,flip参数可选,对镜头进行翻转,1表示进行了水平翻转。

getPhotopath:获取目标文件夹下的路径,解决了转义字符的问题。debug默认为True,会返回路径有问题的信息,可以设置为False。

white,purple:常量,默认的BGR格式。

游戏实现思路

游戏开始后,使用计时器来限制玩家思考时间。在倒计时结束后,玩家会做出出拳动作。利用条件判断来比较玩家和AI的出拳,根据游戏规则判断胜负并计算分数。

检测玩家的手势的方式是使用的mediapipe的方法,这在cvzone中已被集成。通过打印fingers的值,确定剪刀、石头、布三种手势的手指上下的情况。overlayPNG函数将AI的出拳图像也加入到了背景图像中,让玩家能够清楚地看到双方的出拳。

游戏规则的方式由字典的方式进行判断,scores=[AI,player]进行累计积分,并打印在背景图片当中。通过按下空格键来触发游戏的重新开始。玩家有三秒的时间来思考出拳策略,倒计时会显示在屏幕上,让玩家清楚地知道还剩多少时间。

请注意手势识别错误或相同手势均不计分。

4、项目资源

Opencv项目实战:24 石头剪刀布

5、项目总结

通过手势识别检测石头、剪刀、布完成了这个视觉小游戏,比起网上现在的形态学方法和搭建模型要简单许多。个人也可以体验一下视觉游戏的乐趣,检测手势的画面被我关了,你可以通过将findHands的参数draw设置为True即可。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
基于OpenCV手势识别,可以用来实现石头剪刀布的游戏。这种手势识别技术主要基于图像处理和机器学习算法,通过摄像头捕获手部动作,提取出手部轮廓特征,进行手势分类识别,最终输出游戏结果。 在实现手势识别的过程中,需要先通过摄像头捕获视频图像,然后进行处理,提取出手部的轮廓特征。这可以通过一系列图像处理技术来实现,例如颜色空间转换、图像滤波、二值化、轮廓提取等。 在得到手部轮廓特征之后,可以对手势进行分类识别。这可以使用机器学习算法,例如支持向量机(SVM)或卷积神经网络(CNN)等。首先需要采集大量的手势数据集,并进行数据预处理和特征提取,然后将数据集分成训练集和测试集,通过训练算法来建立手势分类模型,并对测试集进行验证,最终得到可用于实时手势识别的模型。 最后,根据识别结果来执行相应的游戏操作。例如,如果识别出“剪刀”手势,则执行剪刀动作;如果识别出“石头”手势,则执行石头动作;如果识别出“布”手势,则执行布动作。可以结合音效和动画效果来增强游戏体验。 基于OpenCV手势识别技术已经在许多应用中得到了广泛应用,例如手机解锁和手势控制等。实现石头剪刀布游戏只是其中的一个应用案例,通过不断的技术优化和算法升级,这种技术在未来将有更广阔的发展前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天是冰红茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值