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

Opencv画像処理 bmp処理

このQ&Aのポイント
  • Opencvでキャプチャ→bmpで保存→for文でRGBの量を求める→一定量のRが検出されればショートカットを起動するプログラムがオバーフローして実行できない
  • プログラムの関数の受け渡しがうまくいっていない可能性がある
  • RGBの出力方法がわかっていない

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

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

for(y=0;y<img->height;y++){ for(x=0;x<img->width;x++){ p[0]=img->imageData[img->widthStep*y+x*3];//B p[1]=img->imageData[img->widthStep*y+x*3+1];//G p[2]=img->imageData[img->widthStep*y+x*3+2];//R }} では、p[i] の内容が毎回上書きされます。 ループ終了時には、一番最後の座標(x,yが最大値)の値になります。 その後で printf("%u 赤の多さ",p[2]); printf("%u 緑の多さ",p[1]); printf("%u 青の多さ",p[0]); を出力すれば、その最後の座標の情報が出力されることになります。 全体が青っぽくても、右下の1点だけがノイズ等で赤くなっていたら、「赤」の情報が出力されます。 全体の傾向を調べるなら、適切な処理をする必要があります。例えば、平均値、中央値等。 色の傾向を見るなら、BGR→HSVに変換して、色相で調べる、という方法もあります。

yuki-yuto
質問者

補足

そうですか・・・自分でも色々考えた結果今後このプログラムをこんな風にしようと思います。 ○画像を4分割して左上右上、左下右下に分ける。(ucharの関係上画像サイズは255*255にする) ○範囲ごとに赤色の値を合計して比較する(BGR)。 ○またはこのプログラムのピクセルを読み込む位置を数個指定してそこのBGR値を取得する。(for文で回している部分を固定化) 自分の熟練度では赤の最後の位置を取得するなどできない(そもそもキャプチャなので綺麗にRGB取れるか解らない)ので範囲で分けてそれぞれの合計で判定できないかなと思います。 位置の固定化は自分で模索していますが、もし範囲ループでBGRの合計値が出そうなコードを組めそうならそうしてくれると大変助かります。 配列pの中のBGRの要素をどうやって足していくか、そこが一番の難関だと思います。

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

肝心の部分が省略されていて、どこが原因だか判断できません。 これがそのままなら、 main 関数が複数、という、普通ではない状態になりますが、それはいいのでしょうか? あれこれ悩むなら、参考書を買ってはどうです? IplImageの中にどんな順番で画素が入っているか、書いてあるはずですよ。 BMPファイルを直接操作するにしても、やりかたを書いたサイトはいくつもあります。 でも、OpenCV使っているなら、素直にOpenCVで読んだ方が楽でしょう。 あるいは、パフォーマンスを多少犠牲にして Get2Dを使うとか。 http://opencv.jp/opencv-2svn/c/core_operations_on_arrays.html#get-d

yuki-yuto
質問者

補足

なんとかコレで動くようになったのですが、ほぼ同じ写真を移しても何故かRの値が毎回大きく変動してしまいます・・・。 ~~省略。 //sキー入力で画像を保存、Escキー入力でループから抜ける key = cvWaitKey(10); if(key == '\x1b') break; else if(key == 's'){ sprintf_s(str, "Capture_Bitmap.bmp"); cvSaveImage(str, frame); } } //ウィンドウの破棄 cvDestroyWindow("CaptureFromCamera"); int x,y; uchar p[3]; IplImage *img; img = cvLoadImage ("Capture_Bitmap.bmp",CV_LOAD_IMAGE_COLOR); for(y=0;y<img->height;y++){ for(x=0;x<img->width;x++){ p[0]=img->imageData[img->widthStep*y+x*3];//B p[1]=img->imageData[img->widthStep*y+x*3+1];//G p[2]=img->imageData[img->widthStep*y+x*3+2];//R }} printf("%u 赤の多さ",p[2]); printf("%u 緑の多さ",p[1]); printf("%u 青の多さ",p[0]); return(0); } これでRの値が読み出せるはずが、何故か毎回変動幅が大きいです。 青いものを移しても普通にRの値が赤より多くなったりしてしまいます。 そもそもopencvでのRGBはどんな風にして決められているのでしょうか。ソレがわかれば改良の余地があるかも?

すると、全ての回答が全文表示されます。

関連するQ&A