web-dev-qa-db-ja.com

フラッターリアルタイム顔検出

私は現在、リアルタイムの顔検出を必要とするアプリを開発しています。現在、アプリにmlkitライブラリがあり、Firebaseの顔検出器を使用しています。現時点では、ファイルから顔を検出しようとするたびにエラーが発生します。

DynamiteModule(13840): Local module descriptor class for com.google.Android.gms.vision.dynamite.face not found.

リアルタイム部分については、フラッターでRepaintBoundaryを使用して、カメラウィジェットの(ほぼ)すべてのフレームのスクリーンショットを取得し、顔検出用のバイナリファイルに変換してみました。しかし、何らかの理由で、カメラウィジェットのスクリーンショットを撮ろうとするたびにフラッターがクラッシュしました。他のウィジェットでも機能しました。

これらの問題の両方に遭遇し、それらを解決するためにかなりの時間を費やした後、私はAndroid/iOSネイティブコードでアプリのカメラ部分を実行することを考えていました(私は実際にできるようにOpenCVでこれを行います時間検出)。プラットフォームチャネルを使用してkotlinとSwiftにカメラビューを実装し、それをフラッターウィジェットにインポートする方法はありますか?またはこれを実装する別の簡単な方法はありますか?

7
Ian Leshan

カメラ画像ストリームへのリアルタイムアクセスについて、私は別の質問で答えました フラッターでカメラフレームにすばやくアクセスする方法 使用したいCameraController#startImageStream

import 'package:camera/camera.Dart';
import 'package:flutter/foundation.Dart';
import 'package:flutter/material.Dart';

void main() => runApp(MaterialApp(home: _MyHomePage()));

class _MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<_MyHomePage> {
  dynamic _scanResults;
  CameraController _camera;

  bool _isDetecting = false;
  CameraLensDirection _direction = CameraLensDirection.back;

  @override
  void initState() {
    super.initState();
    _initializeCamera();
  }

  Future<CameraDescription> _getCamera(CameraLensDirection dir) async {
    return await availableCameras().then(
      (List<CameraDescription> cameras) => cameras.firstWhere(
            (CameraDescription camera) => camera.lensDirection == dir,
          ),
    );
  }

  void _initializeCamera() async {
    _camera = CameraController(
      await _getCamera(_direction),
      defaultTargetPlatform == TargetPlatform.iOS
          ? ResolutionPreset.low
          : ResolutionPreset.medium,
    );
    await _camera.initialize();
    _camera.startImageStream((CameraImage image) {
      if (_isDetecting) return;
      _isDetecting = true;
      try {
        // await doOpenCVDectionHere(image)
      } catch (e) {
        // await handleExepction(e)
      } finally {
        _isDetecting = false;
      }
    });
  }
  Widget build(BuildContext context) {
    return null;
  }
}
3
TruongSinh

私は以前にOpenCVでこれを行いましたが、私の解決策は次のとおりです。

  1. プラットフォームチャネルを介して、AndroidおよびiOSでそれぞれ新しいActivityまたはViewControllerを開始します。例:

class FaceScanPlugin(val activity: Activity) : MethodCallHandler, PluginRegistry.ActivityResultListener {

var result: Result? = null

companion object {
    @JvmStatic
    fun registerWith(registrar: Registrar): Unit {
        val channel = MethodChannel(registrar.messenger(), "com.example.facescan")
        val plugin = BarcodeScanPlugin(registrar.activity())
        channel.setMethodCallHandler(plugin)
        registrar.addActivityResultListener(plugin)
    }
}

override fun onMethodCall(call: MethodCall, result: Result): Unit {
    if (call.method.equals("scan")) {
        this.result = result
        showFaceScanView()
    } else {
        result.notImplemented()
    }
}

private fun showFaceScanView() {
    val intent = Intent(activity, FaceScannerActivity::class.Java)
    activity.startActivityForResult(intent, 100)
}

override fun onActivityResult(code: Int, resultCode: Int, data: Intent?): Boolean {
    if (code == 100) {
        if (resultCode == Activity.RESULT_OK) {
            return true
        }
    }
    return false
}
}

AndroidアクティビティまたはiOSビューに移動する方法については Flutter QRスキャナープラグイン を参照してください。

  1. 次に、 Camera2 および AVFoundation を介してOpenCVリアルタイム顔検出を実行します。

それ以外に、AndroidまたはiOSをFlutterに埋め込みたい場合は、新しい AndroidView または IKitView を試すことができると思いますアプリ。

0
Liew Jun Tung