Как рассчитать окружность живота, который 3d отсканировал? - PullRequest
1 голос
/ 17 июня 2019

Я сканирую человека с помощью kinect v2 и сохраняю его / ее тело в форматах .ply, .obj, .stl.Я хочу вычислить окружность живота, бицепса и т. Д. Из этого отсканированного тела 3d.

Я открыт для всех идей.

Вот код, который я использую при сохранении файла .obj.

public static void SaveAsciiObjMesh(Mesh mesh, TextWriter writer, bool flipAxes)
    {
        if (null == mesh || null == writer)
        {
            return;
        }

        var vertices = mesh.GetVertices();
        var normals = mesh.GetNormals();
        var indices = mesh.GetTriangleIndexes();

        // Check mesh arguments
        if (0 == vertices.Count || 0 != vertices.Count % 3 || vertices.Count != indices.Count)
        {
            throw new ArgumentException(Properties.Resources.InvalidMeshArgument);
        }

        // Write the header lines
        writer.WriteLine("#");
        writer.WriteLine("# OBJ file created by Microsoft Kinect Fusion");
        writer.WriteLine("#");

        // Sequentially write the 3 vertices of the triangle, for each triangle
        for (int i = 0; i < vertices.Count; i++)
        {
            var vertex = vertices[i];

            string vertexString = "v " + vertex.X.ToString(CultureInfo.InvariantCulture) + " ";

            if (flipAxes)
            {
                vertexString += (-vertex.Y).ToString(CultureInfo.InvariantCulture) + " " + (-vertex.Z).ToString(CultureInfo.InvariantCulture);
            }
            else
            {
                vertexString += vertex.Y.ToString(CultureInfo.InvariantCulture) + " " + vertex.Z.ToString(CultureInfo.InvariantCulture);
            }

            writer.WriteLine(vertexString);
        }

        // Sequentially write the 3 normals of the triangle, for each triangle
        for (int i = 0; i < normals.Count; i++)
        {
            var normal = normals[i];

            string normalString = "vn " + normal.X.ToString(CultureInfo.InvariantCulture) + " ";

            if (flipAxes)
            {
                normalString += (-normal.Y).ToString(CultureInfo.InvariantCulture) + " " + (-normal.Z).ToString(CultureInfo.InvariantCulture);
            }
            else
            {
                normalString += normal.Y.ToString(CultureInfo.InvariantCulture) + " " + normal.Z.ToString(CultureInfo.InvariantCulture);
            }

            writer.WriteLine(normalString);
        }

        // Sequentially write the 3 vertex indices of the triangle face, for each triangle
        // Note this is typically 1-indexed in an OBJ file when using absolute referencing!
        for (int i = 0; i < vertices.Count / 3; i++)
        {
            string baseIndex0 = ((i * 3) + 1).ToString(CultureInfo.InvariantCulture);
            string baseIndex1 = ((i * 3) + 2).ToString(CultureInfo.InvariantCulture);
            string baseIndex2 = ((i * 3) + 3).ToString(CultureInfo.InvariantCulture);

            string faceString = "f " + baseIndex0 + "//" + baseIndex0 + " " + baseIndex1 + "//" + baseIndex1 + " " + baseIndex2 + "//" + baseIndex2;
            writer.WriteLine(faceString);
        }
    }

Я действительно неопытен в обработке изображений, и это часть моей домашней работы в семестре.Я был болен, не мог пойти в школу в тот день, и они оставили мне тяжелую домашнюю работу.По крайней мере, сложнее для меня.Поэтому мне нужны некоторые идеи по этому поводу.Любая информация будет потрясающей.

1 Ответ

1 голос
/ 17 июня 2019

Просто импортируйте его в Autodesk 3D Max, и он имеет встроенный объем, площадь поверхности, функции измерения размеров. Или, если вы хотите написать свою собственную программу, вы можете получить координаты триангуляции поверхности. Никогда не использовал kinect, поэтому не могу сказать вам больше, если вы не скажете нам, какие данные вы можете получить из модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...