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

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

ただいまの
回答率

91.03%

  • C++

    2928questions

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

  • OpenCV

    828questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 1,182

antlers7515

score 4

aviファイルを読み込み,1フレームずつ間隔をSleep関数を用いて変化させて再生速度を変えるプログラムを作っています.
0倍速,等倍速,2倍速,3倍速,4倍速,5倍速の速度を行き来させたいです.
ビルドはできるのですが,処理速度が大幅にかかった挙句,書き出せれたaviファイルを見ると157KBしかなく再生できません.

環境は,Windows10,OpenCV3-3-0,Visual Studio2015,C++です.

#include "stdafx.h"

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


#include <Windows.h>

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


using namespace std;
using namespace cv;

int main() {
    VideoCapture video("C:\\Users\\yujin\\Desktop\\読み込むファイル.avi");

    VideoWriter writer("C:\\Users\\yujin\\Documents\\書き出すファイル.avi", CV_FOURCC_DEFAULT, 30, cv::Size(4096, 2048), true);
        Mat frame;

        while (1) {
             
            video >> frame;
            Sleep(367);
            // ここから通常速
            video >> frame;
            Sleep(33);

            video >> frame;
            Sleep(33);

            video >> frame;
            Sleep(33);

            video >> frame;
            Sleep(33);

            video >> frame;
            Sleep(33);

            video >> frame;
            Sleep(33);

            video >> frame;
            Sleep(33);

            video >> frame;
            Sleep(33);

            video >> frame;
            Sleep(33);

            video >> frame;
            Sleep(33);

            video >> frame;
            Sleep(33);

            video >> frame;
            Sleep(33);

            // ここから2倍速
            video >> frame;
            Sleep(67);

            video >> frame;
            Sleep(67);

            video >> frame;
            Sleep(67);

            video >> frame;
            Sleep(67);

            video >> frame;
            Sleep(67);

            video >> frame;
            Sleep(67);

            video >> frame;
            Sleep(67);

            video >> frame;
            Sleep(67);

            video >> frame;
            Sleep(67);

            video >> frame;
            Sleep(67);

            video >> frame;
            Sleep(67);

            video >> frame;
            Sleep(67);

            video >> frame;
            Sleep(67);

            // 3倍速
            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            // 4倍速
            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);



            /////////////////////////////////////////////////

            // 5倍速
            video >> frame;
            Sleep(167);

            /////////////////////////////////////////////////

            // 4倍速
            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            video >> frame;
            Sleep(133);

            // 3倍速
            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            video >> frame;
            Sleep(100);

            // ここから2倍速
            video >> frame;
            Sleep(67);

            video >> frame;
            Sleep(67);

            video >> frame;
            Sleep(67);

            video >> frame;
            Sleep(67);

            video >> frame;
            Sleep(67);

            video >> frame;
            Sleep(67);

            video >> frame;
            Sleep(67);

            video >> frame;
            Sleep(67);

            video >> frame;
            Sleep(67);

            video >> frame;
            Sleep(67);

            video >> frame;
            Sleep(67);

            video >> frame;
            Sleep(67);

            video >> frame;
            Sleep(67);

            // ここから通常速
            video >> frame;
            Sleep(33);

            video >> frame;
            Sleep(33);

            video >> frame;
            Sleep(33);

            video >> frame;
            Sleep(33);

            video >> frame;
            Sleep(33);

            video >> frame;
            Sleep(33);

            video >> frame;
            Sleep(33);

            video >> frame;
            Sleep(33);

            video >> frame;
            Sleep(33);

            video >> frame;
            Sleep(33);

            video >> frame;
            Sleep(33);

            video >> frame;
            Sleep(33);


            // 停止
            video >> frame;
            Sleep(367);
            //フレームが空か、ボタンが押された時か一周したときに出る。
            if (frame.empty() || waitKey(30) >= 0 || video.get(CV_CAP_PROP_POS_AVI_RATIO) == 1) {
                break;
            }
        }
        writer <<frame;
        imshow("Video", frame);
        waitKey(1);
    }
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+8

ちょっとこれは... 一から勉強しなおせって回答はダメですかね?

  • 延々と続くコピペコード
    for文って見たことないですか?
  • 毎度上書きされるframe
    最後のwriter << frame;は『おまじない』ではないのですが...
  • 『処理速度が大幅にかかった挙句』
    Sleep関数は処理をいったん停止させる機能ですから、当然です。
  • 『書き出せれたaviファイルを見ると157KBしかなく再生できません.』
    writer << frame;が一回しか実行されていないので、画像一枚分しか保存されていません。

