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

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

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

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 毫秒刷新一次。
    • 在循环中完成:读取视频 -> 识别手势 -> 绘制骨架 -> 处理倒计时逻辑 -> 更新界面图像

=================
def __init__(self, root):
        """初始化游戏类,设置窗口、模型和变量"""
        self.root =root
        self.root.title(" 萌萌哒AI猜拳大作战")
        self.root.geometry("1000x700")
        self.root.configure(bg="#FFF0F5") # 设置窗口背景色:淡紫红 (LavenderBlush)

        # --- 初始化 MediaPipe 手部识别模型 ---
        self.mp_hands =mp.solutions.hands
        self.hands = self.mp_hands.Hands(
           static_image_mode=False,       # False表示处理视频流,True表示处理静态图片
           max_num_hands=1,               # 仅检测一只手
           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
============
   # --- 游戏状态变量---
        self.is_playing= False            # 是否正在进行倒计时对决
        self.countdown_start_time= 0      # 倒计时开始的时间戳
        self.countdown_duration= 3        # 倒计时时长(秒)
        self.game_result= ""              # 游戏结果文本
        self.player_gesture= "未知"       # 玩家当前手势
        self.computer_gesture= "等待"     # 电脑出的手势
        self.scores = {"player":0, "computer": 0} # 记分板

        # --- 资源映射 (Emoji 代表手势) ---
        self.gesture_emojis= {
            "Rock":"",
            "Paper":"",
            "Scissors":"✌️",
            "Unknown":"",
            "Wait":"
[code]import cv2
import mediapipe as mp
import tkinter as tk
from tkinter import font
from PIL import Image, ImageTk
import random
import time
import math

class CuteRPSGame:
    def __init__(self, root):
        """初始化游戏类,设置窗口、模型和变量"""
        self.root = root
        self.root.title("✨ 萌萌哒AI猜拳大作战 ✨")
        self.root.geometry("1000x700")
        self.root.configure(bg="#FFF0F5")  # 设置窗口背景色:淡紫红 (LavenderBlush)

        # --- 初始化 MediaPipe 手部识别模型 ---
        self.mp_hands = mp.solutions.hands
        self.hands = self.mp_hands.Hands(
            static_image_mode=False,       # False表示处理视频流,True表示处理静态图片
            max_num_hands=1,               # 仅检测一只手
            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

        # --- 初始化摄像头 ---
        # 0 通常代表系统默认的摄像头
        self.cap = cv2.VideoCapture(0)

        # --- 游戏状态变量 ---
        self.is_playing = False            # 是否正在进行倒计时对决
        self.countdown_start_time = 0      # 倒计时开始的时间戳
        self.countdown_duration = 3        # 倒计时时长(秒)
        self.game_result = ""              # 游戏结果文本
        self.player_gesture = "未知"       # 玩家当前手势
        self.computer_gesture = "等待"     # 电脑出的手势
        self.scores = {"player": 0, "computer": 0} # 记分板

        # --- 资源映射 (Emoji 代表手势) ---
        self.gesture_emojis = {
            "Rock": "✊",
            "Paper": "✋",
            "Scissors": "✌️",
            "Unknown": "❓",
            "Wait": "

hand.rar

4.27 KB, 下载次数: 0

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

本版积分规则

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

硬件清单

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

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

mail