2012/11/12

スリットスキャン

概要

まずは以下の動画を観てほしい。

どうだろうか。
これを観た熱心なゴリラは、こう考えるだろう。
かんたんじゃん

解説

1つのフレームの中に、順々に遅れたフレームが存在している。
下から3ピクセルは今のフレーム
その上の3ピクセルは1フレーム前のフレーム
さらにその上の3ピクセルは2フレーム前のフレーム
……
という感じだ。

実装

int main() {
    string filename = "video/a.mp4";
    VideoCapture capture;
    
    //// カメラから入力する
    // capture.open(0);
    // ファイルから入力する
    capture.open(filename);

    Mat capturedImage;
    // 最初のフレームを取得
    capture >> capturedImage;

    // フレームの大きさを調べる
    int width = capturedImage.cols;
    int height = capturedImage.rows;
    cout << width << "x" << height << endl;

    // スリットの高さ
    int slitHeight = 3;
    // 画面をいくつのスリットに分割するか
    int slitCount = height / slitHeight;
    // スリットごとの画像
    vector<Mat> slitImages;

    // メインループ
    while (true) {
        // 次のフレームを取得
        capture >> capturedImage;
        if (capturedImage.empty()) break;

        // スリットの画像をずらす
        slitImages.push_back(capturedImage.clone());
        for (int c = 0; c < slitImages.size()-1; c++)
            slitImages[c] = slitImages[c+1];
        if (slitImages.size() > slitCount) {
            slitImages.pop_back();
        }

        // スリットごとに画像をコピー
        for (int c = 0; c < slitImages.size(); c++) {
            Rect slit(0, slitHeight*c, width, slitHeight);
            Mat(slitImages[c], slit).copyTo(Mat(capturedImage, slit));
        }

        // 表示
        imshow("out", capturedImage);
        // なにかキーが押されたら終了
        if (waitKey(10) != -1) break;
    }

    return 0;
}

出力結果

動画はNHKのを使う。オリジナルはこれだ。

んで、変換後はこれだ。
video

0 件のコメント:

Related Posts Plugin for WordPress, Blogger...