Mediapipe手势识别,并与unity通信

这篇具有很好参考价值的文章主要介绍了Mediapipe手势识别,并与unity通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Mediapipe是goole的一个开源项目,支持跨平台的常用ML方案,详情请戳下面链接

MediaPipe

Mediapipe底层封装了手势识别的具体实现内容,而在Python中搭建完环境后经过很简单的调用就能够实现手势识别

Mediapipe手势识别,并与unity通信

环境如下:

pip install mediapipe

pip install opencv-python

简单的实现,代码很少,代码如下:

import cv2
import mediapipe as mp
import time

cap = cv2.VideoCapture('video.mp4')#可将'video.mp4'替换为0打开摄像头

mpHands = mp.solutions.hands
hands = mpHands.Hands()
mpDraw = mp.solutions.drawing_utils

pTime = 0
cTime = 0

while True:
    success, img = cap.read()
    imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  
    results = hands.process(imgRGB)
    if results.multi_hand_landmarks:
        for handLms in results.multi_hand_landmarks:
            for id, lm in enumerate(handLms.landmark):
                h, w, c = img.shape
                cx, cy = int(lm.x * w), int(lm.y * h)
                print(id, cx, cy)
                cv2.circle(img, (cx, cy), 15, (255, 0, 255), cv2.FILLED)
            mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS)

    cTime = time.time()
    fps = 1 / (cTime - pTime)
    pTime = cTime

    cv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3,
                (255, 255, 255), 2)

    cv2.imshow("Image", img)
    cv2.waitKey(1)

其中打印了lm.x,lm.y代表xy坐标,还可以有一个z值,lm.z代表相对于0号点的位置,0号点的z值为0。21个关键点位置代表如下:

Mediapipe手势识别,并与unity通信

而为了获取深度信息,可以根据5号点和17号点距离摄像头越远,屏幕中二者的距离越小的规律构建函数关系,进行深度的预测,但仅在手与摄像头平行才好用,手旋转,深度信息也会变化。函数构建代码如下:

x = [300, 245, 200, 170, 145, 130, 112, 103, 93, 87, 80, 75, 70, 67, 62, 59, 57]
y = [20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100]
coff = np.polyfit(x, y, 2)

Lx1, Ly1 = HandLeft[5][:2]
Lx2, Ly2 = HandLeft[17][:2]
Ldistance = int(math.sqrt((Ly2 - Ly1) ** 2 + (Lx2 - Lx1) ** 2))
A, B, C = coff
LdistanceCM = A * Ldistance ** 2 + B * Ldistance + C

 此外,还可在python中设置接口,与其他程序通信,这里将与unity脚本通信示例,

# GUI
labelP = tk.Label(window, text='port: ').place(x=150, y=0)
var = tk.IntVar()
var.set(port)

def insertPort():
    global port
    port = entery.get()
    port = int(port)
    var.set(port)
    
serverAddressPort = ("127.0.0.1", port)

button = tk.Button(window,text='Enter', width=15, height=2, command=insertPort)
button.pack()
button = tk.Button(window,text='Start', width=15, height=2, command=changeSwitch)
button.pack()
window.mainloop()

在通信之前可打印一下通信的信息,设置好格式,在unity处,取到传入的值

using UnityEngine;
using UnityEngine.UI;
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;

public class UDPReceive : MonoBehaviour
{
    Thread receiveThread;
    UdpClient client = null;
    public int port = 43513;
    public bool startRecieving = true;
    public bool printToConsole = false;
    public string data;

    public void Start()
    {
        receiveThread = new Thread(new ThreadStart(ReceiveData));
        receiveThread.Start();
    }

    private void ReceiveData()
    {
        client = new UdpClient(port);
        while (startRecieving)
        {
            try
            {
                IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, 0);
                byte[] dataByte = client.Receive(ref anyIP);
                data = Encoding.UTF8.GetString(dataByte);

                if (printToConsole) { print(data); }
            }
            catch (Exception err)
            {
                print(err.ToString());
            }
        }
    }
}

之后,去除杂项获得x,y,z值,根据该值进行创建物体划线展示效果

 GameObject[] point = new GameObject[21];
        public void Start()
        {

            for (int i = 0; i < 21; i++)
            {
                point[i] = GameObject.CreatePrimitive(PrimitiveType.Sphere);
                point[i].SetActive(true);
                point[i].transform.localScale = new Vector3(0.005f, 0.005f, 0.005f);


                Renderer render = point[i].GetComponent<Renderer>();
                //render.material = new Material(Shader.Find("Unlit/Color"));
                render.material.SetColor("_Color", Color.red);
            }
        }

