イメージバッファにアクセスする - Y16 -
Y16は16bitのグレイスケールフォーマットです。イメージバッファのピクセルは左から右へ、上から下へと組織されます。
メモリ配置
すべてのピクセルはlittele-endianで16bit integer値で構成され保持されます。
いくつかのセンサーは10bitや12bitのみサポートしています。この場合、使用されないbitについては気にかけられません(内容は保証されません)。
ピクセルデータの読み込み、書き込みの方法
画像取り込みデバイス、ビデオフォーマット、 画像データのカラーフォーマットを定義するMemBufferCollectionクラスライブラリリファレンス>クラス>MemBufferCollectionを持つFrameHandlerSinkクラスライブラリリファレンス>クラス>FrameHandlerSinkがセットアップされている必要があります。下記ではY16のピクセルデータにどようにアクセスし、操作するかを順番に説明しています。
まず最初に、イメージバッファ内には何もありませんので、画像をキャプチャしなければなりません。そのためにライブ表示を開始しGrabber::snapImagesクラスライブラリリファレンス>クラス>Grabber>Grabber::snapImages Methodをコールします。
バッファにアクセスする
次のコードは画像データへのポインタを取得します。getPtr()はunsigned __int16ポインタに型キャストされる1バイトのポインタを返すことに注目してください。Y16は16ビットのフォーマットであるためこれによってピクセルデータへのアクセスが容易になります。
// Y16ではイメージは上から順に保存されるので、左上のピクセルがバイト0となります。
// 1つのピクセルを2バイトで表現します。
unsigned __int16* pImgData = (unsigned __int16*)pActiveBuf->getPtr();
今回の例では、画像中の(左上から)最初のピクセルを読み出した後、3ピクセル分を操作したいと思います。 画像は左から右に、上から下に保存されるため、pImgDataはイメージの最後の行の最初のバイトをポイントします。
// Y16ピクセル値はunsigned 16-bit integerにマップされます。
unsigned __int16 val0 = pImgData[0];
unsigned __int16 val1 = pImgData[1];
printf( "\nImage buffer pixel format is eY16\n" );
printf( "Pixel 1 (Y16): %d\n", val0 );
printf( "Pixel 2 (Y16): %d\n", val1 );
画像データを操作する
では左上のピクセルからブラック、グレー、ホワイトの順に設定しましょう。
pImgData[0] = 0; // 最初のピクセルをブラックに
pImgData[1] = 32768; // 2番目のピクセルをグレーに
pImgData[2] = 65535; // 3番目のピクセルをホワイトに
// バッファをTIFFとして保存し他のソフトウェアで見ることができるようにする
saveToFileTIFF( *pActiveBuf, "Y16.tiff" );
確認のために保存されたか画像の左上のピクセルを見てみましょう。このようになっているはずです。