Funcionamento do Utils

Autor: felipe 64 visualizações

Utils

A classe Utils é uma classe de apoio para facilitar o desenvolvedor a trabalhar com os dados obtidos do rastreamento corporal.

O método Get2dAngle é utilizado para conseguir o ângulo quando trabalhamos em duas dimensões. É necessário inserir três posições, inicial, central e final, assim o método retorna o ângulo. Analogamente, funciona o método Get3dAngle, entretanto, em três dimensões. Já o método Compressing e Decompress servem para comprimir e descomprimir dados, facilitando a manipulação de dados ao trabalhar com bancos de dados, o método CopyTo é utilizado de forma auxiliar aos métodos Compressing e Decompress.

				
					using UnityEngine;
using System.IO;
using System.IO.Compression;
using System.Text;
using Google.Protobuf.Collections;
using Mediapipe;

public class Utils : MonoBehaviour
{
    // Function used in Compress and Decompress
    private static void CopyTo(Stream src, Stream dest)
    {
        byte[] bytes = new byte[4096];

        int cnt;

        while ((cnt = src.Read(bytes, 0, bytes.Length)) != 0)
        {
            dest.Write(bytes, 0, cnt);
        }
    }

    // Compress Data
    public static byte[] Compress(string str)
    {
        var bytes = Encoding.UTF8.GetBytes(str);

        using (var msi = new MemoryStream(bytes))
        using (var mso = new MemoryStream())
        {
            using (var gs = new DeflateStream(mso, CompressionMode.Compress))
            {
                CopyTo(msi, gs);
            }

            return mso.ToArray();
        }
    }

    // Decompress sent data
    public static string Decompress(byte[] bytes)
    {
        using (var msi = new MemoryStream(bytes))
        using (var mso = new MemoryStream())
        {
            using (var gs = new DeflateStream(msi, CompressionMode.Decompress))
            {
                CopyTo(gs, mso);
            }

            return Encoding.UTF8.GetString(mso.ToArray());
        }
    }

    private static RepeatedField<NormalizedLandmark> landmarks;

    // Get2dAngle using 3 positions (first, middle, last)
    public float Get2DAngle(Poses.PoseBts idxFirst, Poses.PoseBts idxMid, Poses.PoseBts idxLast)
    {
        var first = landmarks[(int)idxFirst];
        var mid = landmarks[(int)idxMid];
        var last = landmarks[(int)idxLast];
        var result = Mathf.Rad2Deg *
                     (Mathf.Atan2(last.Y - mid.Y, last.X - mid.X) - Mathf.Atan2(first.Y - mid.Y, first.X - mid.X));
        result = Mathf.Abs(result);
        if (result > 180)
        {
            result = 360 - result;
        }

        return result;
    }

    // Get3dAngle using 3 positions (first, middle, last)
    public float Get3DAngle(Poses.PoseBts idxFirst, Poses.PoseBts idxMid, Poses.PoseBts idxLast)
    {
        var first = landmarks[(int)idxFirst];
        var mid = landmarks[(int)idxMid];
        var last = landmarks[(int)idxLast];

        var b = new Vector3(mid.X, mid.Y, mid.Z);
        var ba = (new Vector3(first.X, first.Y, first.Z)) - b;
        var bc = (new Vector3(last.X, last.Y, last.Z)) - b;

        var cosine = Vector3.Dot(ba, bc) / (ba.magnitude * bc.magnitude);
        var angle = Mathf.Acos(cosine);
        var result = Mathf.Rad2Deg * angle;
        return result;
    }
}				
			
Nesta página