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

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

ただいまの
回答率

90.49%

  • C++

    3461questions

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

  • Visual Studio

    1838questions

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

  • OpenCV

    1087questions

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

OpenCVで連番の静止画から動画を作成するには

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,637
退会済みユーザー

退会済みユーザー

C++初心者です.

ただいまOpenCVを用いて,連番のJpegファイルを繋ぎ合わせて1つの動画(mp4)を作成しようとしています.

サンプルプログラムを参考にし,
「C:\〇〇〇\」にある30fpsの『0000000.jpg』『0000001.jpg』『0000002.jpg』...といった画像を一つの動画にして『C:\Users\△△△\Documents\□□□.mp4』というファイルに出力するプログラムです。

記載のコードを実行すると,
『sprintf(image_name, "C:\\〇〇〇.jpg", i);』
の行にエラーがありました.
エラーの内容は,以下の通りです.
'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    

環境は以下の通りです.
・Windows10
・Visual Studio 2015
・OpenCV3.3.0
・C++

#include "opencv2/highgui.hpp"
#include "opencv2/Videoio.hpp"
#include <opencv2/core.hpp>

#include <stdio.h>
#include <iostream>

using namespace std;
using namespace cv;


int main(){
//出力する動画ファイルの設定をします。拡張子はMP4で、毎秒30フレーム、画像縦横サイズは2048*4088。
VideoWriter writer("C:\\Users\\△△△\\Documents\\□□□.mp4", VideoWriter::fourcc('M', 'P', '4', '5'), 30.0, Size(2048, 4088));
//動画ファイルがちゃんと作れたかの判定。
if (!writer.isOpened()) { return -1; }

//動画にする画像の名前を入れる文字配列。
char image_name[100];
//動画にする画像を入れるMat。
Mat image;

//『0000000.jpg』から『0001673.jpg』までの画像を動画にしていく。
for (int i = 0; i < 1673; i++) {
    //画像の名前を更新。
    sprintf(image_name, "C:\\〇〇〇.jpg", i);
    //名前に対応した画像を取り込み。
    image = imread(image_name);

    //画像がなければ処理を飛ばす。
    if (image.empty()) {
        cout << "no image : " << image_name << endl;
        continue;
    }

    //動画ファイルに画像を出力。
    writer << image;
}

    return 0;
}

p.s.再生時の加速度を正弦波状に変化させるにはどのようなコードを入力するとよいでしょうか.
イメージとしては再生速度が早くなったり遅くなったりする感じです.
サンプルプログラムをおしえていただけると幸いです.

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.    

Visual Studioで見る警告です。
アドバイス通りに、次のどちらかで対処すればよいです。

  • 代わりにsprintf_sを使う
  • マクロ_CRT_SECURE_NO_WARNINGSを定義する

なお、検索すると結構引っ掛かります。sprintf_sやsprintf_p
Visual Studioしか当面使わないのであれば、sprintf_sを使うのがいいかと思います。

というか、そもそも、C++ならstd::stringを使えばいいのでは?

#include <string>
#include <iostream>

int main(int argc, char **argv) {
    for(int i = 0; i < 10; i++) {
        std::cout << "C:\\" + std::to_string(i) + ".jpg" << std::endl;
    }
    return 0;
}

実行結果

C:\0.jpg
C:\1.jpg
C:\2.jpg
C:\3.jpg
C:\4.jpg
C:\5.jpg
C:\6.jpg
C:\7.jpg
C:\8.jpg
C:\9.jpg

再生時の加速度を正弦波状に変化させるにはどのようなコードを入力するとよいでしょうか.
イメージとしては再生速度が早くなったり遅くなったりする感じです.

『再生時』にフレームレートを可変にするには、waitKeyの引数を変数にすればよいです。
あんまり厳密ではないのですが、これが一番楽です。

『保存時』にフレームレートを可変にする方法は知りません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/10/17 12:46

    sprintf_sに変更したところ解決できました.
    ありがとうございます.

    キャンセル

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

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C++

    3461questions

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

  • Visual Studio

    1838questions

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

  • OpenCV

    1087questions

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