Sumber : https://github.com/piyushsinha24/Face-Detector?fbclid=IwAR2tN1g041Ty9yIBh-mGxmvM6V1HAGUEhZlN2vXxzJHqftATo2WV_QPfFAU#face-detection-using-firebase-ml-kit
Add Package in pubspec.yaml
image_picker: ^0.6.1+4
firebase_ml_vision: ^0.9.2+1
Add depedencies in build.gradle
dependencies {
api 'com.google.firebase:firebase-ml-vision-face-model:17.0.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
}
change main.dart
import 'package:flutter/material.dart';
//pages import
import 'face_detect.dart';
void main() => runApp(
MaterialApp(
title: 'Face Detector',
debugShowCheckedModeBanner: false,
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: FaceDetect(),
),
);
Add File FaceDetect.dart
import 'package:flutter/material.dart';
import 'dart:io';
import 'dart:ui' as ui;
import 'package:firebase_ml_vision/firebase_ml_vision.dart';
import 'package:image_picker/image_picker.dart';
class FaceDetect extends StatefulWidget {
@override
_FaceDetectState createState() => _FaceDetectState();
}
class _FaceDetectState extends State<FaceDetect> {
File _imageFile;
List<Face> _faces;
bool isLoading = false;
ui.Image _image;
Future getImage(bool isCamera) async {
File image;
if (isCamera) {
image = await ImagePicker.pickImage(source: ImageSource.camera);
} else {
image = await ImagePicker.pickImage(source: ImageSource.gallery);
}
setState(() {
_imageFile = image;
isLoading=true;
});
detectFaces(_imageFile);
}
detectFaces(File imageFile) async {
final image = FirebaseVisionImage.fromFile(imageFile);
final faceDetector = FirebaseVision.instance.faceDetector();
List<Face> faces = await faceDetector.processImage(image);
if (mounted) {
setState(() {
_imageFile = imageFile;
_faces = faces;
_loadImage(imageFile);
});
}
}
_loadImage(File file) async {
final data = await file.readAsBytes();
await decodeImageFromList(data).then(
(value) => setState(() {
_image = value;
isLoading = false;
}),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text("Face Detector"),
),
body: isLoading
? Center(child: CircularProgressIndicator())
: (_imageFile == null)
? Center(child: Text('No image selected'))
: Center(
child: Column(
children: <Widget>[
FittedBox(
child: SizedBox(
width: _image.width.toDouble(),
height: _image.height.toDouble(),
child: CustomPaint(
painter: FacePainter(_image, _faces),
),
),
),
],
),
),
floatingActionButton: Column(
mainAxisSize: MainAxisSize.min,
children: <Widget>[
FloatingActionButton(
heroTag: null,
onPressed:(){
getImage(true);
},
tooltip: 'Camera',
child: Icon(Icons.add_a_photo),
),
SizedBox(
height: 22.0,
),
FloatingActionButton(
heroTag: null,
onPressed:(){
getImage(false);
},
tooltip: 'Gallery',
child: Icon(Icons.folder),
),
],
),
);
}
}
class FacePainter extends CustomPainter {
final ui.Image image;
final List<Face> faces;
final List<Rect> rects = [];
FacePainter(this.image, this.faces) {
for (var i = 0; i < faces.length; i++) {
rects.add(faces[i].boundingBox);
}
}
@override
void paint(ui.Canvas canvas, ui.Size size) {
final Paint paint = Paint()
..style = PaintingStyle.stroke
..strokeWidth = 15.0
..color = Colors.yellow;
canvas.drawImage(image, Offset.zero, Paint());
for (var i = 0; i < faces.length; i++) {
canvas.drawRect(rects[i], paint);
}
}
@override
bool shouldRepaint(FacePainter oldDelegate) {
return image != oldDelegate.image || faces != oldDelegate.faces;
}
}