diff options
| author | Tim Redfern <tim@eclectronics.org> | 2013-08-30 12:20:25 +0100 |
|---|---|---|
| committer | Tim Redfern <tim@eclectronics.org> | 2013-08-30 12:20:25 +0100 |
| commit | 9570eb7a5eb70128f7b986a281dd163263858ba1 (patch) | |
| tree | 50c682657dc59422491f894e799e3da634abd4cd /rotord/src/rotor.h | |
| parent | 3a66eefd5021f3f93d2f2ce7a10d8c31dafa76d8 (diff) | |
@track time
Diffstat (limited to 'rotord/src/rotor.h')
| -rwxr-xr-x | rotord/src/rotor.h | 156 |
1 files changed, 17 insertions, 139 deletions
diff --git a/rotord/src/rotor.h b/rotord/src/rotor.h index 2b18061..cb466d2 100755 --- a/rotord/src/rotor.h +++ b/rotord/src/rotor.h @@ -303,6 +303,23 @@ namespace Rotor { return time.time/time.duration; } }; + class At_track_time: public Signal_node { + public: + At_track_time(){ + create_signal_input("signal","Signal Input"); + create_parameter("time","number","Track time to evaluate","Time",0.0f); + title="@Track time"; + description="Gets input from a different point in the track"; + }; + At_track_time(map<string,string> &settings): At_track_time() { + base_settings(settings); + }; + At_track_time* clone(map<string,string> &_settings) { return new At_track_time(_settings);}; + const float output(const Time_spec &time) { + Time_spec t=Time_spec(parameters["time"]->value*time.duration,time.framerate,time.duration); + return inputs[0]->get(t); + } + }; class Signal_output: public Signal_node { public: Signal_output(){ @@ -678,145 +695,6 @@ namespace Rotor { } private: }; - #define TRANSFORM_nearest 1 - #define TRANSFORM_linear 2 - #define TRANSFORM_area 3 - #define TRANSFORM_cubic 4 - #define TRANSFORM_lanczos 5 - class Transform: public Image_node { - //what is the best coordinate system to use? - //origin: corner or centre - //units: pixel or fractional - //aspect: scaled or homogenous - public: - Transform(){ - create_image_input("image input","Image input"); - create_parameter("transformX","number","X transformation","Transform X",0.0f); - create_parameter("transformY","number","Y transformation","Transform X",0.0f); - create_parameter("originX","number","X transformation origin","Origin X",0.5f); - create_parameter("originY","number","Y transformation origin","Origin Y",0.5f); - create_parameter("rotation","number","Rotation about origin","Rotation",0.0f); - create_parameter("scale","number","Scale about origin","Scale",1.0f); - create_attribute("filter","Filtering mode","Filter mode","linear",{"nearest","linear","area","cubic","lanczos"}); - title="Transform"; - description="Apply 2D transformation"; - }; - Transform(map<string,string> &settings):Transform() { - base_settings(settings); - }; - ~Transform(){ - }; - Transform* clone(map<string,string> &_settings) { return new Transform(_settings);}; - Image *output(const Frame_spec &frame){ - Image *in=image_inputs[0]->get(frame); - if (in){ - int filtmode; - switch(attributes["filter"]->intVal){ - case TRANSFORM_nearest: - filtmode=cv::INTER_NEAREST; - break; - case TRANSFORM_linear: - filtmode=cv::INTER_LINEAR; - break; - case TRANSFORM_area: - filtmode=cv::INTER_AREA; - break; - case TRANSFORM_cubic: - filtmode=cv::INTER_CUBIC; - break; - case TRANSFORM_lanczos: - filtmode=cv::INTER_LANCZOS4; - break; - } - - float tX=parameters["transformX"]->value; - float tY=parameters["transformY"]->value; - float oX=parameters["originX"]->value; - float oY=parameters["originY"]->value; - float r=parameters["rotation"]->value; - float s=parameters["scale"]->value; - - //do opencv transform - cv::Point2f srcTri[3], dstTri[3]; - cv::Mat rot_mat(2,3,CV_32FC1); - cv::Mat trans_mat(2,3,CV_32FC1); - - Image inter; - inter.setup(in->w,in->h); - // Compute matrix by creating triangle and transforming - //is there a better way - combine the 2? Just a bit of geometry - srcTri[0].x=0; - srcTri[0].y=0; - srcTri[1].x=in->w-1; - srcTri[1].y=0; - srcTri[2].x=0; - srcTri[2].y=in->h-1; - for (int i=0;i<3;i++){ - dstTri[i].x=srcTri[i].x+(tX*in->w); - dstTri[i].y=srcTri[i].y+(tY*in->h); - } - trans_mat=getAffineTransform( srcTri, dstTri ); - warpAffine( in->rgb, inter.rgb, trans_mat, inter.rgb.size(), filtmode, cv::BORDER_WRAP); - - - // Compute rotation matrix - // - cv::Point centre = cv::Point( oX*in->w, oY*in->h ); - - rot_mat = getRotationMatrix2D( centre, r, s ); - // Do the transformation - // - - warpAffine( inter.rgb, image.rgb, rot_mat, image.rgb.size(), filtmode, cv::BORDER_WRAP); - //BORDER_WRAP - - //INTER_NEAREST - a nearest-neighbor interpolation - //INTER_LINEAR - a bilinear interpolation (used by default) - //INTER_AREA - resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method. - //INTER_CUBIC - a bicubic interpolation over 4x4 pixel neighborhood - //INTER_LANCZOS4 - a Lanczos interpolation over 8x8 pixel neighborhood - - return ℑ - } - return nullptr; - } - private: - }; - class Still_image: public Image_node { - public: - Still_image(){ - create_parameter("transformX","number","X transformation","Transform X",0.0f); - create_parameter("transformY","number","Y transformation","Transform X",0.0f); - create_parameter("originX","number","X transformation origin","Origin X",0.5f); - create_parameter("originY","number","Y transformation origin","Origin Y",0.5f); - create_parameter("rotation","number","Rotation about origin","Rotation",0.0f); - create_parameter("scale","number","Scale about origin","Scale",1.0f); - create_attribute("filter","Filtering mode","Filter mode","linear",{"nearest","linear","area","cubic","lanczos"}); - create_attribute("filename","name of image file to load","File name",""); - title="Still image"; - description="Load a still image and apply 2D transformation"; - }; - Still_image(map<string,string> &settings):Still_image() { - base_settings(settings); - if (attributes["filename"]->value!=""){ - string filewithpath=find_setting(settings,"media_path","")+attributes["filename"]->value; - if (image.read_file(filewithpath)) { - cerr<<"Still_image: loaded "<<filewithpath<<endl; - } - else cerr<<"Still_image: could not load "<<filewithpath<<endl; - } - }; - ~Still_image(){ - }; - Still_image* clone(map<string,string> &_settings) { return new Still_image(_settings);}; - Image *output(const Frame_spec &frame){ - if (!image.rgb.empty()){ - - } - else return nullptr; - } - private: - }; class Alpha_merge: public Image_node { public: Alpha_merge(){ |
