/** * 进行属性检测 */ 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)); })); }
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); }