#ifndef ROTOR_FILTERS #define ROTOR_FILTERS #include "rotor.h" namespace Rotor { class Blur: public Image_node { public: Blur(){ title="Blur"; description="Gaussian blur filter"; create_parameter("size","number","Blur window size","Size",1.0); create_image_input("image input","Image input"); NODEID="36.0412-2d0b-11e3-b86b-a31ab5838db2"; }; Blur(map &settings):Blur() { base_settings(settings); }; ~Blur(){ }; Blur* clone(map &_settings) { return new Blur(_settings);}; Image *output(const Frame_spec &frame){ Image *in=image_inputs[0]->get(frame); if (in) { int ksize=max((ceil(parameters["size"]->value/2.0)*2)+1,1.0); //nb this doesn't do the intended: create 'continuously variable' blur cv::GaussianBlur((*in).rgb,image.rgb,cvSize(ksize,ksize),parameters["size"]->value); return ℑ } return nullptr; } private: double size; }; class VHS: public Image_node { public: VHS(){ title="VHS"; description="VHS degradation filter"; create_parameter("generation_loss","number","VHS generation loss amount","Generation loss",1.0); create_image_input("image input","Image input"); NODEID="3f62bdb0-2d0b-11e3-a4eb-a712839b837d"; }; VHS(map &settings):VHS() { base_settings(settings); }; ~VHS(){ }; VHS* clone(map &_settings) { return new VHS(_settings);}; Image *output(const Frame_spec &frame){ Image *in=image_inputs[0]->get(frame); if (in) { cvtColor(in->rgb, hsv, CV_RGB2YUV); vector chans; split(hsv,chans); int ksize=max((ceil(parameters["generation_loss"]->value/2.0)*2)+1,1.0); //no blurring in place? GaussianBlur(chans[2],chans[2],cvSize(ksize,ksize),parameters["generation_loss"]->value); GaussianBlur(chans[1],chans[1],cvSize(ksize,ksize),parameters["generation_loss"]->value); //if (ksize>7) GaussianBlur(chans[0],chans[0],cvSize(ksize/4,ksize/4),parameters["generation_loss"]->value/4); merge(chans,hsv); cvtColor(hsv, image.rgb, CV_YUV2RGB); return ℑ } return nullptr; } private: double size; cv::Mat hsv,hsv1; }; } #endif