• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:はじめての動画像処理)

はじめての動画像処理

このQ&Aのポイント
  • はじめての動画像処理についての質問です。プログラムを使ってフレームごとに画像の特徴量を計算し、結果を出力することができますが、表示させる画像には変化がありません。数値を代入してビットマップの結果を変える方法を教えてください。
  • 動画像処理のプログラムを使用して画像の特徴量を計算し、結果を外部ファイルに出力できるようになりましたが、表示させる画像には変化がありません。白い部分を赤色に変えるなど、結果を動画で表示させる方法を教えてください。
  • はじめての動画像処理に取り組んでいますが、プログラムを使って特徴量を計算し、結果を出力することはできます。しかし、表示させる画像には変化がありません。画像中の特定の部分を色で変える方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.2

>int ij=i*width+j; >int rr = img00.lpBmpData[ij*3]; >int gg = img00.lpBmpData[ij*3+1]; >int bb = img00.lpBmpData[ij*3+2]; >if(rr==255 && gg==255 && bb==255){ >img00.lpBmpData [(i+3)(j+3)*3]=255; >img00.lpBmpData [(i+3)(j+3)*3+1]=0; >img00.lpBmpData [(i+3)(j+3)*3+2]=0; >} 1.読み込み・判断してるデータ位置と書き換えしてる位置が一致してません 2.転記ミスなのかもしれませんが元々のソースのコメントでも   データ配列は BGR のはずですがなぜかこのソースの   コメントでは勝手に RGB に変えてます   (BMPファイルのデータ配列は BGR が正解です) 3.(i+3)(j+3)*3 なんて書き方は出来ません (何で突然こんな話が出てるのでしょうか?) 4.上記を全て直したとして赤色にセットしているのではなくて 青色にセットしていることになります 一番最初に書いてあったようにもともとのオリジナルに対して 代入を加えただけですか? 何か他の部分に要らない加工をしている気がします 転記コードやその内容を見てそのようにやっているといわれてること事態が 疑わしくなってしまうのですが 元々書かれているコード部分 bb = buffer[ ij * 3 ] ; // b gg = buffer[ ij * 3 +1 ] ; // g rr = buffer[ ij * 3 +2 ] ; // r の下に if ((bb==255) && (gg==255) &&(rr==255)) { bb = buffer[ ij * 3 ] = 0; // b gg = buffer[ ij * 3 +1 ] = 0 ; // g rr = buffer[ ij * 3 +2 ] = 255 ; // r } と付け足すだけで動きませんか?

take8793
質問者

お礼

返信遅くなってしまい、申し訳ありません。 無事に動作を行うことができました。 ありがとうございました!

その他の回答 (1)

  • koi1234
  • ベストアンサー率53% (1866/3459)
回答No.1

>error C2064: 1 引数を取り込む関数には評価されません。 ぜんぜん違うところ(1行目)でコンパイルエラー起こしてるような 気がしますが書いたソースコード転記できませんか? もともとのソースコードやデータ代入に問題があるとは思えません (画像処理以前の問題の気がします) 後コンパイラは何使っているかも書いたほうがいいかもしれません ※ 私も手元にDirectShowSDK無いので私の手元でコンパイルしたわけではありません   (現状落とす気もありません)

take8793
質問者

補足

koi1234さん。回答ありがとうございます。全てのソースコードを載せることはできなかったので、フレームごとに処理をする部分を載させていただきます。 コンパイラはvisualstudio2005の正規版を使っています。 IMG0 img00;// 表示ウィンドウ用の構造体 img00.lpBmpData = (BYTE *)malloc( amt.lSampleSize );//データ用配列 while( nn <= flame_number){//flame_number=フレーム数 // シーク pims -> SetPositions( &nn, AM_SEEKING_AbsolutePositioning, &nn,AM_SEEKING_AbsolutePositioning ); pimc -> StopWhenReady(); // シークしてレンダリング pimc -> GetState( INFINITE, & fs);// レンダリング完了を待つ pisg -> GetCurrentBuffer( &n, (long*)img00.lpBmpData ); // グラブ //ここに処理を追加 int flag=0; for(int i=0; i<height; i++){ for(int j=0; j<width; j++){ int ij=i*width+j; int rr = img00.lpBmpData[ij*3]; int gg = img00.lpBmpData[ij*3+1]; int bb = img00.lpBmpData[ij*3+2]; if(rr==255 && gg==255 && bb==255){ img00.lpBmpData [(i+3)(j+3)*3]=255; img00.lpBmpData [(i+3)(j+3)*3+1]=0; img00.lpBmpData [(i+3)(j+3)*3+2]=0; } } } InvalidateRect( img00.hwnd, NULL, FALSE);//再描画を促す nn++;    } error C2064: 1 引数を取り込む関数には評価されません の原因ですが、img00.lpBmpData[(i+3)(j+3)*3]のように*を省略して書いてしまったために起きた問題だと思います。あとimg00.lpBmpDataの容量を超える記述も書かれていました。初心者すぎてすみません;; 上記の記述を img00.lpBmpData [ij*3]=255; img00.lpBmpData [ij*3+1]=0; img00.lpBmpData [ij*3+2]=0; のように修正したとして、画像の白い部分を赤色に変えて表示するようにしたいのですが、結果をうまく反映することができない状態(そのままの画像が表示される)です。 どのようにしたら表示させることができるでしょうか? ご教授よろしくお願いします。

関連するQ&A