Exemple #1
0
 /**
  * 进行属性检测
  */
 private void attrCheck(FaceInfo faceInfo, ImageFrame imageFrame)
 {
     // todo 人脸属性数据获取
     mFaceAttribute = FaceSDK.FaceAttribute(imageFrame.getArgb(),
                                            imageFrame.getWidth(), imageFrame.getHeight(), FaceSDK.ImgType.Argb,
                                            faceInfo.Landmarks.ToArray());
     RunOnUiThread(new Runnable(() => { tvAttr.Text = ("人脸属性:" + getMsg(mFaceAttribute)); }));
 }
Exemple #2
0
 public string getMsg(FaceAttribute attribute)
 {
     Java.Lang.StringBuilder msg = new Java.Lang.StringBuilder();
     if (attribute != null)
     {
         msg.Append((int)attribute.Age).Append(",")
         .Append(attribute.Race == 0 ? "黄种人" : attribute.Race == 1 ? "白种人" :
                 attribute.Race == 2 ? "黑人" : attribute.Race == 3 ? "印度人" : "地球人").Append(",")
         .Append(attribute.Expression == 0 ? "正常" : attribute.Expression == 1 ? "微笑" : "大笑").Append(",")
         .Append(attribute.Gender == 0 ? "女" : attribute.Gender == 1 ? "男" : "婴儿").Append(",")
         .Append(attribute.Glasses == 0 ? "不戴眼镜" : attribute.Glasses == 1 ? "普通透明眼镜" : "太阳镜");
     }
     return(msg.ToString());
 }
    // Start is called before the first frame update
    void Start()
    {
        //render出來的結果會被寫在m_RTTarget中
        //m_RTTarget = new RenderTexture(m_RTSize.x, m_RTSize.y, 0, UnityEngine.Experimental.Rendering.GraphicsFormat.R8G8B8A8_SRGB);

        //開出材質空間
        m_RTTarget = new RenderTexture(m_RTSize.x, m_RTSize.y, 0, UnityEngine.Experimental.Rendering.GraphicsFormat.R8G8B8A8_UNorm);
        m_RTTarget.enableRandomWrite = true;
        m_RTTarget.Create();

        m_QuadMaterial.SetTexture("_MainTex", m_RTTarget);

        //init a buffer in cpu menory
        m_SimpleAccelerationStructureDataBuffer = new ComputeBuffer(512, System.Runtime.InteropServices.Marshal.SizeOf(typeof(SphereData)));
        SphereData Data = new SphereData();


        //lambert sphere
        Data.Center                      = new Vector3(-2.0f, -1.0f, 0.0f);
        Data.Radius                      = 0.8f;
        Data.MaterialType                = (int)MaterialType.MAT_METAL;
        Data.MaterialAlbedo              = new Vector3(0.9f, 0.9f, 0.9f);
        Data.MaterialData                = new Vector4(0.0f, 0.0f, 0.0f, 0.0f);
        m_SphereArray[m_NumSpheres]      = Data;
        m_SphereTimeOffset[m_NumSpheres] = UnityEngine.Random.Range(0, 100.0f);
        m_NumSpheres++;

        //set data in cpu  memory
        m_SimpleAccelerationStructureDataBuffer.SetData(m_SphereArray);

        //load obj
        m_VertexDataBuffer = new ComputeBuffer(m_Mesh.GetIndices(0).Length / 3, System.Runtime.InteropServices.Marshal.SizeOf(typeof(FaceAttribute)));
        FaceAttribute[] m_VertexData = new FaceAttribute[m_Mesh.GetIndices(0).Length / 3];
        //Debug.Log(m_Mesh.GetIndices(0).Length);
        for (int i = 0; i < m_Mesh.GetIndices(0).Length / 3; i++)
        {
            m_VertexData[i].v0 = m_Mesh.vertices[m_Mesh.GetIndices(0)[3 * i]];
            m_VertexData[i].v1 = m_Mesh.vertices[m_Mesh.GetIndices(0)[3 * i + 1]];
            m_VertexData[i].v2 = m_Mesh.vertices[m_Mesh.GetIndices(0)[3 * i + 2]];

            //m_VertexData[i].v0.y += 1.0f;
            //m_VertexData[i].v1.y += 1.0f;
            //m_VertexData[i].v2.y += 1.0f;

            Vector3 v0v1 = m_VertexData[i].v1 - m_VertexData[i].v0;
            Vector3 v0v2 = m_VertexData[i].v2 - m_VertexData[i].v0;
            Vector3 N    = Vector3.Normalize(Vector3.Cross(v0v1, v0v2)); // N
            m_VertexData[i].normal = N;


            m_VertexData[i].MaterialType   = (int)MaterialType.MAT_METAL;
            m_VertexData[i].MaterialAlbedo = new Vector3(0.9f, 0.9f, 0.9f);
            m_VertexData[i].MaterialData   = new Vector4(0.0f, 0.0f, 0.0f, 0.0f);


            //Debug.Log((m_VertexData[i].v0.x, m_VertexData[i].v0.y, m_VertexData[i].v0.z));
            //Debug.Log((m_VertexData[i].v1.x, m_VertexData[i].v1.y, m_VertexData[i].v1.z));
            //Debug.Log((m_VertexData[i].v2.x, m_VertexData[i].v2.y, m_VertexData[i].v2.z));
            //Debug.Log((m_VertexData[i].normal.x, m_VertexData[i].normal.y, m_VertexData[i].normal.z));
            //Debug.Log("---------------------------------------------------------------------------------");
        }


        AABB[] mainOBJ_aabb = new AABB[1];
        mainOBJ_aabb[0] = FindAABB(ref m_VertexData);
        Debug.Log(((mainOBJ_aabb[0].X_axis), (mainOBJ_aabb[0].Y_axis), (mainOBJ_aabb[0].Z_axis)));
        m_AABBDataBuffer = new ComputeBuffer(1, System.Runtime.InteropServices.Marshal.SizeOf(typeof(AABB)));
        m_AABBDataBuffer.SetData(mainOBJ_aabb);

        m_VertexDataBuffer.SetData(m_VertexData);
        float m_TriangleNum = m_Mesh.GetIndices(0).Length / 3;
        int   KernelHandle  = m_ComputeShader.FindKernel("CSMain");

        m_ComputeShader.SetBuffer(KernelHandle, "FaceAttrib", m_VertexDataBuffer);
        m_ComputeShader.SetBuffer(KernelHandle, "objAABB", m_AABBDataBuffer);
        m_ComputeShader.SetTexture(KernelHandle, "_SkyboxTexture", m_Skybox);
        m_ComputeShader.SetFloat("TriangleNum", m_TriangleNum);

        //procedural texture
        noiseTex = new Texture2D(100, 100);
        pix      = new Color[noiseTex.width * noiseTex.height];
        CalcNoise();
        m_ComputeShader.SetTexture(KernelHandle, "_ProceduralTexture", noiseTex);
    }