
ゆうき( @BASEBALLY15 )です^^
今日はどうしたんじゃ?
C++でOpenCVを使って,動画から画像を生成する方法を知りたいです.
(※Visual Studio 2015を使用)
了解じゃ!

目次
具体的に何が出来るの?
今回,ご紹介する方法を使うことで,以下の様に,動画から画像を生成し,指定したフォルダに保存することができます.
エディタ :Visual Studio 2015
言語 :C++
ライブラリ:OpenCV 3.4.10
Visual Studio上でOpenCVを使えるように設定しよう!
Visual StudioでOpenCVを使うための設定をしていない方は,先に以下の記事を読んでおくことをオススメします^^
C++でOpenCVを使って,動画から画像を生成する方法とは?
それでは,早速,以下の流れで,動画から画像を生成するコードについて,紹介していきます^^
2. 各コードの詳細 について
全体のコード
#include <iostream>
#include <opencv2/opencv.hpp>//OpenCVのインクルード
#include "opencv2/highgui/highgui.hpp" //動画を表示する際に必要
using namespace cv;
int main(int argc, const char* argv[]) {
Mat img;
//動画ファイルを指定
std::cout << "Movie file name =" << std::endl;
std::string movie_name; //文字型のファイルを用意
std::cin >> movie_name; //コマンドプロンプからファイル名を入力
VideoCapture cap(movie_name); //動画読み込み用のオブジェクトを生成
// cv::VideoCaptureが正常に動作しているかをチェック!
if (!cap.isOpened())
{
std::cerr << "cannot open this movie file!" << std::endl;
return -1;
}
//保存用のフォルダを指定
std::cout << "Folder name for saving = " << std::endl;
std::string save_folder_path;
std::cin >> save_folder_path;
double max_frame = cap.get(CAP_PROP_FRAME_COUNT);//フレーム数
for (int i = 0; i < int(max_frame); i++)
{
cap >> img;//1フレーム分取り出してimgに保存させる
std::string image_name_path;
std::string image_name;
image_name = std::to_string(i) + ".png";
image_name_path = save_folder_path + "\\" + image_name;
cv::imwrite(image_name_path, img);
std::cout << image_name << std::endl;
//表示
imshow("image", img);
if (cv::waitKey(1) == 13)
{
break;
}
}
cap.release();//読み込み用のオブジェクトを解放
destroyAllWindows();//ウィンドウを破棄
return 0;
}
各コードの詳細
読み込む動画ファイルと保存用のフォルダの指定
//動画ファイルを指定
std::cout << "Movie file name =" << std::endl;
std::string movie_name; //文字型のファイルを用意
std::cin >> movie_name; //コマンドプロンプからファイル名を入力
VideoCapture cap(movie_name); //動画読み込み用のオブジェクトを生成
// cv::VideoCaptureが正常に動作しているかをチェック!
if (!cap.isOpened())
{
std::cerr << "cannot open this movie file!" << std::endl;
return -1;
}
//保存用のフォルダを指定
std::cout << "Folder name for saving = " << std::endl;
std::string save_folder_path;
std::cin >> save_folder_path;
まず,
std::cout << "Movie file name =" << std::endl;
std::string movie_name;
std::cin >> movie_name;
で,コマンドプロンプト上から動画ファイルを読み込みます.
次に,
VideoCapture cap(movie_name);
で,動画を読み込むためのオブジェクトを用意します.
そして,
if (!cap.isOpened())
{
std::cerr << "cannot open this movie file!" << std::endl;
return -1;
}
で,もし動画を読み込むためのオブジェクト(cap)が無いときの処理を行います.
次に,
std::cout << "Folder name for saving = " << std::endl;
std::string save_folder_path;
std::cin >> save_folder_path;
で,画像を保存するためのフォルダを指定します.
(※あらかじめ,画像を保存するためのフォルダを作成しておいてください.)

動画から画像を生成し,フォルダに保存
double max_frame = cap.get(CAP_PROP_FRAME_COUNT);//フレーム数
for (int i = 0; i < int(max_frame); i++)
{
cap >> img;//1フレーム分取り出してimgに保存させる
std::string image_name_path;
std::string image_name;
image_name = std::to_string(i) + ".png";
image_name_path = save_folder_path + "\\" + image_name;
cv::imwrite(image_name_path, img);
std::cout << image_name << std::endl;
//表示
imshow("image", img);
if (cv::waitKey(1) == 13)
{
break;
}
}
まず,
double max_frame = cap.get(CAP_PROP_FRAME_COUNT);
で,動画の全フレーム数を求めます.
次に,for文の中にある処理について説明します.
cap >> img;
で,動画を1フレームずつ取り出して,Mat型のimgに保存していきます.
そして,
std::string image_name_path;
std::string image_name;
image_name = std::to_string(i) + ".png";
image_name_path = save_folder_path + "\\" + image_name;
cv::imwrite(image_name_path, img);
で,画像をフォルダ内に保存していきます.

ちなみに,
std::to_string(i)
と記述することで,i番目の数字を文字型に変換することができます.
(※そのまま,int型の i を記述すると,型が異なるためエラーが表示されます.)
次に,
imshow("image", img);
で,動画を表示し,
if (cv::waitKey(1) == 13)
{
break;
}
で,もしエンターキーが押された時に動画を閉じる処理を追加しておきます.
ちなみに,今回はエンターキーが押された時に,動画を閉じる処理を行いましたが,
cv::waitKey(1) == 〇〇
の『〇〇』を変えることで,他のキーに変更することができます.
そして,最後に,
cap.release();//読み込み用のオブジェクトを解放
destroyAllWindows();//ウィンドウを破棄
return 0;
と記述し,読み込むためのオブジェクト(cap)とウィンドウを閉じて完了です!
終わりに
今回は,C++でOpenCVを使って,動画から画像を生成する方法をご紹介しました.
OpenCVを使うことで,数行のコード数で完成するので,ぜひ皆さんも試してみてください^^
それでは・・・