トップページ > 過去ログ > 記事閲覧
画像のピクセルごとの色はどうやって取得する?
名前:Dixq 日時: 2009/08/29 22:22

現在USBカメラで取得した画像データから各ピクセルの色情報を取得したいと考えています。 USBカメラから画像を取得するプログラムについては、以前管理人様が提示されていた物と同じです。 h ttp://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=1000 今現在、ウィンドウモードではそれに成功しています。手順としては UpdateCaptureで画像データの取得後、GraphLockで画像をロックしてからGetColor2で色データを取得しています。 しかし、フルスクリーンで起動するとおかしな色になるのです。 起動時とフルスクリーン時のスクリーンショットとプログラムをこちらに載せます。 h ttp://dixq.net/DXQuest/ 画像の取得自体は出来ているようで、 Capture.GraphHandleに入っている画像データをそのまま描画するときちんと映ります。 問題は赤字部分なんだと思います。色の取得が正常に出来ていないのです。 何故フルスクリーン時に同じプログラムで結果が変わるのでしょうか? また、GetPixelSoftImageを使えば簡単に出来そうだったのですが、 青字のように書くとGetPixelSoftImageの関数の行で「ハンドルされていない〜〜」でエラーになります。 どのようにすれば解決出来るでしょうか・・。よろしくお願いします><;

Page: 1 |

Re: 画像のピクセルごとの色はどうやって取得する? ( No.1 )
名前:IW 日時:2009/08/30 01:22

BITが 16になってるので、24とか 32にしたらどうなりますか? GetPixelSoftImageの方はハンドルはハンドルでも SIハンドルなので、そのままでは使えません。
Re: 画像のピクセルごとの色はどうやって取得する? ( No.2 )
名前:Dixq 日時:2009/08/30 15:12

ご回答ありがとうございます。 ウィンドウモード、フルスクリーンモード、それぞれ 16,24,32ビットで実行した結果を先ほどのリンク先 h ttp://dixq.net/DXQuest/ に貼り付けましたのでご覧頂けると幸いです。 どういうわけか、ウィンドウモードは32ビットでうまくいくのに、 フルスクリーンだと、色はうまくいかないものの、サイズは16ビットでピッタリになるようですね・・。
Re: 画像のピクセルごとの色はどうやって取得する? ( No.3 )
名前:IW 日時:2009/08/30 21:41

あー、ひょっとすると GetColor2は画面モードに応じた色取得なので、 画像ハンドル内のデータフォーマットと一致していないのかもしれません。 GraphLockの引数を省略された引数を指定して、GetColor5で試してみて下さい。 ふと思ったのですが、GraphLockして調べなくてもCaptureオブジェクトの BmpBufferメンバにキャプチャーしたデータを BMPの中身(色データのみ)が 格納されているような気がするのですが、どうでしょう? (BmpHeaderメンバにはサイズ・色深度の情報が入っています)
Re: 画像のピクセルごとの色はどうやって取得する? ( No.4 )
名前:Dixq 日時:2009/08/31 23:07

ご回答ありがとうございます。 そうだったのですか、、わざわざ取得する必要は無かったのですね; ただみたところ、void*型ということで何か変換しないと使えないようなので、 明日またどのようなデータ構造化調べてやってみたいと思います。
Re: 画像のピクセルごとの色はどうやって取得する? ( No.5 )
名前:管理人 日時:2009/09/03 22:31

CAPTUREDATA 構造体の BmpBuffer メンバ変数にはビットマップイメージが 格納されているメモリアドレスが格納されています。 ビットマップイメージがどのようなフォーマットなのかは BmpHeader メンバ変数 の内容で知ることができますが、ほぼ間違いなく24bitカラーですので青・緑・赤の順で ドットの色情報が格納されていると思います。 ( ( BYTE * )pData->BmpBuffer )[ 0 ] // 座標( 0, 0 )の青 ( ( BYTE * )pData->BmpBuffer )[ 1 ] // 座標( 0, 0 )の緑 ( ( BYTE * )pData->BmpBuffer )[ 2 ] // 座標( 0, 0 )の赤 ( ( BYTE * )pData->BmpBuffer )[ 3 ] // 座標( 1, 0 )の青 ( ( BYTE * )pData->BmpBuffer )[ 4 ] // 座標( 1, 0 )の緑 ( ( BYTE * )pData->BmpBuffer )[ 5 ] // 座標( 1, 0 )の赤 1ラインのバイト数は4の倍数に補正されるようになっていますので、 例えば座標( 8, 16 )の色を取得したい場合は int Pitch ; // 1ラインに使われているバイト数は Pitch と呼ばれています // 1ラインのピッチはビットマップの幅 * 3バイト Pitch = pData->BmpHeader.biWidth * 3 ; // 4の倍数に合わせる計算 Pitch = ( Pitch + 3 ) / 4 * 4 ; ( ( BYTE * )pData->BmpBuffer )[ 8 * 3 + 16 * Pitch ] // 座標( 8, 16 )の青 ( ( BYTE * )pData->BmpBuffer )[ 8 * 3 + 16 * Pitch + 1 ] // 座標( 8, 16 )の緑 ( ( BYTE * )pData->BmpBuffer )[ 8 * 3 + 16 * Pitch + 2 ] // 座標( 8, 16 )の赤 のようにします。

Page: 1 |