面包屑图标 当前位置: 首页
AI资讯
热点详情

树莓派手势控制媒体播放器构建教程

AI热点日报
AI热点日报时间:2026-07-06
热点解读

用MediaPipe和树莓派实现手势控制媒体播放器 这次我们直接上手,用MediaPipe Python库来检测手势,然后控制树莓派上的媒体播放器。总共设计了六个手势:开合拳控制播放 暂停,手的上下移动控制音量增减,左右移动控制快进快退。听起来是不是很酷?下面一步步拆解。 构建手势控制媒体播放器所需

用MediaPipe和树莓派实现手势控制媒体播放器

这次我们直接上手,用MediaPipe Python库来检测手势,然后控制树莓派上的媒体播放器。总共设计了六个手势:开合拳控制播放/暂停,手的上下移动控制音量增减,左右移动控制快进快退。听起来是不是很酷?下面一步步拆解。

构建手势控制媒体播放器所需的组件

硬件方面只需要两样东西:树莓派4和Pi摄像头模块。软件上则需要OpenCV(负责图像处理)和MediaPipe(负责手部跟踪)。OpenCV在数字图像处理领域是标配,而MediaPipe则是一个跨平台的多模态机器学习管道框架,支持Android、iOS、Web甚至边缘设备。它预封装了很多实用模型,包括物体检测、人脸检测、手部追踪、姿势估计、多手追踪、头发分割等——我们这次用的就是手部追踪。

MediaPipe的Python包在PyPI上可以直接安装,但针对树莓派有专门版本。如果用的是Pi 4,执行:

sudo pip3 install mediapipe-rpi4

如果是Pi 3,则换成:

sudo pip3 install mediapipe-rpi3

在树莓派上安装OpenCV

安装OpenCV之前,先把树莓派系统更新到最新:

sudo apt-get update

然后安装必要的依赖:

sudo apt-get install libhdf5-dev -y
sudo apt-get install libhdf5-serial-dev -y
sudo apt-get install libatlas-base-dev -y
sudo apt-get install libjasper-dev -y
sudo apt-get install libqtgui4 -y
sudo apt-get install libqt4-test -y

之后安装OpenCV(这里指定了版本4.1.0.25,兼容性比较稳定):

pip3 install opencv-contrib-python==4.1.0.25

在树莓派上安装PyAutoGUI

PyAutoGUI是一个跨平台的GUI自动化模块,可以让Python脚本模拟键盘和鼠标操作。我们要用它来模拟媒体播放器的控制键。安装命令很简单:

pip3 install pyautogui

为媒体控制器编程树莓派

完整的代码在文末给出。这里挑重点解释一下关键逻辑。

首先导入三个核心库:OpenCV、MediaPipe、PyAutoGUI。然后创建两个MediaPipe的工具变量——mp_drawing用于绘图,mp_hands用于手部模型。

接着定义一个findPosition()函数,它负责返回食指、中指、无名指、小指指尖的X、Y坐标,结果存入列表lmList。注意,这里用results.multi_hand_landmarks获取检测到的手部关键点,再通过坐标映射到图像尺寸。

启动摄像头时,设置帧尺寸为720×640,然后进入主循环。每次读取图像后,先水平翻转(为了自拍视角),再转为RGB格式送入MediaPipe的手部模型进行推理。推理结果绘制在图像上,连线展示手部骨架。

得到关键点坐标后,第一个判断手势是“拳头张开还是闭合”。方法很简单:比较指尖(索引8、12、16、20)与对应中点(索引6、10、14、19)的Y坐标。如果指尖在中点下方,说明该手指弯曲(闭合),反之伸直(张开)。统计伸开的手指数量totalFingers

  • 4根手指张开 → 播放
  • 0根手指张开且当前状态为“播放” → 暂停(模拟按下空格键)

对于方向控制:

  • 1根手指(食指)伸出时,根据指尖X坐标判断左右:小于300为左滑,大于400为右滑,对应模拟方向键左右。
  • 2根手指(食指+中指)伸出时,根据中指Y坐标判断上下:小于210为上滑,大于230为下滑,对应模拟方向键上下。

测试时,把Pi摄像头模块正确连接(参考下图),确认摄像头工作正常后运行脚本。会弹出一个实时视频窗口,就可以用手势控制播放器了。视频源可以换成任何你喜欢的视频——双手一挥,快进倒退,体验感拉满。

完整代码

import cv2
import mediapipe as mp
import pyautogui

