質問: 1; for (;;) { // (3)動画ファイルから1フレーム分の画像データを取得して、変数frameに格納する cap >> frame; // 画像データ取得を取得できたら書き込み。 if (!frame.empty()) { sprintf(filename, "%d.bmp", filenumber++); cv::imwrite(filename, frame); } if (cv::waitKey(30) >= 0) break; } return 0; } ``` ### 試したこと ### 補足情報(FW/ツールのバージョンなど)
回答: > > やりたいことは「動画から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フレームは捨てるということなので、単純にカウンターを入れて、 ``` int i = 0; while (true) { // 30フレームのうち、1枚だけ保存する。 if (i % 30 == 0) { cv::imwrite(...) } i++; } ``` とすればよいと思いますがいかがでしょうか。