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

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

ただいまの
回答率

90.76%

  • C++

    3247questions

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

  • Visual Studio

    1699questions

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

  • OpenCV

    969questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,263

antlers7515

score 4

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.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 受付中

    OpenCVで動画の読み込みがうまくできません。

    以前別のプログラムで動画の読み込みができましたが、今現在取り組んでいるプログラムではうまくいきません。 言語はC++でopencv2.4.9を使用しています。 Os windo

  • 解決済

    opencvでの画像の読み込み

    opencvで画像の読み込みを行い、テンプレートマッチングを行いたいと考えています。 外部のソフト(IC Imaging Contorol)というアルゴ社のカメラソフトを使い

  • 解決済

    opencvの連番読み込み

    今まで、iplimage型でコードを書いていたのですが、 多くの人の指摘があり、mat型に変更したいと考えています。 そこで、画像の連番読み込み、保存を行いたいと考えていま

  • 解決済

    動画から静止画切り出し

    動画から静止画の切り出しをしたいと考えています。 しかし、参考になるサイトを探していても見つかりません。 opencvで動画から静止画を切り出すことは不可能なのでしょうか?

  • 解決済

    opencv 動画 再生

    #include <stdio.h> #include <cv.h> #include <highgui.h> int main(int argc, char* argv[])

  • 解決済

    ファイル名に変数を用いて繰り返し読み込み処理を行いたい

    現在画像編集のプログラムopnCVとC++を用いた上で作成している初歩的段階です。 複数枚の画像に対してimreaの処理をかけた上で繰り返し画像の読み込み画像番号順に(1から並んで

  • 解決済

    OpenCVを使って動画の書き出しができない

    aviファイルを読み込み,1フレームずつ間隔をSleep関数を用いて変化させて再生速度を変えるプログラムを作っています. 0倍速,等倍速,2倍速,3倍速,4倍速,5倍速の速度を行き

  • 解決済

    二つの画像を一つにするプログラムをvisual studioで行いたいのですがエラーがでます。

    <環境> Windows10 64bit visual studio 2015 opencv 2.4.6 opencv3.4に変更いたしました。 以前質問したリンク内容ので出て

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

  • C++

    3247questions

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

  • Visual Studio

    1699questions

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

  • OpenCV

    969questions

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