2025-12-16 17:22:24 [显示全部楼层]
49浏览
查看: 49|回复: 1

[项目] 人类VS喵星人猜拳小游戏(mediapipe)

[复制链接]
本帖最后由 gada888 于 2025-12-17 18:13 编辑

AI都来陪你玩猜拳啦!
最近我用 Python 做了个小玩意儿——一个人机互动猜拳小游戏!
不需要鼠标键盘,只要打开摄像头,对着它比个手势,
电脑就能认出你出的拳,还会立刻和你 PK 一局。
技术亮点大揭秘:
  • 用了 MediaPipe 做手势识别——AI 竟然能看懂我比剪刀。
  • Tkinter 打造迷你界面——干净利落,一目了然。
  • 人机对战乐趣拉满——电脑出拳速度飞快,输赢全靠反应。
    人类VS喵星人猜拳小游戏(mediapipe)图2
这个小游戏超级轻量又好玩,
既能学学手势识别的小知识,还能随手来两局放松一下。
要不,你也来和 AI 猜一把拳?


这个是这colab环境调试的,但是不建议初学者用
人类VS喵星人猜拳小游戏(mediapipe)图1

你可以这python环境直接打开。首先安装python最新版。注意添加路径到系统环境。然后打开我给你的hand.py文件。用右键点击
人类VS喵星人猜拳小游戏(mediapipe)图3
打开后,找run

人类VS喵星人猜拳小游戏(mediapipe)图4
然后选run module
人类VS喵星人猜拳小游戏(mediapipe)图5
耐心等一会
人类VS喵星人猜拳小游戏(mediapipe)图6
游戏界面出来了。
人类VS喵星人猜拳小游戏(mediapipe)图7
我们来拆解一下代码部分。
这是一段Python 代码,它结合了 计算机视觉 (OpenCV + MediaPipe)图形用户界面 (Tkinter),实现了一个互动式的“石头剪刀布”游戏。
代码逻辑分析
  • 核心库的作用

    • cv2 (OpenCV): 负责调用摄像头,读取视频流,并在视频帧上绘制文字和倒计时。
    • mediapipe: 谷歌开源的机器学习库,这里具体使用了 solutions.hands 模块,用于实时检测手部关节点(Landmarks)。
    • tkinter: Python 自带的 GUI 库,用于构建游戏窗口、按钮、记分板等界面。
    • PIL (Pillow): 用于将 OpenCV 的图像格式(BGR/NumPy数组)转换为 Tkinter 可以显示的图像对象。

  • 手势识别算法 (detect_gesture)

    • 代码没有使用复杂的神经网络分类器,而是使用了基于几何距离的规则判断
    • 原理:它计算“指尖到手腕的距离”与“指关节到手腕的距离”。如果指尖距离显著大于关节距离(乘以系数 1.1),则认为该手指是“伸直”的。
    • 逻辑

      • 0 或 1 指伸直 -> 石头 (Rock)
      • 4 或 5 指伸直 -> 布 (Paper)
      • 仅食指和中指伸直 -> 剪刀 (Scissors)

  • 游戏循环 (_update_loop)

    • 这是程序的心脏。它利用 Tkinter 的 root.after(10, self._update_loop) 实现死循环,每 10 毫秒刷新一次。
    • 在循环中完成:读取视频 -> 识别手势 -> 绘制骨架 -> 处理倒计时逻辑 -> 更新界面图像

=================
[code]import cv2  # OpenCV库:用于调用摄像头、处理图像(翻转、色彩转换等)
import mediapipe as mp  # Google的MediaPipe库:用于高精度的手部关键点检测
import tkinter as tk  # Python标准GUI库:用于创建游戏窗口和界面元素
from tkinter import font  # Tkinter字体模块:用于设置漂亮的字体
from PIL import Image, ImageTk  # Pillow库:用于将OpenCV图像转换为Tkinter能显示的格式
import random  # 随机数库:用于电脑随机出拳
import time  # 时间库:用于计算倒计时
import math  # 数学库:用于计算距离(勾股定理)
# 已移除 winsound 模块

class CuteRPSGame:
    def __init__(self, root):
        """
        初始化游戏类
        :param root: Tkinter的主窗口对象
        """
        self.root = root
        self.root.title("✨ 萌萌哒AI猜拳大作战 ✨") # 设置窗口标题
        self.root.geometry("1000x700") # 设置窗口初始大小
        self.root.configure(bg="#FFF0F5")  # 设置背景颜色:淡紫红 (LavenderBlush)

        # --- 1. 初始化 MediaPipe 手部识别模型 ---
        self.mp_hands = mp.solutions.hands
        self.hands = self.mp_hands.Hands(
            static_image_mode=False,      # 视频流模式,设为False可以提高跟踪速度
            max_num_hands=1,              # 最多检测一只手(如果是双手玩法可改为2)
            min_detection_confidence=0.7, # 检测置信度阈值,越高手势识别越严谨
            min_tracking_confidence=0.5   # 跟踪置信度阈值
        )
        # 绘图工具,用于在视频画面上画出手骨架
        self.mp_drawing = mp.solutions.drawing_utils
        self.mp_drawing_styles = mp.solutions.drawing_styles

        # --- 2. 初始化摄像头 ---
        # 参数 0 通常代表电脑的默认摄像头
        self.cap = cv2.VideoCapture(0)

        # --- 3. 初始化游戏状态变量 ---
        self.is_playing = False         # 标记当前是否正在进行对决
        self.countdown_start_time = 0   # 记录倒计时开始的时间戳
        self.countdown_duration = 3     # 设定倒计时总时长为3秒
        # 已移除 last_countdown_num (音效相关)
        self.game_result = ""           # 存储每一局的输赢结果文字
        self.player_gesture = "未知"    # 玩家当前的手势
        self.computer_gesture = "等待"  # 电脑当前的状态/手势
        self.scores = {"player": 0, "computer": 0} # 记录比分

        # --- 4. 资源映射字典 ---
        # 将英文的手势名称映射为可爱的 Emoji 表情
        self.gesture_emojis = {
            "Rock": "✊",
            "Paper": "✋",
            "Scissors": "✌️",
            "Unknown": "❓",
            "Wait": "

hand.rar

4.27 KB, 下载次数: 5

代码详解.rar

5.92 KB, 下载次数: 0

木子哦  管理员

发表于 5 小时前

失踪人口回归
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail