summaryrefslogtreecommitdiff
path: root/rotord/src/nodes_filters.h
blob: 2b8f7870256eb696cd54cf5a60997e45219b60b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#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<string,string> &settings):Blur() {
				base_settings(settings);
			};
			~Blur(){
			};
			Blur* clone(map<string,string> &_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 &image;
			    }
				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<string,string> &settings):VHS() {
				base_settings(settings);
			};
			~VHS(){
			};
			VHS* clone(map<string,string> &_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<cv::Mat> 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 &image;
			    }
				return nullptr;
			}
		private:
			double size;
			cv::Mat hsv,hsv1;
	};

}


#endif