7章OpenCVのファンクタ
7.1 「何かをする」オブジェクト
OpenCVライブラリが進化するにつれ、新しいオブジェクトが次々に導入されてきました。これらは、1つの関数に関連づけるには複雑すぎたり、複数の関数として実装するとライブラリの関数空間全体が乱雑になってしまったりするような機能をカプセル化したものです†1。
[†1] このようなオブジェクトの1つとして、前章ではcv::LineIterator
オブジェクトを簡単に説明しました。
このため、新しい機能がそれに関連する新しいオブジェクト型によって表現されることがよくあります。このオブジェクト型は、その機能を実行する「機械」であると考えられます。これらの機械のほとんどは、オーバーロードされたoperator()
を持っており、その場合は正式な関数オブジェクトあるいはファンクタになります。このようなプログラミング方法に慣れていない方に説明すると、「通常の」関数と大きく違うのは、関数オブジェクトは生成されるものであり、その内部に状態の情報を保持できるという点です。結果として、関数オブジェクトは必要であればどのようなデータや設定情報でも設定できます。そして、一般的なメンバー関数を通して、または(通常はオーバーロードされたoperator()
を通して†2)関数オブジェクト自身が関数として呼び出されることで、「頼まれ」てサービスを実行します。
[†2] ここで通常はと言ったのは、「通常、ユーザーが関数オブジェクトをプログラムするときには」という意味であって、「OpenCVライブラリにおいて通常は」という意味ではありません。OpenCVには、その設定情報を読み込むにはオーバーロードされたoperator()
を使い、そのオブジェクトの基本的なサービスを提供するには名前付きメンバー関数を使うという慣習があります。この慣習は一般にはあまり標準的なものではありませんが、OpenCVライブラリの中ではきわめてよく使われています。 ...
Get 詳解 OpenCV 3 ―コンピュータビジョンライブラリを使った画像処理・認識 now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.