C++ OpenCV 動画から画像を生成

ゆうき( @BASEBALLY15 )です^^

今日はどうしたんじゃ?

C++でOpenCVを使って,動画から画像を生成する方法を知りたいです.
(※Visual Studio 2015を使用)

了解じゃ!

具体的に何が出来るの?

今回,ご紹介する方法を使うことで,以下の様に,動画から画像を生成し,指定したフォルダに保存することができます.

開発環境
OS     :Windows 10
エディタ :Visual Studio 2015
言語   :C++
ライブラリ:OpenCV 3.4.10

Visual Studio上でOpenCVを使えるように設定しよう!

Visual StudioでOpenCVを使うための設定をしていない方は,先に以下の記事を読んでおくことをオススメします^^

C++でOpenCVを使って,動画から画像を生成する方法とは?

それでは,早速,以下の流れで,動画から画像を生成するコードについて,紹介していきます^^

流れ
1. 全体のコードについて
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を使うことで,数行のコード数で完成するので,ぜひ皆さんも試してみてください^^

それでは・・・

Q &A

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA