// For each face, we create a HightlightView for it.
        private void HandleFace(FaceDetector.Face f)
        {
            EmCropImage eci = this.ECI;

            if (eci == null)
            {
                return;
            }

            PointF midPoint = new PointF();

            int r = ((int)(f.EyesDistance() * this.Scale)) * 2;

            f.GetMidPoint(midPoint);
            midPoint.X *= this.Scale;
            midPoint.Y *= this.Scale;

            int midX = (int)midPoint.X;
            int midY = (int)midPoint.Y;

            EmHighlightView hv = new EmHighlightView(eci.ImageView, eci.MOutlineColor, eci.MOutlineCircleColor);

            int width  = eci.Bitmap.Width;
            int height = eci.Bitmap.Height;

            Rect imageRect = new Rect(0, 0, width, height);

            RectF faceRect = new RectF(midX, midY, midX, midY);

            faceRect.Inset(-r, -r);
            if (faceRect.Left < 0)
            {
                faceRect.Inset(-faceRect.Left, -faceRect.Left);
            }

            if (faceRect.Top < 0)
            {
                faceRect.Inset(-faceRect.Top, -faceRect.Top);
            }

            if (faceRect.Right > imageRect.Right)
            {
                faceRect.Inset(faceRect.Right - imageRect.Right, faceRect.Right - imageRect.Right);
            }

            if (faceRect.Bottom > imageRect.Bottom)
            {
                faceRect.Inset(faceRect.Bottom - imageRect.Bottom, faceRect.Bottom - imageRect.Bottom);
            }

            hv.Setup(this.MImageMatrix, imageRect, faceRect, eci.CircleCropping, eci.AspectX != 0 && eci.AspectY != 0);

            eci.ImageView.Add(hv);
        }
Esempio n. 2
0
        /// <summary>
        ///     Детектирование лиц и прорисовка квадрата на каждом из лиц.
        /// </summary>
        private void DetectFaces()
        {
            // Проверка на получения картинки
            if (null != cameraBitmap)
            {
                //Получаем ширину
                var width = cameraBitmap.Width;
                //Получаем высоту
                var height = cameraBitmap.Height;
                //Создаем экземпляр класса нативных библиотек распознования от Android
                var detector = new FaceDetector(width, height, MaxFaces);
                //Создаем массив лиц
                var faces = new FaceDetector.Face[MaxFaces];
                //Создаем основной Bitmap
                var bitmap565   = Bitmap.CreateBitmap(width, height, Bitmap.Config.Rgb565);
                var ditherPaint = new Paint();
                //Рамка захвата
                var drawPaint = new Paint();
                ditherPaint.Dither = true;
                //Устанавливаем цвет квадрата, штриховку, толщину
                drawPaint.Color = Color.Blue;
                drawPaint.SetStyle(Paint.Style.Stroke);
                drawPaint.StrokeWidth = 2;
                //Создаем холст и устанавливаем
                var canvas = new Canvas();
                canvas.SetBitmap(bitmap565);
                canvas.DrawBitmap(cameraBitmap, 0, 0, ditherPaint);
                //Получаем количество лиц
                var facesFound = detector.FindFaces(bitmap565, faces);
                //Средняя точка
                var midPoint = new PointF();
                //Расстояние до глаз
                float eyeDistance;
                float confidence;
                //Печать в консоль для тестирования приложения
                Console.WriteLine($"Найдено лиц: {facesFound}");
                //Проверка, что найдено хоть одно лицо
                if (facesFound > 0)
                {
                    for (var index = 0; index < facesFound; ++index)
                    {
                        faces[index].GetMidPoint(midPoint);
                        eyeDistance = faces[index].EyesDistance();
                        confidence  = faces[index].Confidence();
                        //Печатаем для отладки в консоль
                        Console.WriteLine($"Коэфициент доверия: {confidence} Расстояние до глаз: {eyeDistance}" +
                                          $"Средняя точка: ( X: {midPoint.X} Y: {midPoint.Y} )");


                        //Передаем в TextView значение расстояния до лица
                        ((TextView)FindViewById(Resource.Id.tvDistanceToCamera)).Text = $"{eyeDistance:0.00} см";

                        //Рисуем квадрат
                        canvas.DrawRect((int)midPoint.X - eyeDistance,
                                        (int)midPoint.Y - eyeDistance,
                                        (int)midPoint.X + eyeDistance,
                                        (int)midPoint.Y + eyeDistance, drawPaint);
                    }
                }

                var imageView = (ImageView)FindViewById(Resource.Id.image_view);
                imageView.SetImageBitmap(bitmap565);
            }
        }