// 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); }
/// <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); } }