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)へ変換しています.