映像ファイルを固定フレーム間隔で別ファイル出力するコード
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; }