new C++ template image classes contributed by Daniel Filip (Google inc.).
ここでは紹介程度に。
OpenCV 1.1ではWImageというIplImageのラッパークラスが用意されています。
(‘W’はwrapperの意味で付けられたようです)
このWImageクラスは以下のようにテンプレートクラスとして宣言されています。
[csharp]
// cvwimage.h 109行目?
template
template
template
template
template
template
[/csharp]
WImageはスーパークラス、WImageBuffer と WImageView はそのサブクラスになっています。
ここから typedef WImage<uchar> WImage_b; のようなtypedefが50行ほど続きます。
ここでピクセルデータへの直接アクセス IplImage(opencv.jp)のコードをWImageクラスを使って書き換えます。
(実際にはそのサブクラスであるWImageBufferクラスを利用)
[csharp]
#include
#include
#include
int main(int argc, char **argv) {
// 名前空間は cv
cv::WImageBuffer3_b img; // 8ビット3チャンネル画像
uchar p[3];
if(argc != 2) return -1;
img.SetIpl(cvLoadImage(argv[1], CV_LOAD_IMAGE_COLOR));
for(int y=0; y
(引数にCvSizeを取ってくれないのは少し残念;)
13,14行目の img.Width(), img.Height()はIplImageのwidth, heightを取得するアクセサです。
この他にも Channels() や Depth() などが用意されています。
15行目以降の img(x,y) という書式。これは座標(x,y)の最初のチャンネルへのポインタを返します。
これは以下のように () 演算子のオーバーロードによって実現されています。
画像データへのアクセス部分はよく見慣れたコードですね。
[csharp]
// Pixel accessors which returns a pointer to the start of the channel
inline T* operator() (int c, int r) {
return reinterpret_cast
c*Channels();
}
inline const T* operator() (int c, int r) const {
return reinterpret_cast
c*Channels();
}
[/csharp]
実は今回のサンプルではこのクラスの便利な部分をほとんど紹介できていません;
着目領域での処理等はWImageViewクラスを利用すれば簡潔に書けるのでそれについてはいずれ。