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

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

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

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

OpenCV

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

C++

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

Q&A

解決済

1回答

3560閲覧

opencvでの動画の画像変換のフレームレートの調整方法

onioni0024

総合スコア14

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

OpenCV

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

C++

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

0グッド

0クリップ

投稿2019/03/05 10:58

前提・実現したいこと

プログラミング初心者です。
VS2015、C++、opencv等を用いて、30FPSで動画から静止画像を抽出するプログラムを作っています。
そのプログラムについては問題なかったのですが、30FPSから1FPSに抽出頻度を落とせずに困っています。

発生している問題・エラーメッセージ

waitKey()の引数を30から1000に変えれば簡単にできると考えていましたが、 どうもどちらにしても1秒間に33枚ほど抽出されているようです。 何が問題であるのか教えていただけると幸いです。

該当のソースコード

C++

1#define _CRT_SECURE_NO_WARNINGS 2#define _USE_MATH_DEFINES 3#include <opencv2/core.hpp> 4#include <opencv2/videoio.hpp> // videoioのヘッダーをインクルード 5#include <opencv2/highgui.hpp> // highguiのヘッダーをインクルード 6#include <iostream> 7 8int main(int argc, const char* argv[]) 9{ 10 char filename[80]; 11 int filenumber; 12 // (1)動画ファイルを開くための準備を行う 13 cv::VideoCapture cap("Camera-1_01-29-14-16~01-29-19-02_4.avi"); 14 15 16 // (2)動画ファイルが正しく開けているかをチェックする(正しく開けていなければエラー終了する) 17 if (!cap.isOpened()) 18 return -1; 19 20 21 // 画像データを格納するための変数を宣言する 22 cv::Mat frame; 23 filenumber = 1; 24 for (;;) 25 { 26 // (3)動画ファイルから1フレーム分の画像データを取得して、変数frameに格納する 27 cap >> frame; 28 29 // 画像データ取得を取得できたら書き込み。 30 if (!frame.empty()) { 31 sprintf(filename, "%d.bmp", filenumber++); 32 cv::imwrite(filename, frame); 33 } 34 if (cv::waitKey(30) >= 0) break; 35 } 36 37 return 0; 38}

試したこと

補足情報(FW/ツールのバージョンなど)

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

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

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

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

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

tiitoi

2019/03/05 11:14

fps が1秒あたりのフレーム数という理解は大丈夫でしょうか? 1FPSで動画を再生したいという質問なのか、30フレームに1枚だけ画像を保存したいなのかどちらでしょうか?
onioni0024

2019/03/05 11:35

言葉が不適切でした、すみません。 やりたいことは「動画から1秒に1フレームずつ画像を保存したい」ということになります。 以前は1秒に約30フレーム保存できるようにwaitKey(30)で記述していましたが、 最近、1秒に1フレーム保存する必要が出てきたのでwaitKey(1000)と書き換えました。 しかし、書き換える前も後も同じフレームの画像が保存されてしまっている、 というのが今回の質問の経緯になります。 未熟者で恐縮ですが宜しくお願い致します。
guest

回答1

0

ベストアンサー

やりたいことは「動画から1秒に1フレームずつ画像を保存したい」ということになります。
以前は1秒に約30フレーム保存できるようにwaitKey(30)で記述していましたが、
最近、1秒に1フレーム保存する必要が出てきたのでwaitKey(1000)と書き換えました。

動画の FPS は1秒間が何枚の画像で構成されているかを表します。
一方、表示する際の FPS とは1秒間に何フレーム表示されるかを表します。

cv::waitKey(1000) とした場合、1秒待つだけなので、cv::imshow() で表示する際の FPS はこれで調整できますが、全体で保存される画像枚数はかわりません。

元が30FPSの動画を1秒に1フレームだけ保存したいのであれば、残りの29フレームは捨てるということなので、単純にカウンターを入れて、

cpp

1int i = 0; 2while (true) { 3 // 30フレームのうち、1枚だけ保存する。 4 if (i % 30 == 0) { 5 cv::imwrite(...) 6 } 7 i++; 8}

とすればよいと思いますがいかがでしょうか。

投稿2019/03/05 11:57

編集2019/03/05 12:02
tiitoi

総合スコア21954

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

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

onioni0024

2019/03/05 12:05

なるほど、横着しすぎていました。 ご指摘の通りやってみたいと思います。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問