イメージバッファにアクセスする - YGB0 -
YGB0 は10bit 、モノクロのフォーマットです。全てのピクセルが2バイトで表されます。2バイト=16bitのうち10bitのみが画像の情報を含み、残りの6bitは使用されません。イメージバッファのピクセルは左から右へ、上から下へと組織されます。
メモリーレイアウト
上の図の通り、low byte が2から9までのビットを持ち、0と1のビットはhigh byteに格納されています。イメージバッファの16ビットピクセルを16ビット値(0~1023)に変換し画像処理に利用するにはバイトのスワップ処理および右シフトを行う必要があります。 変換の方法については以下の通りとなります。
unsigned __int16 YGB0PixelFromInt16Value( unsigned __int16 value )
{
return byteSwap( value << 6 );
}
unsigned __int16 Int16ValueFromYGB0Pixel( unsigned __int16 pixel )
{
return byteSwap( pixel ) >> 6;
}
関数Int16ValueFromYGB0Pixelがイメージバッファより16ビットのワードを取り出し、ピクセルの論理輝度値を0~1023で表せるように変換します。
YGB0PixelFromInt16Valueはその逆の処理を行うもので、輝度値をイメージバッファに格納可能な数字に変換します。
その関数は以下のようにして実装されるbyteSwap関数に依存します。
unsigned__int16 byteSwap( unsigned __int16 x )
{
BYTE* p = (BYTE*)&x;
return ((unsigned int)p[0] << 8) | p[1];
}
ピクセルデータの読み込み、書き込みの方法
画像取り込みデバイス、ビデオフォーマット、 画像データのカラーフォーマットを定義するMemBufferCollectionクラスライブラリリファレンス>クラス>MemBufferCollectionを持つFrameHandlerSinkクラスライブラリリファレンス>クラス>FrameHandlerSinkがセットアップされている必要があります。下記ではUYVYのピクセルデータにどようにアクセスし、操作するかを順番に説明しています。
まず最初に、イメージバッファ内には何もありませんので、画像をキャプチャしなければなりません。そのためにライブ表示を開始しGrabber::snapImagesクラスライブラリリファレンス>クラス>Grabber>Grabber::snapImages Methodをコールします。
バッファにアクセスする
次のコードは画像データへのポインタを取得します。getPtr()はunsigned __int16ポインタに型キャストされる1バイトのポインタを返すことに注目してください。YGB0は16ビットのフォーマットであるためこれによってピクセルデータへのアクセスが容易になります。
// YGB0 ではイメージは上から順に保存されるので、左上のピクセルがバイト0となります。
// 1つのピクセルを2バイトで表現します。
unsigned __int16* pImgData = (unsigned __int16*)pActiveBuf->getPtr();
今回の例では、画像中の(左上から)最初のピクセルを読み出した後、3ピクセル分を操作したいと思います。 先ほど説明したようにRGB 画像は下から上に保存されるため、pwImgDataはイメージの最後の行の最初のバイトをポイントします。この最初バイトにアクセスしたい場合には下記のようにして算出する必要があります。
ピクセルデータを輝度値に変更するのには前述の関数YGB0PixelFromInt16Valueを使用します。
// ピクセルの”値”(0~1023)を取得するために
// Int16ValueFromYGB0Pixelを使用する
unsigned __int16 val0 = Int16ValueFromYGB0Pixel( pImgData[0] );
unsigned __int16 val1 = Int16ValueFromYGB0Pixel( pImgData[1] );
printf( "\nImage buffer pixel format is eYGB0\n" );
printf( "Pixel 1 (Y16): %d\n", val0 );
printf( "Pixel 2 (Y16): %d\n", val1 );
画像データを操作する
では左上のピクセルからブラック、グレー、ホワイトの順に設定しましょう。関数YGB0PixelFromInt16Valueを使って輝度値からピクセルデータに変換を行います。
pImgData[0] = YGB0PixelFromInt16Value( 0 ); // 最初のピクセルをブラックに
pImgData[1] = YGB0PixelFromInt16Value( 511 ); // 2番目のピクセルをグレーに
pImgData[2] = YGB0PixelFromInt16Value( 1023 ); // 3番目のピクセルをホワイトに
// バッファをRGB24として保存しているので他のソフトウェアで見ることができるようにする
saveToFileBMP( *pActiveBuf, "YGB0.bmp", eRGB24 );
確認のために保存されたか画像の左上のピクセルを見てみましょう。このようになっているはずです