1 #include "opencv2/opencv.hpp" 2 #include 3 4 using namespace std; 5 using namespace cv; 6 7 const int MAX_FEATURES = 500; 8 const int MAX_MOVEMENT = 100; 9 0 int move_test(Mat& oframe, Mat& frame) { 1 // Select features for optical flow 2 vector ofeatures; 3 goodFeaturesToTrack(oframe, 4 ofeatures, MAX_FEATURES, 0.1, 0.2 ); 5 6 // Parameters for LK 7 vector new_features; 8 vector status; 9 vector err; 0 TermCriteria criteria(TermCriteria::COUNT 1 | TermCriteria::EPS, 20, 0.03); 2 Size window(10,10); 3 int max_level = 3; 4 int flags = 0; 5 double min_eigT = 0.004; 6 7 // Lucas-Kanade method 8 calcOpticalFlowPyrLK(oframe, frame, 9 ofeatures, new_features, status, err, 0 window, max_level, criteria, flags, 1 min_eigT ); 2 3 double max_move = 0; 4 double movement = 0; 5 for(int i=0; i max_move) 3 max_move = movement; 4 } 5 return max_move > MAX_MOVEMENT; 6 } 7 8 int frames_skip( VideoCapture vid, int n, int *i ) { 9 for( int c = 0; c < n; c++ ) { 0 if (!vid.grab()) 1 break; 2 (*i)++; 3 } 4 } 5 6 int main(int argc, char *argv[]) { 7 int i = 0; 8 Mat frame; 9 Mat cframe; 0 Mat oframe; 1 2 if (argc != 2) { 3 cout << "USAGE: \n"; 4 return -1; 5 } 6 7 VideoCapture vid(argv[1]); 8 if (!vid.isOpened()) { 9 cout << "Video corrupt\n"; 0 return -1; 1 } 2 3 int fps = (int)vid.get(CV_CAP_PROP_FPS); 4 5 i++; 6 if(!vid.read(oframe)) return 1; 7 8 cvtColor(oframe, oframe, COLOR_BGR2GRAY); 9 0 while (1) { 1 if (!vid.read(frame)) 2 break; 3 i++; 4 5 int movie_second = i / fps; 6 7 cframe = frame.clone(); 8 cvtColor(frame,frame,COLOR_BGR2GRAY); 9 if(move_test(oframe, frame)) { 0 cout << movie_second << "\n"; 1 2 char filename[80]; 3 sprintf( filename, "%04d.jpg", i/fps ); 4 imwrite( filename, cframe ); 5 6 frames_skip( vid, 2*fps, &i ); 7 } else { 8 // fast-forward to next 1/2 sec 9 frames_skip( vid, fps/2, &i ); 0 } 1 2 oframe = frame; 3 } 4 5 return 0; 6 }