1 /* 2 * motiondetect.h 3 * 4 * Copyright (C) Georg Martius - February 2011 5 * georg dot martius at web dot de 6 * Copyright (C) Alexey Osipov - Jule 2011 7 * simba at lerlan dot ru 8 * speed optimizations (threshold, spiral, SSE, asm) 9 * 10 * This file is part of vid.stab video stabilization library 11 * 12 * vid.stab is free software; you can redistribute it and/or modify 13 * it under the terms of the GNU General Public License, 14 * as published by the Free Software Foundation; either version 2, or 15 * (at your option) any later version. 16 * 17 * vid.stab is distributed in the hope that it will be useful, 18 * but WITHOUT ANY WARRANTY; without even the implied warranty of 19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 * GNU General Public License for more details. 21 * 22 * You should have received a copy of the GNU General Public License 23 * along with GNU Make; see the file COPYING. If not, write to 24 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 25 * 26 */ 27 28 #ifndef MOTIONDETECT_H 29 #define MOTIONDETECT_H 30 31 #include <stddef.h> 32 #include <stdlib.h> 33 34 #include "transformtype.h" 35 #include "vidstabdefines.h" 36 #include "vsvector.h" 37 #include "frameinfo.h" 38 39 typedef struct _vsmotiondetectconfig { 40 /* meta parameter for maxshift and fieldsize between 1 and 15 */ 41 int shakiness; 42 int accuracy; // meta parameter for number of fields between 1 and 10 43 int stepSize; // stepsize of field transformation detection 44 int algo; // deprecated 45 int virtualTripod; 46 /* if 1 and 2 then the fields and transforms are shown in the frames */ 47 int show; 48 /* measurement fields with lower contrast are discarded */ 49 double contrastThreshold; 50 const char* modName; // module name (used for logging) 51 } VSMotionDetectConfig; 52 53 /** structure for motion detection fields */ 54 typedef struct _vsmotiondetectfields { 55 /* maximum number of pixels we expect the shift of subsequent frames */ 56 int maxShift; 57 int stepSize; // stepsize for detection 58 int fieldNum; // number of measurement fields 59 int maxFields; // maximum number of fields used (selected by contrast) 60 double contrastThreshold; // fields with lower contrast are discarded 61 int fieldSize; // size = min(md->width, md->height)/10; 62 int fieldRows; // number of rows 63 Field* fields; // measurement fields 64 short useOffset; // if true then the offset us used 65 VSTransform offset; // offset for detection (e.g. known from coarse scan) 66 } VSMotionDetectFields; 67 68 /** data structure for motion detection part of deshaking*/ 69 typedef struct _vsmotiondetect { 70 VSFrameInfo fi; 71 72 VSMotionDetectConfig conf; 73 74 VSMotionDetectFields fieldscoarse; 75 VSMotionDetectFields fieldsfine; 76 77 VSFrame curr; // blurred version of current frame buffer 78 VSFrame currorig; // current frame buffer (original) (only pointer) 79 VSFrame currtmp; // temporary buffer for blurring 80 VSFrame prev; // frame buffer for last frame (copied) 81 short hasSeenOneFrame; // true if we have a valid previous frame 82 int initialized; // 1 if initialized and 2 if configured 83 84 int frameNum; 85 } VSMotionDetect; 86 87 static const char vs_motiondetect_help[] = "" 88 "Overview:\n" 89 " Generates a file with relative transform information\n" 90 " (translation, rotation) about subsequent frames." 91 " See also transform.\n" 92 "Options\n" 93 " 'result' path to the file used to write the transforms\n" 94 " (def:inputfile.stab)\n" 95 " 'shakiness' how shaky is the video and how quick is the camera?\n" 96 " 1: little (fast) 10: very strong/quick (slow) (def: 5)\n" 97 " 'accuracy' accuracy of detection process (>=shakiness)\n" 98 " 1: low (fast) 15: high (slow) (def: 9)\n" 99 " 'stepsize' stepsize of search process, region around minimum \n" 100 " is scanned with 1 pixel resolution (def: 6)\n" 101 " 'mincontrast' below this contrast a field is discarded (0-1) (def: 0.3)\n" 102 " 'tripod' virtual tripod mode (if >0): motion is compared to a \n" 103 " reference frame (frame # is the value) (def: 0)\n" 104 " 'show' 0: draw nothing (def); 1,2: show fields and transforms\n" 105 " in the resulting frames. Consider the 'preview' filter\n" 106 " 'help' print this help message\n"; 107 108 109 /** returns the default config 110 */ 111 VSMotionDetectConfig vsMotionDetectGetDefaultConfig(const char* modName); 112 113 /** initialized the VSMotionDetect structure and allocates memory 114 * for the frames and stuff 115 * @return VS_OK on success otherwise VS_ERROR 116 */ 117 int vsMotionDetectInit(VSMotionDetect* md, const VSMotionDetectConfig* conf, 118 const VSFrameInfo* fi); 119 120 /** 121 * Performs a motion detection step 122 * Only the new current frame is given. The last frame 123 * is stored internally 124 * @param motions: calculated local motions. (must be deleted manually) 125 * */ 126 int vsMotionDetection(VSMotionDetect* md, LocalMotions* motions, VSFrame *frame); 127 128 /** Deletes internal data structures. 129 * In order to use the VSMotionDetect again, you have to call vsMotionDetectInit 130 */ 131 void vsMotionDetectionCleanup(VSMotionDetect* md); 132 133 /// returns the current config 134 void vsMotionDetectGetConfig(VSMotionDetectConfig* conf, const VSMotionDetect* md); 135 136 /// returns the frame info 137 const VSFrameInfo* vsMotionDetectGetFrameInfo(const VSMotionDetect* md); 138 139 #endif /* MOTIONDETECT_H */ 140 141 /* 142 * Local variables: 143 * c-file-style: "stroustrup" 144 * c-file-offsets: ((case-label . *) (statement-case-intro . *)) 145 * indent-tabs-mode: nil 146 * c-basic-offset: 2 t 147 * End: 148 * 149 * vim: expandtab shiftwidth=2: 150 */ 151