/// <summary> /// 人脸3D角度检测 /// </summary> /// <param name="pEngine">引擎Handle</param> /// <param name="imageInfo">图像数据</param> /// <param name="multiFaceInfo">检测的人脸信息</param> /// <returns>人脸3D角度检测结果结构体</returns> public static Face3DAngle Face3DAngleDetection(FaceEngine faceEngine, Image image, MultiFaceInfo multiFaceInfo, out int retCode) { retCode = -1; Face3DAngle face3DAngle = new Face3DAngle(); try { if (multiFaceInfo.faceNum <= 0) { return(face3DAngle); } //人脸信息检测 retCode = faceEngine.ASFProcessEx(image, multiFaceInfo, FaceEngineMask.ASF_FACE3DANGLE); if (retCode == 0) { //获取人脸3D角度 retCode = faceEngine.ASFGetFace3DAngle(out face3DAngle); } } catch (Exception ex) { LogUtil.LogInfo(typeof(FaceUtil), ex); } return(face3DAngle); }
/// <summary> /// 获取3D角度信息 /// </summary> /// <param name="pEngine">引擎handle</param> /// <param name="faceAngle">3D角度信息结果</param> /// <returns>返回0表示正常;返回负数请根据ErrorCodeUtil类注释查看;其他值请在官网-帮助中心查询</returns> public int ASFGetFace3DAngle(out Face3DAngle faceAngle) { faceAngle = new Face3DAngle(); IntPtr pFaceAngle = MemoryUtil.Malloc(MemoryUtil.SizeOf <ASF_Face3DAngle>()); //调用SDK接口 int retCode = ASFFunctions.ASFGetFace3DAngle(pEngine, pFaceAngle); if (retCode != 0) { MemoryUtil.Free(pFaceAngle); return(retCode); } //转化结果 ASF_Face3DAngle asfFaceAngle = MemoryUtil.PtrToStructure <ASF_Face3DAngle>(pFaceAngle); faceAngle.num = asfFaceAngle.num; if (faceAngle.num > 0) { faceAngle.pitch = new float[faceAngle.num]; Marshal.Copy(asfFaceAngle.pitch, faceAngle.pitch, 0, faceAngle.num); faceAngle.roll = new float[faceAngle.num]; Marshal.Copy(asfFaceAngle.roll, faceAngle.roll, 0, faceAngle.num); faceAngle.yaw = new float[faceAngle.num]; Marshal.Copy(asfFaceAngle.yaw, faceAngle.yaw, 0, faceAngle.num); faceAngle.status = new int[faceAngle.num]; Marshal.Copy(asfFaceAngle.status, faceAngle.status, 0, faceAngle.num); } MemoryUtil.FreeArray(pFaceAngle); return(retCode); }
/// <summary> /// 获取3D角度信息。 /// </summary> /// <returns></returns> public List <Face3DAngle> GetFace3DAngle() { var result = ASFFunctions.ASFGetFace3DAngle(EngineHandler, out ASF_Face3DAngle face3DAngle); if (result == MResult.MOK) { var Face3DAngles = new List <Face3DAngle>(); float[] _roll = new float[face3DAngle.num]; float[] _yaw = new float[face3DAngle.num]; float[] _pitch = new float[face3DAngle.num]; int[] _status = new int[face3DAngle.num]; Marshal.Copy(face3DAngle.roll, _roll, 0, face3DAngle.num); Marshal.Copy(face3DAngle.yaw, _yaw, 0, face3DAngle.num); Marshal.Copy(face3DAngle.pitch, _pitch, 0, face3DAngle.num); Marshal.Copy(face3DAngle.status, _status, 0, face3DAngle.num); for (int i = 0; i < face3DAngle.num; i++) { var angle = new Face3DAngle { pitch = _pitch[i], roll = _roll[i], status = _status[i], yaw = _yaw[i] }; Face3DAngles.Add(angle); } return(Face3DAngles); } return(null); }