rushio-consulting / flutter_camera_ml_vision

A flutter widget that show the camera stream and allow ML vision recognition on it, it allow you to detect barcodes, labels, text, faces...
MIT License
278 stars 107 forks source link

Camera Preview Screenshot is not getting #132

Open shahryar-cmyk opened 3 years ago

shahryar-cmyk commented 3 years ago

I want to get the screenshot of the camera preview but don't want to store it locally in the gallery I want to store it in the temp folder. So, Here is the scenario of my app. 1- The Ml vision camera package of the flutter detects the face of the human. 2- Because the ml vision is not detecting the face properly So, my workaround to make an API request of the screenshot if the API response is good then go to the next screen. My scenario is working correctly. But the screenshot is saved on the gallery. So, you can say use RenderBondary but with this camera, the preview is not showing. This is the issue in GitHub also regarding this. If you have a workaround how can get this done without saving or complete the scenario of the app?

import 'dart:convert';
import 'dart:io';
import 'dart:typed_data';

import 'package:auto_route/auto_route.dart';
import 'package:esol/screens/home/home_page.dart';
import 'package:flutter/material.dart';

//Flutter Packages
import 'package:camera/camera.dart';
import 'package:firebase_ml_vision/firebase_ml_vision.dart';
import 'package:flutter_camera_ml_vision/flutter_camera_ml_vision.dart';

import 'package:esol/screens/routes.gr.dart';
import 'package:http/http.dart' as http;
import 'package:native_screenshot/native_screenshot.dart';
import 'package:shared_preferences/shared_preferences.dart';

class VeifyFaceDetect extends StatefulWidget {
  @override
  _VeifyFaceDetectState createState() => _VeifyFaceDetectState();
}

class _VeifyFaceDetectState extends State<VeifyFaceDetect> {
  // File _imageFile;

  List<Face> faces = [];
  final _scanKey = GlobalKey<CameraMlVisionState>();
  CameraLensDirection cameraLensDirection = CameraLensDirection.front;
  FaceDetector detector =
      FirebaseVision.instance.faceDetector(FaceDetectorOptions(
    enableClassification: true,
    enableTracking: true,
    enableLandmarks: true,
    mode: FaceDetectorMode.accurate,
  ));
  String detectString = 'No Face Found';

  Future<void> uploadData(
      {String base64Image,
      bool template,
      bool cropImage,
      bool faceAttributes,
      bool facialFeatures,
      bool icaoAttributes}) async {
    setState(() {
      detectString = 'Verifying Face';
    });
    final url = 'https://dot.innovatrics.com/core/api/v6/face/detect';
    final response = await http.post(
      url,
      headers: {'Content-Type': 'application/json'},
      body: json.encode(
        {
          'image': {
            "data": base64Image,
            "faceSizeRatio": {
              "min": 0.01,
              "max": 0.9,
            }
          },
          'template': template,
          'cropImage': cropImage,
          'faceAttributes': faceAttributes,
          'facialFeatures': facialFeatures,
          'icaoAttributes': icaoAttributes,
        },
      ),
    );

    if (response.statusCode == 200) {
      // setState(() {
      print("Here is the code");
      // });
      if (response.body.toString().contains('NO_FACE_DETECTED')) {
        setState(() {
          detectString = 'Move Face Closer';
        });
        print('This is the response ${response.body}');
      }
      if (!response.body.toString().contains('NO_FACE_DETECTED')) {
        print('This is the another response ${response.body}');
        // Navigator.of(context).pushNamed(Routes.homePage);
        SharedPreferences prefs = await SharedPreferences.getInstance();
        prefs.setString('data', "ok");
        Future.delayed(Duration(seconds: 2), () {
          Navigator.of(context).pop();
        });
        // Navigator.of(context).pop();
      }
    }
  }

  _takeScreenShot() async {
    final dataValue = await NativeScreenshot.takeScreenshot();
    if (dataValue != null) {
      var imageFile = File(dataValue);

      Uint8List byteFile = imageFile.readAsBytesSync();
      String base64Image = base64Encode(byteFile);
      uploadData(
          base64Image: base64Image,
          cropImage: true,
          faceAttributes: true,
          facialFeatures: true,
          icaoAttributes: true,
          template: true);
    }
  }

  @override
  Widget build(BuildContext context) {
    String layoutHeight = MediaQuery.of(context).size.height.toString();
    String layoutWidth = MediaQuery.of(context).size.width.toString();

    print('This is data String $detectString');
    print('This is the height of the page : $layoutHeight');
    return Scaffold(
      backgroundColor: Color.fromRGBO(0, 85, 255, 1),
      appBar: AppBar(
        elevation: 0.0,
        leading: IconButton(
          icon: Icon(Icons.arrow_back_ios),
          onPressed: () => Navigator.of(context).pop(),
        ),
        actions: [
          IconButton(
            icon: Icon(Icons.close),
            onPressed: () => Navigator.of(context).pop(),
          ),
        ],
      ),
      body: Stack(children: [
        Positioned(
          // bottom: 100,
          // right: 80,
          // top: 100,
          child: Align(
            alignment: Alignment.topCenter,
            child: Text(
              detectString,
              style: TextStyle(color: Colors.white, fontSize: 30),
            ),
          ),
        ),
        Center(
          child: Container(
            // height: MediaQuery.of(context).size.height / 3.2,
            // width: MediaQuery.of(context).size.width * 0.7,
            height: 300,
            width: 300,
            child: ClipOval(
              child: CameraMlVision<List<Face>>(
                key: _scanKey,
                cameraLensDirection: cameraLensDirection,
                detector: (FirebaseVisionImage image) {
                  return detector.processImage(image);
                },
                overlayBuilder: (c) {
                  return Text('');
                },
                onResult: (faces) {
                  if (faces == null || faces.isEmpty || !mounted) {
                    return;
                  }

                  setState(() {
                    faces = []..addAll(faces);
                    if (faces[0].rightEyeOpenProbability >= 0.9 &&
                        faces[0].leftEyeOpenProbability >= 0.9 &&
                        faces[0].rightEyeOpenProbability >= 0.5 &&
                        faces[0].leftEyeOpenProbability >= 0.5 &&
                        faces[0].boundingBox.isEmpty == false) {
                      detectString = 'Face detected';
                      _takeScreenShot();
                    }
                    if (faces[0].rightEyeOpenProbability <= 0.5 &&
                        faces[0].leftEyeOpenProbability <= 0.5) {
                      detectString = 'Open your Eyes';
                    }
                  });
                },
                onDispose: () {
                  detector.close();
                },
              ),
            ),
          ),
        ),
      ]),
    );
  }
}