Unity 3D 手部追踪

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

一、前言

Unity是一款强大的跨平台游戏开发引擎,由Unity Technologies开发和维护。它提供了一个综合的开发环境,可以用于创建2D和3D游戏,以及其他交互式内容,如虚拟现实和增强现实应用程序。大学时期的室友Unity玩得很好,开发出了很多有趣的高质量游戏。这里,本人第一次使用Unity,来实现手部的3D检测追踪。

二、实战

1.OpenCV追踪手部

代码:

import cv2
from cvzone.HandTrackingModule import HandDetector
import socket

width, height = 1280, 720
cap = cv2.VideoCapture(0)
cap.set(3, width)
cap.set(4, height)

# Hand Detector
detector = HandDetector(maxHands=1, detectionCon=0.8)
# communication
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
serverAddressPort = ("127.0.0.1", 5052)

while True:
    success, img = cap.read()
    # hands
    hands, img = detector.findHands(img)
    data = []

    # Landmark values -(x,y,z)*21
    if hands:
        # get the first hand detected
        hand = hands[0]
        # get the landmark list
        lmlist = hand['lmList']
        # print(lmlist)
        for lm in lmlist:
            data.extend([lm[0], height - lm[1], lm[2]])
        print(data)
        sock.sendto(str.encode(str(data)), serverAddressPort)

    img = cv2.resize(img, (0, 0), None, 0.5, 0.5)
    cv2.imshow("Image", img)
    cv2.waitKey(1)

效果:

unity 手部模型,计算机视觉,unity,计算机视觉,人工智能,opencv

2.Unity搭建

(1)根据手部的21个特征点搭建模型

unity 手部模型,计算机视觉,unity,计算机视觉,人工智能,opencv

unity 手部模型,计算机视觉,unity,计算机视觉,人工智能,opencv

 通过21个点和21条线,构造手部模型,过程较复杂

如下:

unity 手部模型,计算机视觉,unity,计算机视觉,人工智能,opencv

(2)Unity代码

在模型构建中,使用到了UDPReceive.cs、HandTracking.cs和LineCode.cs三段代码,分别用于实现信息传输、手部数据追踪和点线相连。

1.UDPReceive.cs

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

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

    public void Start()
    {

        receiveThread = new Thread(
            new ThreadStart(ReceiveData));
        receiveThread.IsBackground = true;
        receiveThread.Start();
    }

    // receive thread
    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());
            }
        }
    }

}

2.HandTracking.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HandTracking : MonoBehaviour
{
    // Start is called before the first frame update
    public UDPReceive udpReceive;
    public GameObject[] handPoints;
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        string data = udpReceive.data;

        data = data.Remove(0, 1);
        data = data.Remove(data.Length-1, 1);
        print(data);
        string[] points = data.Split(',');
        print(points[0]);

        //0        1*3      2*3
        //x1,y1,z1,x2,y2,z2,x3,y3,z3

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

            float x = 7-float.Parse(points[i * 3])/100;
            float y = float.Parse(points[i * 3 + 1]) / 100;
            float z = float.Parse(points[i * 3 + 2]) / 100;

            handPoints[i].transform.localPosition = new Vector3(x, y, z);

        }

    }
}

 3.LineCode.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LineCode : MonoBehaviour
{

    LineRenderer lineRenderer;

    public Transform origin;
    public Transform destination;

    // Start is called before the first frame update
    void Start()
    {
        lineRenderer = GetComponent<LineRenderer>();
        lineRenderer.startWidth = 0.1f;
        lineRenderer.endWidth = 0.1f;
    }

    // Update is called once per frame
    void Update()
    {
        lineRenderer.SetPosition(0, origin.position);
        lineRenderer.SetPosition(1, destination.position);
    }
}

(3)3D 手部追踪效果

还行

三、最后

第一次使用Unity,不熟悉模型的构建,花费了很多时间,但最终实现了效果,还是很开心的。Unity在游戏开发和交互式领域上有着广泛的应用前景,值得我们学习和探索。文章来源地址https://www.toymoban.com/news/detail-734397.html

