はじめての動画像処理
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型で定義してあったのですが、そこに整数を格納しようとしていることがいけないのでしょうか?
計算結果を反映させた動画の表示方法があれば教えていただきたいです。
動画像処理は初めてでかなり困っています; よろしくお願いします。
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
}
と付け足すだけで動きませんか?
No.1
- 回答日時:
>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;
のように修正したとして、画像の白い部分を赤色に変えて表示するようにしたいのですが、結果をうまく反映することができない状態(そのままの画像が表示される)です。
どのようにしたら表示させることができるでしょうか?
ご教授よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Excel(エクセル) エクセルでSUMIFS関数で条件範囲の部分が#valueになる。 4 2023/04/28 12:42
- Excel(エクセル) エクセルのSUM関数について 4 2023/04/18 10:37
- Chrome(クローム) Chromeの描画領域を2分割して異なるスクロール位置を同時に表示させることはできますか 1 2023/03/01 16:53
- Excel(エクセル) エクセル 自動計算 1 2023/01/30 13:28
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- その他(Microsoft Office) Excelで時間計算(負) 8 2023/02/26 05:47
- C言語・C++・C# 【C++】IDirect3DSurfaceのディープコピーは可能ですか? 1 2022/07/06 02:47
- C言語・C++・C# C言語 3 2022/10/04 15:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
pythonにCでのexternはありますか
-
多元配列の0初期化
-
ポインター引数の関数でコンパ...
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
number 改行が追加できない
-
COBOLのCOMP形式について
-
char str[256]の256の意味は?
-
DataGridViewの特定列に入力さ...
-
機種依存文字をチェックしたい。
-
Excel VBA メール作成について ...
-
バイナリとBCDコード
-
stable diffusionのエラー
-
Line Inputにて改行があっても...
-
Javaで日本語1文字のバイト数
-
ピクセル,dpiから容量(バイト...
-
エクセルシート名の制限を変更...
-
ビットからバイトへの変換
-
2byte文字の判定
-
memcmp バイナリデータの比較方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
pythonにCでのexternはありますか
-
python 3.10で 同じlistに同じ...
-
CSVから構造体へ代入
-
VBScriptでカレントディレクト...
-
マクロの書き換え箇所がわかり...
-
Perlで変数中のエスケープされ...
-
UWSCにおける変数の扱い方
-
VB2010での連立方程式の計算
-
なぜかわかりませんscanf()の戻...
-
c言語 グローバル変数
-
ポインター引数の関数でコンパ...
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
Excel VBA メール作成について ...
-
char str[256]の256の意味は?
-
エクセルシート名の制限を変更...
-
stable diffusionのエラー
-
COBOLのCOMP形式について
-
Excel 1セル当りの文字数が2...
-
DataGridViewの特定列に入力さ...
おすすめ情報