保存時にフレームレートを変える方法は、私は知りません。
しかし、このコードをちょっと書き換えたところで絶対に上手くいかないことは断言できます。

(解決法に関しては、前回質問でChironianさんに有益な助言を受けていたはず。)


0倍速,等倍速,2倍速,3倍速,4倍速,5倍速の速度を行き来させたい

0倍速だと動画として成立しないのでは?


まずは簡単なプログラムから試すべきです。
読み込んだaviファイルのフレームレートを半減させて出力するコードとか。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+4

1フレームずつ間隔をSleep関数を用いて変化させて再生速度を変える

致命的な誤解だけ指摘します。Sleep関数は「そのプログラム実行時に該当プログラムの実行を一時停止させる」だけであり、OpenCV経由で出力した「動画ファイルに保持される再生速度」には全く影響しません。まずは両者の違いを正しく認識されるべきです。あとは LouiS0616 さん回答内容に同意見です。

私が知る限り、残念ながら、OpenCVではあなたの望む動画ファイルを出力することは不可能と思います。ただし「一定周期でフレームを間引く(捨てる)」もしくは「同じフレームを複製(繰り返す)する」ことで、似たような挙動を実現することは可能です。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

checkベストアンサー

+1

倍速間引いて取得するという考えでよいと思います。また0倍速=静止と解釈しました。
以下は、概念コードです。
読込元と書込先のフレーム番号を出力しています。

#include <iostream>

// ダミーのクラス群
class Mat{
public:
    int m_frame;
    Mat(int frame=-1):m_frame(frame){}
};
class VideoCapture{
public:
    int m_frame;
    VideoCapture():m_frame(0){}
    VideoCapture& operator>>( Mat &m){ m = m_frame++; return *this;}
};
class VideoWriter{
public:
    int m_frame;
    VideoWriter():m_frame(0){}
    VideoWriter & operator<<(const Mat &m){
        std::cout << "dst[" << m_frame << "],src[" << m.m_frame << "]" << std::endl;
        m_frame++;
        return *this;
    }
};

// ratio倍速のフレーム画像を取得
Mat getImage( VideoCapture &src, int ratio)
{
    // 倍速=間引いて取得する
    Mat frame(-1);
    for( int i = 0; i < ratio; i++){
        src >> frame;
    }
    return frame;
}

int main() {
    VideoCapture video;
    VideoWriter writer;
    Mat frame = getImage( video, 1);
    for( int i = 0; i < 60; i++){
        // 10frameごとに0,1,2...倍速の画像を書き込む
        int ratio = i / 10;
        if( i % 10 == 0){
            std::cout << "ratio=" << ratio << std::endl;
        }
        if( ratio > 0){    // 0倍速=取得不要
            frame = getImage( video, ratio);
        }
        writer << frame;
    }
    return 0;
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/16 17:12

    大変ご丁寧な回答ありがとうございます.
    0倍速=静止でございます.
    読み込むファイルと書き出しを指定するファイルはどこに書き加えるといいでしょうか?

    キャンセル

  • 2017/11/16 17:53

    理解を助けるための概念コードですので、単純に書き加えることでは完成(動作)はしません。
    まずは他の回答者の方が指摘されている点について学び、理解する必要があります。
    そのうえでご自身の書いたコードに組み込んでください。

    キャンセル

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

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

関連した質問

  • 解決済

    opencvのcvConvertScaleAbs関数エラーを直したい

    こんにちは。 どうしても解決できず、ずっと悩んでいるのでご助力いただけないかと思い投稿しました。 前提・実現したいこと XcodeでC++、opencvを用いて行列操作を

  • 解決済

    opencvでの画像の読み込み

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

  • 解決済

    opencvの連番読み込み

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

  • 解決済

    動画から静止画切り出し

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

  • 解決済

    opencvの動画再生について

    opencvで動画を再生させるときにキー入力によって再生する位置を変えようとしています。コードは以下のようになっています。エラーなく動きますがとても動画の速さが遅くなります。またキ

  • 解決済

    opencv 動画 再生

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

  • 解決済

    OpenCvSharp3で重心を求めたいです

    以下のように、ラベリングを実行するプログラムはできたのですが、ここから重心の座標や面積を求めるプログラムを作成したいです。どなたか、教えていただけますか? 最終的な目標としては

  • 解決済

    OpenCVで画像を表示後、暫くすると経過すると勝手に画像がカラーから白黒に変化してしまう。

    OpenCVで画像を表示後、10秒くらい経過すると、画像がカラーから白黒に勝手に変化します。 cv2.waitKey(0)で、KEYの入力待ちを継続している場合は、このようなことは

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

  • C++

    2928questions

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

  • OpenCV

    828questions

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