FlutterはGoogleが開発したクロスプラットフォームのモバイルアプリケーション開発フレームワークです。Dartと呼ばれるオブジェクト指向プログラミング言語を使用しておりプログラムが開発しやすく、NULL安全な仕組みによってバグがでにくい構造となっています。また、豊富なウィジェットとUI機能を提供し、高速で美しいユーザーインターフェイスを構築できることが特徴です。
OpenCVは歴史のあるコンピュータビジョンライブラリで、画像処理やコンピュータビジョンのための様々なアルゴリズムを提供しています。画像や動画の処理、物体検出、顔認識、機械学習など、多岐にわたる機能を持っています。OpenCVは、C++で実装されており、Flutter同様、多くのプラットフォームで使用できるようになっています。
FlutterとOpenCVを組み合わせることで、Flutterで開発されたアプリケーションに画像処理やコンピュータビジョンの機能を追加することができます。あるいは調査・研究で使っているOpenCVを使ったライブラリに、使いやすいUIを付け加えることができます。
FlutterとOpenCVのどちらかを知っているが組み合わせて使ったことのない人、業務や研究で蓄積したC++のライブラリ資産をスマホのアプリに活かしたい人、Flutterを使っていて細かな画像処理をしたい人などが対象です。
本書全体で、Android、Windows、Linux環境で、FlutterとOpenCVを組み合わせたアプリの作成について流れが分かるように書いたつもりです。面倒なら5章だけ読んでいただいて、共有ライブラリの開発環境が整えられれば、この本の役目は果たせたんだなと思います。
開発環境のインストールなど、まったくの初心者向けの説明を大幅に省略したところがあるので、詳しくはそれぞれの解説書に当たってもらえればと思います。そのかわり、なるべく他の本に書いてないことを盛り込んでいます。
FlutterとOpenCVは違う言語で書かれたプログラムなので、FlutterからOpenCVを呼び出すには両方の橋渡しになるようなものが必要です。橋渡しの方法には次にあげるものがあります。
FlutterにOpenCVの特定の機能を追加するプラグインがあります。画像を反転、拡大縮小、白黒化するような定番の処理がしたいだけなら、Flutterの知識だけで簡単に使えます。しかしプラグインがサポートしていない独自の処理を行うことはできません。
FlutterからプラットフォームOSを呼び出す手段としてMethodChannelを使う方法もあります。データの転送にバイナリメッセージという形式を使うので、Cライブラリを直接呼び出すことはできません。関数の呼び出しはチャネルを開いてバイナリメッセージを送信する手続きとなります。呼び出しが並行処理となるので、インターフェースがやや複雑になります。
dartからCで書かれた外部関数を呼び出す関数を生成する方法です。関数が生成された後は通常の関数と同様に使えます。OpenCVを使う場合はプラットフォーム依存となる部分が少なくてすみます。
この本ではdart:ffiを使った方法について取り上げます。
dart:ffiはforeign function interface、すなわち外部関数インターフェースの略で、dartから外部のネイティブCライブラリをコールする仕組みを提供するライブラリです。DLLを文字通り動的に呼び出すことができます。DLLはCインターフェースであれば、どこで作ったものでもかまいません。WindowsやLinuxの環境では、別のプロジェクトで作成したDLLを指定して呼び出すことも可能です。
使用時のイメージは、左側dart部分がUI部分を担当し、dart:ffiを経由してDLLを呼び出しOpenCVで画像を処理するという流れです。OpenCVに限らずdart:ffiでC/C++のDLLを使うときは、表のUIはFlutter dartが担当して、裏の処理をdart:ffiで行うという使い方になると思います。