アプリ版:「スタンプのみでお礼する」機能のリリースについて

はじめての動画像処理
http://www.cqpub.co.jp/shoseki/mycomputer/pic019/

こちらの7章list701.cppのプログラムを使っています。
このプログラムでは、フレームごとに画像の各特徴量を計算し、外部ファイルに結果を出力しています。
buffer(各rgbの値が格納されている)の数値を使って計算をするだけなので、これでは実行結果で表示させる画像は何も変化が得られず、ただフレームごとに画像を描画しているだけです。

私が行いたいことは、bufferに数値を代入して、表示させるビットマップの結果を変えることなのです。
例えば、画像中の白い部分を赤色に変更して結果をフレームごとに表示するなどです。
その場合、

buffer[ij*3]=255
buffer[ij*3+1]=0
buffer[ij*3+2]=0

という代入の表記を書き、その後InvalidateRectで再描画を促して結果を反映させようとしたのですが、

error C2064: 1 引数を取り込む関数には評価されません。

と出てしまいうまく行うことができませんでした。bufferはBYTE型で定義してあったのですが、そこに整数を格納しようとしていることがいけないのでしょうか?
計算結果を反映させた動画の表示方法があれば教えていただきたいです。
動画像処理は初めてでかなり困っています; よろしくお願いします。

A 回答 (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
}

と付け足すだけで動きませんか?
    • good
    • 0
この回答へのお礼

返信遅くなってしまい、申し訳ありません。

無事に動作を行うことができました。
ありがとうございました!

お礼日時:2010/02/23 11:01

>error C2064: 1 引数を取り込む関数には評価されません。


ぜんぜん違うところ(1行目)でコンパイルエラー起こしてるような
気がしますが書いたソースコード転記できませんか?
もともとのソースコードやデータ代入に問題があるとは思えません
(画像処理以前の問題の気がします)

後コンパイラは何使っているかも書いたほうがいいかもしれません

※ 私も手元にDirectShowSDK無いので私の手元でコンパイルしたわけではありません
  (現状落とす気もありません)

この回答への補足

koi1234さん。回答ありがとうございます。全てのソースコードを載せることはできなかったので、フレームごとに処理をする部分を載させていただきます。
コンパイラはvisualstudio2005の正規版を使っています。


IMG0img00;// 表示ウィンドウ用の構造体
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;

のように修正したとして、画像の白い部分を赤色に変えて表示するようにしたいのですが、結果をうまく反映することができない状態(そのままの画像が表示される)です。
どのようにしたら表示させることができるでしょうか?
ご教授よろしくお願いします。

補足日時:2010/02/20 07:53
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!