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

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

ただいまの
回答率

90.99%

  • C++

    2940questions

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

  • Visual Studio

    1498questions

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

  • OpenCV

    831questions

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

連番の画像から作った動画の再生速度を正弦波状に変化させたい

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 343

antlers7515

score 4

C++

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

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

本題ですが,一定速度で再生する動画はできたのですが,速度を正弦波状に変化させる動画ができません.
再生速度が早かったり遅かったりとなる感じにしたいです.
イメージは,横軸をt(経過時間),縦軸をv(再生速度)とすると,
v=asinωt + a (aは振幅)
とします.
v=0のとき最小となり,完全に停止させたいです.

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

#pragma warning (disable : 4996)
#include "stdafx.h"

#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\\□□□.wmv", VideoWriter::fourcc('W', 'M', 'V', '1'), 30.0, Size(4088, 2048));
//動画ファイルがちゃんと作れたかの判定。
if (!writer.isOpened()) { return -1; }

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

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

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

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

    return 0;
}

回答は,追加する1部だけでなく全体のプログラムを添付していただきたいです.
訂正部分もご一緒に教えていただけると幸いです.

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+4

こんにちは。

「ゆっくり再生する」という意味は、「時間経過が少ない」=「画像の変化が少ない」ということです。
用意できる画像として同じ時間が経過した一連の画像しかない場合、間の画像を補間できるようなツールを用意する、もしくは、同じ画像を表示し続けるしかないと思います。

実用に足る補間ツールがあるかどうか把握していませんので、補間なしでやると仮定します。
また、簡単のため、最速の時は30fpsで表示し、最遅の時は0fps、周期360秒とし、かつ、30fpsでエンコードすると仮定します。

開始した瞬間最速の30fpsとした場合、その1秒間は30fpsでそのまま表示すれば良いですね。
次の1秒間は1度だけ進んでいるので(cos(1度)+1)/2*30fpsで計算した速度で表示することになります。仮に29fpsだったとすると1秒間で29枚更新すれば良いですね。表示は30fps固定ですから、29枚の内どれか1枚を2回表示すれば良いです。
同様の考え方で速度が遅い時は、不足する枚数分の画像を繰り返し表示すれば良いです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/10/19 13:23

    回答ありがとうございます.
    こちらの方法を,当方のプログラムに当てはめるとどうなりますか?
    なお周期と最速に関しましては,数字を変えるだけで自在に変更できるようにしたいです.
    お手数ですが,コード全体を書いていただけると非常に助かります.

    キャンセル

  • 2017/10/19 16:27

    数日くらい時間がかかる作業と思います、私にとってボランティアでやれる範疇を大きく超えていますのでご辞退いたします。

    キャンセル

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

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

関連した質問

  • 解決済

    opencvでの画像の回転

    opencvを用いて読み込んだ画像の回転を行っています。 以下のプログラムで画像の回転を行い実行できたのですが、 画像が回転し、元の画像の場所が黒く表示されるのが気に入りません

  • 解決済

    opencvの連番読み込み

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

  • 解決済

    動画から静止画切り出し

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

  • 解決済

    opencv 動画 再生

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

  • 受付中

    カメラで青い円を検出

    #include <stdio.h> #include <stdlib.h> #include <highgui.h> #include <cv.h> #include <cxco

  • 解決済

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

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

  • 解決済

    OpenCVによる画像マッチング

    前提・実現したいこと VisualStudio15 2017上でOpenCVを動かし、SIFT特徴量を用いた画像マッチングに取り組もうと思っています。 しかし、コンパイルで以下のエ

  • 解決済

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

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

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

  • C++

    2940questions

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

  • Visual Studio

    1498questions

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

  • OpenCV

    831questions

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