mp_drawing = mp.solutions.drawing_utils
mp_hands = mp.solutions.hands

tipIds = [4, 8, 12, 16, 20]
state = None
gesture = None
wCam, hCam = 720, 640

def findPosition(image, handNo=0):
    lmList = []
    if results.multi_hand_landmarks:
        myHand = results.multi_hand_landmarks[handNo]
        for id, lm in enumerate(myHand.landmark):
            h, w, c = image.shape
            cx, cy = int(lm.x * w), int(lm.y * h)
            lmList.append([id, cx, cy])
    return lmList

cap = cv2.VideoCapture(0)
cap.set(3, wCam)
cap.set(4, hCam)

with mp_hands.Hands(
    min_detection_confidence=0.8,
    min_tracking_confidence=0.5) as hands:
    while cap.isOpened():
        success, image = cap.read()
        if not success:
            print("忽略空相机帧。")
            continue

        image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB)
        image.flags.writeable = False
        results = hands.process(image)

        image.flags.writeable = True
        image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)

        if results.multi_hand_landmarks:
            for hand_landmarks in results.multi_hand_landmarks:
                mp_drawing.draw_landmarks(
                    image, hand_landmarks, mp_hands.HAND_CONNECTIONS)

        lmList = findPosition(image)

        if len(lmList) != 0:
            fingers = []
            for id in range(1, 5):
                if lmList[tipIds[id]][2] < lmList[tipIds[id] - 2][2]:
                    fingers.append(1)
                if lmList[tipIds[id]][2] > lmList[tipIds[id] - 2][2]:
                    fingers.append(0)

            totalFingers = fingers.count(1)
            print(totalFingers)

            if totalFingers == 4:
                state = "Play"

            if totalFingers == 0 and state == "Play":
                state = "Pause"
                pyautogui.press('space')
                print("space")

            if totalFingers == 1:
                if lmList[8][1] < 300:
                    print("Left")
                    pyautogui.press('left')
                if lmList[8][1] > 400:
                    print("Right")
                    pyautogui.press('right')

            if totalFingers == 2:
                if lmList[9][2] < 210:
                    print("Up")
                    pyautogui.press('up')
                if lmList[9][2] > 230:
                    print("Down")
                    pyautogui.press('down')

        cv2.imshow("Media Controller", image)
        key = cv2.waitKey(1) & 0xFF
        if key == ord("q"):
            break

cv2.destroyAllWindows()
热点追踪提示词
你是一名 AI 行业编辑,请围绕下面这条热点输出一份资讯解读:
热点:树莓派手势控制媒体播放器构建教程要求:
1. 先用一句话解释这条热点在讲什么
2. 再总结它为什么重要
3. 说明会影响哪些 AI 产品或内容方向
4. 最后给出 3 个适合资讯站使用的标题
来源:https://m.elecfans.com/article/1870300.html
手势控制

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关热点
AI热点2026-07-06 20:47
百度官方出品度加剪辑口播自媒体必备工具

度加剪辑是百度官方出品的剪辑工具,面向口播自媒体创作者。支持视频剪辑、智能识别字幕,并与百度网盘打通,可快速导入素材。适用于泛知识类创作者制作高质量视频,覆盖从素材导入到成品输出的完整流程。

AI热点2026-07-06 20:46
基于AI的智能在线个性化锻炼计划生成工具 Workout Master

WorkoutMaster是一款基于AI的个性化锻炼计划生成工具,能根据用户目标、偏好及历史训练记录,动态输出专属方案,并实时自适应调整负重、组次等参数。支持定制目标与器械偏好,借助机器学习持续优化,随时随地即可接入使用,确保训练高效安全。

AI热点2026-07-06 20:46
Calorielens AI智能实时拍照分析餐点照片卡路里追踪应用

Calorielens是一款利用AI分析餐食照片的卡路里追踪应用。用户只需拍照,AI即可自动识别食物种类和分量并估算卡路里,省去手动输入步骤。应用还提供历史记录追踪功能,帮助把握热量趋势。AI估算精度可满足日常健康管理需求。

AI热点2026-07-06 20:46
百度旗下首个AI互动式搜索APP简单搜索

百度旗下“简单搜索”AI搜索引擎集成语音、图像、多媒体搜索及实时翻译,支持多模态交互与智能推荐。基于大模型技术,用户可通过对话式交互直接获取精准答案,适用于学习、旅行、生活、职业发展等场景,高效满足信息需求。

延伸阅读