映像ファイルを固定フレーム間隔で別ファイル出力するコード

avisplit.exe C:\data\Video\b9e3c8b14423.avi C:\data\Video\test 90

と実行すると,0-90.avi,90-180.avi なんていう,90 フレームの映像ファイルが c:\data\video\test に出力される.10000 フレームのとある映像について 90 区切りを試したら,うまくいったみたい.

#include <stdio.h>
#include <string.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>

#ifdef _DEBUG
#pragma comment( lib, "cv200d.lib" )
#pragma comment( lib, "cxcore200d.lib" )
#pragma comment( lib, "highgui200d.lib" )
#else
#pragma comment( lib, "cv200.lib" )
#pragma comment( lib, "cxcore200.lib" )
#pragma comment( lib, "highgui200.lib" )
#endif

cv::VideoCapture inVideo;
cv::VideoWriter outVideo;
int eachframe;

// 映像のプロパティ
CvSize inVideoSize;
int frameCount;
int fps;
const int AVISplitFourcc = CV_FOURCC( 'D','I','B',' ' );

// 出力ファイル
const int OutVideoFilenameBufferSize = 256;
char outVideoFilename[OutVideoFilenameBufferSize];

cv::Mat still;

void printUsage( void )
{
	printf("\n");
	printf("映像ファイルを N フレームごとに分割出力する\n");
	printf("\n");
	printf("avisplit inVideo outDir 数値\n");
	printf("\n");
}

bool isArgOK( int argc, char *argv[] )
{
	if ( argc < 4 )
	{
		printf("パラメータ数不足\n");
		return false;
	}

	// 入力映像読込とチェック
	inVideo.open( argv[1] );
	if ( inVideo.isOpened() == false )
	{
		printf("inVideo を読み込めない\n");
		return false;
	}

	// eachframe のチェック
	eachframe = atoi( argv[3] );
	if ( eachframe < 1 )
	{
		printf("第3引数が 0 以下\n");
		return false;
	}

	return true;
}

int main ( int argc, char *argv[] )
{
	// パラメータチェック
	if ( isArgOK( argc, argv ) == false )
	{
		printUsage();
		return 0;
	}

	// 映像ファイルのプロパティを取得
	inVideoSize = cv::Size(
		(int) inVideo.get(CV_CAP_PROP_FRAME_WIDTH),
		(int) inVideo.get(CV_CAP_PROP_FRAME_HEIGHT)
		);
	frameCount = ( int ) inVideo.get(CV_CAP_PROP_FRAME_COUNT);
	fps = ( int ) inVideo.get(CV_CAP_PROP_FPS);

	for ( int fileCount = 0; ; fileCount++ )
	{
		// 出力ファイル名を作成.0-30.avi みたいになる
		sprintf_s( outVideoFilename, OutVideoFilenameBufferSize,
			"%s\\%d-%d.avi", argv[2], fileCount*eachframe, (fileCount+1)*eachframe );
		// ビデオライタ生成
		outVideo.open( outVideoFilename, AVISplitFourcc, fps, inVideoSize );
		if ( outVideo.isOpened() == false )
		{
			printf("ファイル出力できない:%s\n", outVideoFilename);
			break;
		}
		// フレームコピー
		for ( int n = 0; n < eachframe; n++ )
		{
			inVideo >> still;
			if ( still.empty() == true )
			{
				printf("映像終端に達した\n");
				break;
			}
			outVideo << still;
		}
		if ( still.empty() == true )
		{
			break;
		}
	}


	return 0;
}