はじめに
OpenCV Graph API(G-API)は、通常の画像処理を高速かつ移植性の高いものにすることを目的とした新しいOpenCVモジュールである。この2つの目標は、グラフベースの新しい実行モデルを導入することで達成される。
G-APIはOpenCVの特殊なモジュールである。他の主要モジュールの大半とは対照的に、これは特定のCVアルゴリズムというよりもフレームワークとして機能する。G-APIはCV処理を定義し、それを用いて(式の形で)グラフを構築し、最終的に特定のバックエンド向けに処理を実装・実行する手段を提供する。
- 覚え書き
- G-APIは新しいモジュールであり、現在も活発に開発が進められている。現時点ではAPIは流動的で、将来的に互換性を損なう小規模な変更が加えられる可能性がある。
目次
G-APIのドキュメントは以下の章で構成されている:
なぜGraph APIなのか?
G-APIの背景にある動機とその目標。
高レベル設計の概要
G-APIアーキテクチャと主要な内部コンポーネントの全体的な概要。
Kernel API
G-APIに新しい処理を導入し、各種バックエンド向けに実装する方法を学ぶ。
実装の詳細
貢献したい人のための、G-APIの低レベルな実装の詳細。
- API Reference: functions and classes
APIの例
G-APIパイプラインの非常に基本的な例を以下に示す:
int main(
int argc,
char *argv[])
{
if (argc > 1) cap.
open(argv[1]);
do
{
ac.apply(input_frame, output_frame);
return 0;
}
GComputation class represents a captured computation graph. GComputation objects form boundaries for ...
Definition gcomputation.hpp:121
GMat class represents image or tensor data in the graph.
Definition gmat.hpp:68
Comma-separated Matrix Initializer.
Definition mat.hpp:964
Template class for specifying the size of an image or rectangle.
Definition types.hpp:338
Class for video capturing from video files, image sequences or cameras.
Definition videoio.hpp:790
virtual bool read(OutputArray image)
Grabs, decodes and returns the next video frame.
virtual bool open(const String &filename, int apiPreference=CAP_ANY)
Opens a video file or a capturing device or an IP video stream for video capturing.
virtual bool isOpened() const
Returns true if video capturing has been initialized already.
#define CV_Assert(expr)
Checks a condition at runtime and throws exception if it fails.
Definition exception.hpp:198
GMat BGR2Gray(const GMat &src)
Converts an image from BGR color space to gray-scaled.
GMat Canny(const GMat &image, double threshold1, double threshold2, int apertureSize=3, bool L2gradient=false)
Finds edges in an image using the Canny algorithm.
GMat blur(const GMat &src, const Size &ksize, const Point &anchor=Point(-1,-1), int borderType=BORDER_DEFAULT, const Scalar &borderValue=Scalar(0))
Blurs an image using the normalized box filter.
void imshow(const String &winname, InputArray mat)
Displays an image in the specified window.
int waitKey(int delay=0)
Waits for a pressed key.
int main(int argc, char *argv[])
Definition highgui_qt.cpp:3
G-APIは独立したOpenCVモジュールであるため、そのヘッダファイルは明示的にインクルードする必要がある。main() の最初の4行は、OpenCVの標準的なビデオキャプチャオブジェクトを生成・初期化する。これは接続されたカメラまたは指定されたファイルから動画フレームを取得する。
次にG-APIパイプラインが構築される。実際には、これは cv::GMat データに対する一連のG-API処理呼び出しである。G-APIの重要な点は、このコードブロックが単なる処理の宣言であり、処理そのものではないということである。この時点では何の処理も行われず、G-APIはどの処理がパイプラインを構成し、それらがどのように接続されているかを追跡するだけである。G-APIのデータオブジェクト(ここでは cv::GMat)は、処理同士を接続するために使われる。in は計算の起点であることを示す空の cv::GMat である。
G-APIコードが記述された後、それは cv::GComputation オブジェクトのインスタンス化とともに呼び出しグラフに取り込まれる。このオブジェクトは入出力データの参照(この例ではそれぞれ in と out の cv::GMat オブジェクト)を引数として受け取り、in と out の間のすべてのデータフローに基づいて呼び出しグラフを再構築する。
cv::GComputation は、どの演算で計算が構成されるかをキャプチャするだけの軽量なオブジェクトである。しかし、計算の実行にも利用できる。次の処理ループでは、キャプチャした各フレーム(cv::Mat input_frame)がcv::GComputation::apply()に渡される。
Example pipeline running on sample video 'vtest.avi'
cv::GComputation::apply() は可変個の引数を受け取る多態的なメソッドである。この計算は1入力・1出力で定義されているため、入力データを渡して出力データを得るための特別なオーバーロードである cv::GComputation::apply() が使われる。
内部的には、cv::GComputation::apply() は、与えられた入力引数に対してキャプチャされたグラフをコンパイルし、コンパイルされたグラフをただちにデータ上で実行する。
この例からは、いくつかの重要な概念を読み取ることができる:
- グラフの宣言とグラフの実行は別個のステップである;
- グラフは一連のG-API式から暗黙的に構築される;
- G-APIは関数的な呼び出しをサポートする – 例えば cv::gapi::resize() や、ビット単位のORを計算するために使われる operator|() などの演算子;
- G-APIの構文は純粋に見えることを目指している。グラフ内のすべての処理呼び出しは新しい結果を生み出し、こうして有向非巡回グラフ(DAG)を形成する;
- グラフの宣言はいかなるデータにも束縛されない。実際のデータオブジェクト(cv::Mat)が登場するのは、グラフが既に宣言された後である。
各種のG-API機能や概念についてさらに学ぶには、チュートリアルおよび移植例 を参照のこと。