イメージバッファにアクセスする - RGB8-

RGB8 は8bit、モノクロのフォーマットです。すべてのピクセルが1バイトで表されます。イメージバッファのピクセルは左から右へ、下から上へと組織されます。 つまり、イメージバッファの1バイトめが映像における1番下のラインの最初のピクセルに対応しているということです。

ピクセルデータの読み込み、書き込みの方法

画像取り込みデバイス、ビデオフォーマット、 画像データのカラーフォーマットを定義するMemBufferCollectionクラスライブラリリファレンス>クラス>MemBufferCollectionを持つFrameHandlerSinkクラスライブラリリファレンス>クラス>FrameHandlerSinkがセットアップされている必要があります。下記ではRGB8のピクセルデータにどようにアクセスし、操作するかを順番に説明しています。
まず最初に、イメージバッファ内には何もありませんので、画像をキャプチャしなければなりません。そのためにライブ表示を開始しGrabber::snapImagesクラスライブラリリファレンス>クラス>Grabber>Grabber::snapImages Methodをコールします。

バッファにアクセスする

次のコードは画像データへの1バイトのポインタを取得します。

// 画像データへのポインタを取得
BYTE* pbImgData = pActiveBuf->getPtr();

今回の例では、画像中の(左上から)最初の2ピクセル分の読み出した後、3ピクセル分を操作します。 先ほど説明したようにRGB 画像は下から上に保存されるため、pbImgDataはイメージの最後の行の最初のピクセルをポイントします。1行目の最初のピクセルにアクセスしたい場合には下記のようにして算出する必要があります。

RGB 画像は下から上に保存されるため、最初の行のインデックスはlines-1となります。

// 左上のピクセルのインデックスを算出
// 画像はイメージバッファ内に上下逆に保存されます
SIZE dim = pActiveBuf->getFrameType().dim;
int iOffsUpperLeft = (dim.cy-1) * dim.cx;

まず最初に、画像の高さと幅をピクセル数で取得します。そして左上のピクセルへのオフセットが計算されます。全てのピクセルのサイズは1バイトなので、このように計算することができます。

(Height-1) * Width

最初のピクセルのオフセットを取得したので読み出します。

printf( "\nImage buffer pixel format is eRGB8\n" );
printf( "Pixel 1: %d\n", pbImgData[iOffsUpperLeft  ] );
printf( "Pixel 2: %d\n", pbImgData[iOffsUpperLeft+1] );

画像データを操作する

ピクセルデータの読み込みを行うだけでなく、データを操作するという事も可能です。次のコードは左上にあるピクセルを黒に、それに続くピクセルをそれぞれグレー、白に設定します。この変更を加えた後、画像はBMPファイルとして保存されます。

// 最初の3つのピクセルを上書きしてディスクに画像を保存する
pbImgData[iOffsUpperLeft  ] = 0;    // 最初のピクセルを黒に
pbImgData[iOffsUpperLeft+1] = 128;    // 2番目のピクセルをグレーに
pbImgData[iOffsUpperLeft+2] = 255;    // 3番目のピクセルを白に

pActiveBuf->save( "RGB8.bmp" );

確認のために保存されたか画像の左上のピクセルを見てみましょう。このようになっているはずです。