public void Update(){
for (int i = 0; i < 21; i++)
                {

                    float x = float.Parse(pointsRight[i * 4]) / 10000;
                    float y = float.Parse(pointsRight[i * 4 + 1]) / 10000;
                    float z = float.Parse(pointsRight[i * 4 + 2]) / 10000;
                    
                    RzD = 20;

                    if (x == 0 && y == 0 && z == 0)
                        return;

                    handPoints[i] = new Vector3( x, -y, z);


                
                    point[i].transform.position = handPoints[i];
for (int i = 1; i < 21; i++)   
                {
                    if(i!=4&&i!=8&&i!=12&&i!=16&&i!=20)
                    Debug.DrawLine(handPoints[i], handPoints[i+1], Color.green);
                }
                Debug.DrawLine(handPoints[0], handPoints[1], Color.black);
                Debug.DrawLine(handPoints[0], handPoints[5], Color.black);
                Debug.DrawLine(handPoints[0], handPoints[9], Color.black);
                Debug.DrawLine(handPoints[0], handPoints[13], Color.black);
                Debug.DrawLine(handPoints[0], handPoints[17], Color.black);
}

 效果如下:

Mediapipe手势识别,并与unity通信文章来源地址https://www.toymoban.com/news/detail-506933.html

到了这里,关于Mediapipe手势识别,并与unity通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mediapipe 手势节点识别自动控制音量

    参考:https://www.computervision.zone/topic/volumehandcontrol-py/ 主函数: VolumeHandControl.py

    2024年02月11日
    浏览(28)
  • 基于opencv-mediapipe的手势识别

    上一篇文章介绍了基于opencv的手势识别,如果大家运行了我的代码,会发现代码中找出手部轮廓的效果不是很理想。当时我在网上找寻解决的办法,刚好找到了mediapip库,然后我就利用opencv和mediapipe这两个库重新进行了手势识别的代码编写。效果还不错,写篇文章记录一下。

    2024年02月09日
    浏览(37)
  • 基于python+opencv+mediapipe实现手势识别详细讲解

    目录 运行环境: 一、opencv 二、meidapipe配置 三、实现手部的识别并标注 1、参数分析 1.multi_hand_landmarks  2.multi_hand_world_landmarks 3.multi_handedness 2.绘制信息点和连线 python3.9.7  opencv-python4.6.0.66  mediapipe0.8.11 运行之前先要安装opencv-python、opencv-contrib-python、mediapipe 项目可能对版本的

    2024年01月25日
    浏览(35)
  • 使用MediaPipe和OpenCV的Python实现手势识别

    手势识别技术是一种非常有用的技术,它可以将人类的手势转化为计算机可以理解的形式,从而实现更加自然、快速和直观的交互方式。本文将介绍一种基于MediaPipe和OpenCV的手势识别技术,可以实现对手势的实时识别和分析。 MediaPipe是一种开源的机器学习框架,可以用于构建

    2024年02月14日
    浏览(37)
  • MediaPipe+OpenCV 实现实时手势识别(附Python源码)

    MediaPipe官网:https://developers.google.com/mediapipe MediaPipe仓库:https://github.com/google/mediapipe MediaPipe 是一个由 Google 开发的开源跨平台机器学习框架,用于构建视觉和感知应用程序。它提供了一系列预训练的机器学习模型和工具,使开发者能够轻松地构建基于计算机视觉和机器学习的

    2024年02月07日
    浏览(34)
  • Openmv识别Apriltag码并与stm32进行串口通信

            本文使用带有独立处理图像模块的摄像头Openmv进行Apriltag码的识别,并将Openmv与stm32进行串口通信,将Apriltag码的ID、中心位置相对于Openmv摄像头中心坐标的偏移量、以及Apriltag码相对于Openmv镜头的距离通过串口通信传输给stm32。         接线图Openmv通过电脑USB口

    2024年04月27日
    浏览(23)
  • openmv识别物体并与单片机通信(STM32)

    感光元件 寻找色块 find_blobs函数:此函数参数较多,一般只用第一个参数就可以找到需要的色块。thresholds是颜色的阈值,是一个列表,这个列表可以有多个颜色阈值。 一个颜色阈值的结构是这样的: 画图 x,y:是坐标 size:是两侧的尺寸 color:画十字的颜色 rect_tuple 的格式是

    2023年04月08日
    浏览(28)
  • 【OpenMV学习笔记(一)】识别色块并与STM通信传输中心坐标

    一直有想要写些东西的想法正好最近比较闲以及大创项目和电赛备赛需要用到OpenMV所以就记录一下学习过程。因为小白第一次写文章有什么错误希望大家包含在评论区指正。 2.1、Openmv端 这里OpenMV端仅作为数据的发送端,所以只需要共地,以及OpenMV的TX(P4)与开发板的RX端连

    2024年02月14日
    浏览(40)
  • K210识别数字(0~9)并与单片机通信通过数字来控制小车移动

    前一段时间学习了K210的模型训练,又学会了K210的串口通信,于是冒出一个新奇的想法,用手势控制小车,手势识别可能比较难,于是想着先用数字控制小车。(懂得都懂)我相信有很多人再找这篇博客,希望大家可以看到这篇博客并帮助到你们。 方法也很简单,相信你看了

    2023年04月16日
    浏览(33)
  • 基于Mediapipe的姿势识别并同步到Unity人体模型中

    如题,由于是商业项目,无法公开源码,这里主要说一下实现此功能的思路。 人体关节点识别 基于Mediapipe Unity插件进行开发,性能比较低的CPU主机,无法流畅地运行Mediapipe,这个要注意一下。 Mediapipe33个人体关节点图如下: Mediapipe关节点映射到Unity人体骨骼 这是开发此功能

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包