/// <summary> /// 识别 <paramref name="bitmap"/> 中指定的人脸信息 <paramref name="info"/> 的关键点坐标。 /// <para> /// 当 <see cref="FaceType"/> <see langword="="/> <see cref="FaceType.Normal"/> 时, 需要模型:<see langword="face_landmarker_pts68.csta"/><br/> /// 当 <see cref="FaceType"/> <see langword="="/> <see cref="FaceType.Mask"/> 时, 需要模型:<see langword="face_landmarker_mask_pts5.csta"/><br/> /// 当 <see cref="FaceType"/> <see langword="="/> <see cref="FaceType.Light"/> 时, 需要模型:<see langword="face_landmarker_pts5.csta"/><br/> /// </para> /// </summary> /// <param name="bitmap">包含人脸的图片</param> /// <param name="info">指定的人脸信息</param> /// <returns>若失败,则返回结果 Length == 0</returns> public FaceMarkPoint[] FaceMark(Bitmap bitmap, FaceInfo info) { byte[] bgr = bitmap.To24BGRByteArray(out int width, out int height, out int channels); int size; if (Platform64) { size = ViewFacePlus64.FaceMarkSize((int)MarkType); } else { size = ViewFacePlus32.FaceMarkSize((int)MarkType); } if (size == -1) { return(new FaceMarkPoint[0]); } double[] _pointX = new double[size]; double[] _pointY = new double[size]; bool res; if (Platform64) { res = ViewFacePlus64.FaceMark(bgr, width, height, channels, info.Location.X, info.Location.Y, info.Location.Width, info.Location.Height, _pointX, _pointY, (int)MarkType); } else { res = ViewFacePlus32.FaceMark(bgr, width, height, channels, info.Location.X, info.Location.Y, info.Location.Width, info.Location.Height, _pointX, _pointY, (int)MarkType); } if (res) { List <FaceMarkPoint> points = new List <FaceMarkPoint>(); for (int i = 0; i < size; i++) { points.Add(new FaceMarkPoint() { X = _pointX[i], Y = _pointY[i] }); } return(points.ToArray()); } else { return(new FaceMarkPoint[0]); } }
/// <summary> /// 识别 <paramref name="bitmap"/> 中指定的人脸信息 <paramref name="info"/> 的关键点坐标。 /// <para> /// 当 <see cref="FaceType"/> <see langword="="/> <see cref="FaceType.Normal"/> 时, 需要模型:<see langword="face_landmarker_pts68.csta"/><br/> /// 当 <see cref="FaceType"/> <see langword="="/> <see cref="FaceType.Mask"/> 时, 需要模型:<see langword="face_landmarker_mask_pts5.csta"/><br/> /// 当 <see cref="FaceType"/> <see langword="="/> <see cref="FaceType.Light"/> 时, 需要模型:<see langword="face_landmarker_pts5.csta"/><br/> /// </para> /// </summary> /// <param name="bitmap">包含人脸的图片</param> /// <param name="info">指定的人脸信息</param> /// <returns></returns> public FaceMarkPoint[] FaceMark(Bitmap bitmap, FaceInfo info) { byte[] bgr = ImageSet.Get24BGRFromBitmap(bitmap, out int width, out int height, out int channels); int size; if (Platform64) { size = ViewFacePlus64.FaceMarkSize((int)MarkType); } else { size = ViewFacePlus32.FaceMarkSize((int)MarkType); } double[] _pointX = new double[size]; double[] _pointY = new double[size]; bool val; if (Platform64) { val = ViewFacePlus64.FaceMark(bgr, width, height, channels, info.Location.X, info.Location.Y, info.Location.Width, info.Location.Height, _pointX, _pointY, (int)MarkType); } else { val = ViewFacePlus32.FaceMark(bgr, width, height, channels, info.Location.X, info.Location.Y, info.Location.Width, info.Location.Height, _pointX, _pointY, (int)MarkType); } if (val) { List <FaceMarkPoint> points = new List <FaceMarkPoint>(); for (int i = 0; i < size; i++) { points.Add(new FaceMarkPoint() { X = _pointX[i], Y = _pointY[i] }); } return(points.ToArray()); } else { throw new Exception("人脸关键点获取失败"); } }