• 締切済み

動画中の画面全体のRGB平均取得

お世話になってます。 黒い背景の中を白色の玉が左から右へただ流れていく動画があります。 24時間分あり、玉がいつ流れるかは全くわかりません。 白い玉が通過した時間をだいたいで良いので知りたいですが、24時間動画を見続けるのは厳しいのでフリーソフトか簡単なプログラムでできないか検討しています。 一つ考えたのが、画面全体のRGB値の平均を毎フレーム(?)とり、エクセルなどで横軸(時間)、縦軸(RGB値)で描画すれば、通過した時間だけピークになるようなグラフが得られると思います。 OpenCVというもので特定領域の画像のRGB取得しているものはあったのですが、動画で同じようなことができないでしょうか? エクセルのマクロ程度ならできるのでOpenCVを勉強してみようと思いますが、動画を解析するのが敷居が高いので、プログラムソースかどういった関数(?)を使えばできるかヒントをいただければ幸いです。 ご教授下されば幸いです。 よろしくお願い致します。

みんなの回答

  • myuki1232
  • ベストアンサー率57% (97/170)
回答No.2

OpenCV を使えばできることは確かなんですが、プログラミング初心者の方にはなかなか難しいですよね。 そういう方にも簡単に使えるツールがあればいいんですが…。 とりあえず、OpenCV を使って15分位でちゃっちゃと作ってみましたが、動作確認していませんので大体のイメージとして捉えてください。 初心者の方には、このソースだけ出されてもどうやって動かせばいいの? というのが最大の問題なんですよね…。 ここから↓ #include <string> #include <iostream> #include <opencv2/core.hpp> #include <opencv2/imgproc.hpp> #include <opencv2/highgui.hpp> int main(int argc, char **argv) { std::string filename = argv[0]; // 動画ファイルを開く cv::VideoCapture capture; capture.open(filename); cv::Mat image, gray; // 1フレームずつ読み込む while (capture.read(image)) { gray.create(image.size(), image.depth()); cv::cvtColor(image, gray, CV_RGB2GRAY); // 平均値を求める cv::Scalar mean = cv::mean(gray); double i = cv::norm(mean); // 標準出力へ出力 std::cout << i << std::endl; } }

gallus
質問者

お礼

コードやコメントまで入れていただいてありがとうございます!! excelマクロやarduinoとは書き方が違うようですが、なんとなくやろうとしていることは伝わりました! 関数(コマンド?)がわかれば勉強できますので、1行ずつ理解していきたいと思います! OpenCV の開き方から勉強ですが…(笑) それにしてもこれを15分はすごいです!!

  • i-q
  • ベストアンサー率28% (982/3450)
回答No.1

具体的に候補を挙げられませんが、もっと簡易な方法なら有ります。 ビットレートを調べてはどうでしょう? 変化がある部分で上下していると思います。

gallus
質問者

お礼

コメントありがとうございます。 確かにおっしゃる通りRGBの必要性はないですね。 色で認識しなくても動きや画像の変化するポイントを見けられれば良いですね! ビットレートとは動画全体の解像度的なものと持っていたのですが、フレーム(?)ごとのビットレートを知る方法があるのでしょうか