前提・実現したいこと
プログラミング初心者です。
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/ツールのバージョンなど)
fps が1秒あたりのフレーム数という理解は大丈夫でしょうか?
1FPSで動画を再生したいという質問なのか、30フレームに1枚だけ画像を保存したいなのかどちらでしょうか?
言葉が不適切でした、すみません。
やりたいことは「動画から1秒に1フレームずつ画像を保存したい」ということになります。
以前は1秒に約30フレーム保存できるようにwaitKey(30)で記述していましたが、
最近、1秒に1フレーム保存する必要が出てきたのでwaitKey(1000)と書き換えました。
しかし、書き換える前も後も同じフレームの画像が保存されてしまっている、
というのが今回の質問の経緯になります。
未熟者で恐縮ですが宜しくお願い致します。
回答1件
あなたの回答
tips
プレビュー