OpenCVによるビデオファイルの2値化と平滑化,ビデオ保存 C++プログラミング入門 しおたに・ドット・チャイナ

006.png

HOME > OpenCVによるビデオファイルの2値化と平滑化,ビデオ保存

OpenCVによるビデオファイルの2値化と平滑化,ビデオ保存

OpenCVによるビデオファイルの2値化と平滑化,ビデオ保存


//
//ビデオファイルの2値化とガウシアン平滑化,ビデオ保存
//
// Copyright(c) 2012 shiotani.cn All Rights Reserved.
//
//前準備
//1.ファイル>新規作成>プロジェクト>VisualC++>Win32コンソールアプリケーション
//2.プロジェクト>プロパティ>構成プロパティ>全般>文字セット>設定なし
//3.プロジェクト>プロパティ>構成プロパティ>C/C++>全般>追加のインクルードディレクトリ>C:\OpenCV2.3\include
//
//VC++フォルダ内にビデオファイル(動画ファイルVideo_in.swf)を設置する
//

#include "stdafx.h"
#include "opencv2/opencv.hpp"

#pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_core231d.lib")
#pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_imgproc231d.lib")
#pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_highgui231d.lib")
#pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_calib3d231d.lib")
#pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_contrib231d.lib")
#pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_features2d231d.lib")
#pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_flann231d.lib")
#pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_gpu231d.lib")
#pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_legacy231d.lib")
#pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_ml231d.lib")
#pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_objdetect231d.lib")
#pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_ts231d.lib")
#pragma comment(lib,"C:\\OpenCV2.3\\lib\\opencv_video231d.lib")


int _tmain(int argc, _TCHAR* argv[])
{
    char* wnd_name1 ="Input";                           // 表示Window識別名の宣言
    char* wnd_name2 ="Grayscale";                       // 表示Window識別名の宣言
    char* wnd_name3 ="OutPut";                          // 表示Window識別名の宣言
    int key;

    CvCapture* src; // ビデオキャプチャ宣言
    CvVideoWriter* rec_gray;                            // ビデオライタ宣言
    CvVideoWriter* rec_out;                             // ビデオライタ宣言
    IplImage* img_in; // 出力画像構造体宣言
    IplImage* img_gray;                                 // 出力画像構造体宣言
    IplImage* img_out; // 出力画像構造体宣言

    cvNamedWindow(wnd_name1);                           // 表示Window作成
//    cvResizeWindow(wnd_name1, 500, 500);                // 表示Windowサイズ変更
    cvNamedWindow(wnd_name2);                           // 表示Window作成
//    cvResizeWindow(wnd_name2, 500, 500);                // 表示Windowサイズ変更
    cvNamedWindow(wnd_name3);                           // 表示Window作成
//    cvResizeWindow(wnd_name3, 500, 500);                // 表示Windowサイズ変更

    src=cvCaptureFromFile("Video_in.swf");              // ビデオファイル映像取得

    if(src==NULL) // ビデオファイルが見つからない時
    {
        printf("There is NOT the Video File.\n");
        cvWaitKey(0); // キー入力待ち
        return -1;
    }


    img_in =cvQueryFrame(src);                          // 初期フレーム取得
    img_gray=cvCreateImage(cvSize(img_in->width,img_in->height), IPL_DEPTH_8U,1);  // グレースケール
    img_out =cvCreateImage(cvSize(img_in->width,img_in->height), IPL_DEPTH_8U,3);  // カラー
//    img_out=cvCloneImage(img_in);                       // 出力画像領域確保(入力画像を複製)


    //ビデオファイル書込み設定
//    rec=cvCreateVideoWriter("Video_out.avi",CV_FOURCC('X','V','I','D'),30,
cvSize(img_in->width,img_in->height)); // aviファイル
    rec_gray=cvCreateVideoWriter("Video_out1.swf",CV_FOURCC('F','L','V','1'),30,
cvSize(img_in->width,img_in->height)); // FLVファイル
    rec_out =cvCreateVideoWriter("Video_out2.swf",CV_FOURCC('F','L','V','1'),30,
cvSize(img_in->width,img_in->height)); // FLVファイル

    while(1){
        if(img_in==NULL) break;                          // ビデオファイル終了時
        
        img_in=cvQueryFrame(src);                        // 1フレーム取得

        cvCvtColor(img_in, img_gray, CV_BGR2GRAY);       // グレースケールへ変換
        cvThreshold(img_gray,img_gray, 64, 255, CV_THRESH_BINARY);  // 2値化
        cvCvtColor(img_gray, img_out, CV_GRAY2BGR);     // 3チャネル(RGB)画像へ変換(ビデオファイル保存時に必須)

        cvWriteFrame(rec_gray, img_out);                // 1フレーム書込み

        cvSmooth(img_out,img_out,CV_GAUSSIAN,11,11,3);  // ガウシアン平滑化

        cvShowImage(wnd_name1,img_in);                   // 1フレームWindow表示
        cvShowImage(wnd_name2,img_gray);                 // 1フレームWindow表示
        cvShowImage(wnd_name3,img_out);                  // 1フレームWindow表示

        cvWriteFrame(rec_out, img_out);                  // 1フレーム書込み


        key=cvWaitKey(33);                               // キー入力待ち(33ms)
        if(key==27)break;                                // ESCキー入力で終了
    }


    cvDestroyAllWindows();                               // 表示Windowを破棄
    cvReleaseCapture(&src);                              // 画像構造体の解放
    cvReleaseVideoWriter(&rec_gray);                     // ビデオライタの解放
    cvReleaseVideoWriter(&rec_out);                      // ビデオライタの解放
    cvReleaseImage(&img_gray);                           // 画像構造体の解放
    cvReleaseImage(&img_out);                            // 画像構造体の解放

    return 0;
}

あらかじめパソコンに保存してあるビデオファイル「Video_in.swf」をOpenCVで読込み,2値化し,平滑化したものをビデオファイルとして保存します.

読み込んだビデオファイル

2値化した出力ビデオファイル

2値化後,平滑化した出力ビデオファイル

cvCvtColor(img_in, img_gray, CV_BGR2GRAY); で,グレースケールへと変換させています.


cvThreshold(img_gray,img_gray, 64, 255, CV_THRESH_BINARY); で,64を閾値として2値化しています.


cvCvtColor(img_gray, img_out, CV_GRAY2BGR); では,ビデオファイルへの書き込みは 3チャネル(RGB)画像でないといけないので,3チャネル(RGB)へ変換しています.