質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

5135閲覧

opencvの動画再生について

qwertyui

総合スコア21

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/12/13 08:31

opencvで動画を再生させるときにキー入力によって再生する位置を変えようとしています。コードは以下のようになっています。エラーなく動きますがとても動画の速さが遅くなります。またキーを入力しても反応しないときがあります。動画がなめらかに動きキー入力で指定した通りのフレームの位置で動くようにするにはどうすればいいのでしょうか。

int main()
{
namedWindow("test", WINDOW_AUTOSIZE);
Mat frame;
VideoCapture video("abc.mp4");

for (int i = 0; i < max_frame; i++) { video >> frame; //1フレーム分取り出してimgに保持させる imshow("test", frame); waitKey(30);//表示のために1ms待つ if (waitKey(30) >= 'q') { video.set(CV_CAP_PROP_POS_FRAMES, 100); } if (waitKey(30) >= 'w') { video.set(CV_CAP_PROP_POS_FRAMES, 200); } if (waitKey(30) >= 'e') { video.set(CV_CAP_PROP_POS_FRAMES, 300); } if (waitKey(30) >= 'r') { video.set(CV_CAP_PROP_POS_FRAMES, 400); } if (waitKey(30) >= 't') { video.set(CV_CAP_PROP_POS_FRAMES, 500); } if (waitKey(30) >= 'y') { video.set(CV_CAP_PROP_POS_FRAMES, 600); } if (waitKey(30) >= 'u') { video.set(CV_CAP_PROP_POS_FRAMES, 700); } if (waitKey(30) >= 'i') { video.set(CV_CAP_PROP_POS_FRAMES, 800); } }

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

waitKey(30)毎に時間を消費しています。まずint key;とか適当な変数を定義して、一回だけkey=waitKey(1)として入力。その後に各ifに渡されては如何ですか?exif( key == 'q')など。それと入力とキーを比較するのであれば>=ではなくて==と考えますが。
簡単なソースを添付します。

C++

1int main() 2{ 3 int key; 4 namedWindow("test", WINDOW_AUTOSIZE); 5 Mat frame; 6 VideoCapture video("abc.mp4"); 7 8 for (int i = 0; i < max_frame; i++) { 9 video >> frame; //1フレーム分取り出してimgに保持させる 10 imshow("test", frame); 11 key = waitKey(1);//表示のために1ms待つ 12 if (key == 'q') 13 { 14 video.set(CV_CAP_PROP_POS_FRAMES, 100); 15 } 16 if (key == 'w') 17 { 18 video.set(CV_CAP_PROP_POS_FRAMES, 200); 19 } 20 if (key == 'e') 21 { 22 video.set(CV_CAP_PROP_POS_FRAMES, 300); 23 } 24 if (key == 'r') 25 { 26 video.set(CV_CAP_PROP_POS_FRAMES, 400); 27 } 28 if (key == 't') 29 { 30 video.set(CV_CAP_PROP_POS_FRAMES, 500); 31 } 32 if (key == 'y') 33 { 34 video.set(CV_CAP_PROP_POS_FRAMES, 600); 35 } 36 if (key == 'u') 37 { 38 video.set(CV_CAP_PROP_POS_FRAMES, 700); 39 } 40 if (key == 'i') 41 { 42 video.set(CV_CAP_PROP_POS_FRAMES, 800); 43 } 44 } 45}

机上ですので、後は任意にご変更の事。

投稿2016/12/13 08:35

編集2016/12/13 10:24
MasahikoHirata

総合スコア3747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MasahikoHirata

2016/12/13 10:49

’max_frame’は元ソースのままに。何か値が必要と思います。
qwertyui

2016/12/13 13:24

思っていたとおりに動きました。 max_frameは動画の全コマ数int max_frame = video.get(CV_CAP_PROP_FRAME_COUNT);を書いていますので問題ないです。 以前聞いた書いたものを応用して考えたのですが、自分はif (waitKey(30) >= 'q')の部分がよくわかっていないと思います。qよりもwaitKey(30)が大きい?数字ではないのになぜ大小があるのだろうと。
MasahikoHirata

2016/12/14 00:44

’数字ではないのに’について。`waitKey`では入力されたキーに対応するキーのコード(数字)です。したがって`key`を数字として表示すればキーに対応したコードが分かるかと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問