cv::WImage – OpenCV 1.1

new C++ template image classes contributed by Daniel Filip (Google inc.).

ここでは紹介程度に。
OpenCV 1.1ではWImageというIplImageのラッパークラスが用意されています。
(‘W’はwrapperの意味で付けられたようです)
このWImageクラスは以下のようにテンプレートクラスとして宣言されています。

WImageはスーパークラス、WImageBufferWImageView はそのサブクラスになっています。
ここから typedef WImage<uchar> WImage_b; のようなtypedefが50行ほど続きます。

ここでピクセルデータへの直接アクセス IplImage(opencv.jp)のコードをWImageクラスを使って書き換えます。
(実際にはそのサブクラスであるWImageBufferクラスを利用)

07行目の WImageBuffer3_b は WImageBufferC<uchar, 3> をtypedefしたものです。
このように、WImageBuffer[チャンネル数]_[ビット深度] という風に宣言します。
例えば32ビット浮動小数点型1チャンネル画像の場合は WImageBuffer1_f のように書きます。
(CV_32FC1 のようなマクロとチャンネル数・ビット深度の指定順序が逆)

11行目の void SetIpl(IplImage* image) でIplImage(protectedメンバ)に画像データをセットします。
また、領域確保をする場合は void Allocate(int width, int height) を使います。(ステレオ画像処理参照)
(引数にCvSizeを取ってくれないのは少し残念;)

13,14行目の img.Width(), img.Height()はIplImageのwidth, heightを取得するアクセサです。
この他にも Channels() や Depth() などが用意されています。

15行目以降の img(x,y) という書式。これは座標(x,y)の最初のチャンネルへのポインタを返します。
これは以下のように () 演算子のオーバーロードによって実現されています。
画像データへのアクセス部分はよく見慣れたコードですね。

実は今回のサンプルではこのクラスの便利な部分をほとんど紹介できていません;
着目領域での処理等はWImageViewクラスを利用すれば簡潔に書けるのでそれについてはいずれ。

あわせて読む:

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です