9

我目前正在开发一个需要实时人脸检测的应用程序。现在我在应用程序中有 mlkit 库,我正在使用 firebase 人脸检测器。目前,每次我尝试从文件中检测人脸时都会产生错误:

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

至于实时部分,我尝试使用 Flutter 中的 RepaintBoundary 来获取相机小部件(几乎)每一帧的屏幕截图,并将其转换为二进制文件以进行人脸检测。但由于某种原因,每次我尝试截取相机小部件时,颤振都会崩溃。它适用于其他小部件。

在遇到这两个问题并花了很长时间试图解决它们之后,我一直在考虑用 android/iOS 本机代码来做应用程序的相机部分(我会用 OpenCV 来做这个,这样我就可以拥有真正的时间检测)。有没有办法可以使用平台通道在 kotlin 和 swift 中实现相机视图并将其导入到颤振小部件?还是有另一种更简单的方法来实现这一点?

4

2 回答 2

5

对于实时访问相机图像流,我在另一个问题中回答了如何快速访问您想要使用的相机帧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;
  }
}
于 2019-02-27T12:11:11.907 回答
0

我之前用 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. 然后通过Camera2AVFoundation进行 OpenCV 实时人脸检测。

除此之外,如果您想将 android 或 iOS 嵌入到 Flutter 应用程序中,我想您可以尝试新的AndroidViewUIKitView 。

于 2018-12-13T04:29:48.870 回答