From e379e5e78d3fc8c6c0463e5a15bd2624583242ab Mon Sep 17 00:00:00 2001 From: SKGEzhil Date: Wed, 12 Feb 2025 00:49:06 +0530 Subject: [PATCH] feat: added face detection --- frontend/lib/screens/face_upload_screen.dart | 66 ++++++++++++++++---- 1 file changed, 54 insertions(+), 12 deletions(-) diff --git a/frontend/lib/screens/face_upload_screen.dart b/frontend/lib/screens/face_upload_screen.dart index 153c2a10..cf583e9f 100644 --- a/frontend/lib/screens/face_upload_screen.dart +++ b/frontend/lib/screens/face_upload_screen.dart @@ -1,7 +1,9 @@ import 'dart:io'; +import 'dart:math'; import 'package:dashbaord/services/api_service.dart'; import 'package:flutter/material.dart'; import 'package:camera/camera.dart'; +import 'package:google_mlkit_face_detection/google_mlkit_face_detection.dart'; import 'package:http/http.dart' as http; import 'package:async/async.dart'; import 'dart:convert'; @@ -17,6 +19,10 @@ class _FaceUploadScreenState extends State { XFile? _capturedImage; List? _cameras; int _selectedCameraIndex = 0; + final FaceDetector _faceDetector = FaceDetector( + options: FaceDetectorOptions(enableContours: false, enableLandmarks: false), + ); + bool _isFaceDetected = false; @override void initState() { @@ -27,7 +33,8 @@ class _FaceUploadScreenState extends State { void _initializeCamera() async { _cameras = await availableCameras(); if (_cameras != null && _cameras!.isNotEmpty) { - _cameraController = CameraController(_cameras![_selectedCameraIndex], ResolutionPreset.medium); + _cameraController = + CameraController(_cameras![_selectedCameraIndex], ResolutionPreset.medium); await _cameraController!.initialize(); setState(() {}); } @@ -48,15 +55,41 @@ class _FaceUploadScreenState extends State { Future _capturePhoto() async { if (_cameraController != null && _cameraController!.value.isInitialized) { XFile image = await _cameraController!.takePicture(); - setState(() { - _capturedImage = image; - }); + await _detectFaces(image); + } + } + + Future _detectFaces(XFile image) async { + final inputImage = InputImage.fromFilePath(image.path); + final List faces = await _faceDetector.processImage(inputImage); + + setState(() { + _capturedImage = image; + _isFaceDetected = faces.isNotEmpty; + }); + + if (faces.isEmpty) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text("No face detected! Please try again.")), + ); + } + } + + Future _uploadPhoto() async { + if (_capturedImage != null && _isFaceDetected) { + print("UPLOADING"); + ApiServices().uploadPhoto(_capturedImage); + } else { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar(content: Text("No face detected! Cannot upload.")), + ); } } @override void dispose() { _disposeCamera(); + _faceDetector.close(); super.dispose(); } @@ -76,6 +109,7 @@ class _FaceUploadScreenState extends State { if (_capturedImage != null) { setState(() { _capturedImage = null; + _isFaceDetected = false; _initializeCamera(); }); } else { @@ -84,7 +118,9 @@ class _FaceUploadScreenState extends State { }); } }, - child: Text(_capturedImage != null ? 'Take Again' : (_isCameraOpen ? 'Close Camera' : 'Take Photo')), + child: Text(_capturedImage != null + ? 'Take Again' + : (_isCameraOpen ? 'Close Camera' : 'Take Photo')), ), SizedBox(width: 10), if (_isCameraOpen && _capturedImage == null) @@ -103,7 +139,9 @@ class _FaceUploadScreenState extends State { width: 300, height: 300, child: _capturedImage == null - ? (_isCameraOpen && _cameraController != null && _cameraController!.value.isInitialized + ? (_isCameraOpen && + _cameraController != null && + _cameraController!.value.isInitialized ? ClipRRect( borderRadius: BorderRadius.circular(15), child: CameraPreview(_cameraController!), @@ -111,7 +149,8 @@ class _FaceUploadScreenState extends State { : Container()) : ClipRRect( borderRadius: BorderRadius.circular(15), - child: Image.file(File(_capturedImage!.path), fit: BoxFit.cover), + child: Image.file(File(_capturedImage!.path), + fit: BoxFit.cover), ), ), if (_isCameraOpen && _capturedImage == null) @@ -128,11 +167,14 @@ class _FaceUploadScreenState extends State { Column( children: [ SizedBox(height: 10), - ElevatedButton( - onPressed: () { - ApiServices().uploadPhoto(_capturedImage); - }, + _isFaceDetected + ? ElevatedButton( + onPressed: _uploadPhoto, child: Text('Upload'), + ) + : Text( + "No face detected. Retake the photo!", + style: TextStyle(color: Colors.red), ), ], ), @@ -141,4 +183,4 @@ class _FaceUploadScreenState extends State { ), ); } -} +} \ No newline at end of file