私は現在、リアルタイムの顔検出を必要とするアプリを開発しています。現在、アプリにmlkitライブラリがあり、Firebaseの顔検出器を使用しています。現時点では、ファイルから顔を検出しようとするたびにエラーが発生します。
DynamiteModule(13840): Local module descriptor class for com.google.Android.gms.vision.dynamite.face not found.
リアルタイム部分については、フラッターでRepaintBoundaryを使用して、カメラウィジェットの(ほぼ)すべてのフレームのスクリーンショットを取得し、顔検出用のバイナリファイルに変換してみました。しかし、何らかの理由で、カメラウィジェットのスクリーンショットを撮ろうとするたびにフラッターがクラッシュしました。他のウィジェットでも機能しました。
これらの問題の両方に遭遇し、それらを解決するためにかなりの時間を費やした後、私はAndroid/iOSネイティブコードでアプリのカメラ部分を実行することを考えていました(私は実際にできるようにOpenCVでこれを行います時間検出)。プラットフォームチャネルを使用してkotlinとSwiftにカメラビューを実装し、それをフラッターウィジェットにインポートする方法はありますか?またはこれを実装する別の簡単な方法はありますか?
カメラ画像ストリームへのリアルタイムアクセスについて、私は別の質問で答えました フラッターでカメラフレームにすばやくアクセスする方法 使用したい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;
}
}
私は以前にOpenCVでこれを行いましたが、私の解決策は次のとおりです。
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スキャナープラグイン を参照してください。
それ以外に、AndroidまたはiOSをFlutterに埋め込みたい場合は、新しい AndroidView または IKitView を試すことができると思いますアプリ。