示例#1
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>若失败,则返回结果 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]);
            }
        }
示例#2
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("人脸关键点获取失败");
            }
        }