到了这里,关于Unity 3D 手部追踪的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【计算机视觉】---OpenCV实现物体追踪

    OpenCV中的物体追踪算法基于视觉目标跟踪的原理。物体追踪的目标是在连续的图像序列中定位和跟踪特定物体的位置。 在物体追踪中,我们需要对目标对象进行表示。通常使用边界框(bounding box)来表示目标的位置和大小。边界框是一个矩形区域,由左上角的坐标(x,y)和

    2024年02月08日
    浏览(51)
  • 【opencv】计算机视觉:实时目标追踪

    目录 前言 解析 深入探究 前言 目标追踪技术对于民生、社会的发展以及国家军事能力的壮大都具有重要的意义。它不仅仅可以应用到体育赛事当中目标的捕捉,还可以应用到交通上,比如实时监测车辆是否超速等!对于国家的军事也具有一定的意义,比如说导弹识别目标等

    2024年02月05日
    浏览(53)
  • VS2022Debug 附加Unity程序遇见的问题(由于目标计算机积极拒绝,无法连接)

    今天突然想到用debug来调试一下unity,看一下我的东西,于是在vs的调试栏找到当初下载的Unity的Vs工具,如果不知道是否下载过这个工具可以在工具栏的第一项 获取工具与功能 中查看。 然后就选择当前存在的已经打开的unity项目。 如图: 根据项目名选择就好 但是确定之后出

    2024年02月12日
    浏览(46)
  • 【计算机图形学】OpenGL递归实现光线追踪

    计算机图形学课程设计:基于面向对象的光线跟踪算法设计与实现 目录 一、前言 二、项目实现与说明 1. 数据结构设计 1.1 光线 Ray 1.2 材质 Material 1.3 光照 Light 1.4 相机 Camera 1.5 球体Sphere 1.6 场景Scene 2. 算法实现 2.1 光线追踪算法原理与步骤 2.2 计算观察光线 2.3 光线与物体(球

    2024年02月08日
    浏览(45)
  • 计算机图形学(三) -- 3D 变换

    同样引入齐次坐标: 3D 点 = ( x , y , z , 1 ) T (x, y, z, 1)^T ( x , y , z , 1 ) T 3D 向量 = ( x , y , z , 0 ) T (x, y, z, 0)^T ( x , y , z , 0 ) T 通常, ( x , y , z , w ) (x, y, z, w) ( x , y , z , w ) (w != 0) 表示一个坐标为 ( x / w , y / w , z / w ) (x/w, y/w, z/w) ( x / w , y / w , z / w ) 的 3D 点 用一个 4x4 的矩阵来表示

    2024年02月08日
    浏览(42)
  • 计算机视觉 3D点云极简概述

            点云是表示 3D 坐标系中的数字 3D 物理对象或空间的点数据库。它由数百万或者更多个单独的测量点组成,具有 x、y 和 z 坐标。3D点云是物体的高精度数字记录。点云用于生成用于 3D 建模的 3D 网格和其他模型。包括医学成像、3D 打印、制造、建筑、3D 游戏和虚拟

    2024年02月13日
    浏览(48)
  • 计算机图形学:绘制一个3d交互场景(1)

    OpenGL作为一种图形与硬件的接口,与其他图形程序开发工具相比较,它提供了众多图形函数,直观的编程环境简化了三维图形的绘制过程,使用OpenGL搭建一个三维场景,能够通过输入设备与场景内物体交互。 豪华单间 配置环境:vs22+freeglut库 1.绘制墙体使其成为封闭空间,在

    2024年02月11日
    浏览(110)
  • 计算机图形学的革命:从2D到3D

    计算机图形学是一门研究如何在计算机屏幕上生成图像的学科。从其出现以来,计算机图形学经历了两次革命性的变革:从2D到3D,以及从矢量图形到位置 Independent Bitmap Images(Pixels)。这篇文章将深入探讨从2D到3D的革命,揭示其背后的核心概念、算法原理、数学模型以及代码实

    2024年02月19日
    浏览(42)
  • 计算机图形学基础:2D/3D坐标变换(Transformation)

    本文讲解了2D变换和3D变换式如何用矩阵表示的 如何将线性和非线性变换进行一个统一表示形式 三维物体在二维空间上的映射 表示向量添加了一维,分别表示单位距离和平移不变形的方向 旋转默认都是以(0, 0)为中心

    2023年04月08日
    浏览(45)
  • 从2D到3D,计算机视觉的ChatGPT何时到来?

    ChatGPT 及其改进型 GPT4通过一个单一模型解决了几乎所有与文本相关的任务,彻底改变了 NLP 领域。然而,这样的一个模型在计算机视觉方面并不存在,特别是对于3D视觉。本文首先从模型的角度简要介绍了深度学习在文本、图像和3D领域的进展。此外,本文还从数据的角度进一

    2024年02月03日
    浏览(67)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包