-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfilter.py
127 lines (97 loc) · 3.87 KB
/
filter.py
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import numpy as nump
import cv2
from utils import CFEVideoConf, img_resize
capture = cv2.VideoCapture(0)
fps = 30
path = 'saved-media/filter.mp4'
configure = CFEVideoConf(capture, filepath=path, res='480p')
output = cv2.VideoWriter(path, configure.video_type, fps, configure.dims)
def alpha_channel(frame):
try:
frame.shape[3] # looking for the channel
except IndexError:
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2BGRA)
return frame
def hue_saturation(frame, alpha, beta):
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
h, s, v = cv2.split(hsv)
s.fill(199)
v.fill(255)
hsv = cv2.merge([h, s, v])
out = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
frame = alpha_channel(frame)
out = alpha_channel(out)
cv2.addWeighted(out, 0.25, frame, 1.0, .23, frame)
return frame
def color_overlay(frame, intensity=0.5, blue=0, green=0, red=0):
frame = alpha_channel(frame)
frame_h, frame_w, frame_c = frame.shape
sepia_bgra = (blue, green, red, 1)
overlay = nump.full((frame_h, frame_w, 4), sepia_bgra, dtype='uint8')
cv2.addWeighted(overlay, intensity, frame, 1.0, 0, frame)
return frame
def sepia(frame, intensity=0.5):
frame = alpha_channel(frame)
frame_h, frame_w, frame_c = frame.shape
sepia_bgra = (20, 66, 112, 1)
overlay = nump.full((frame_h, frame_w, 4), sepia_bgra, dtype='uint8')
cv2.addWeighted(overlay, intensity, frame, 1.0, 0, frame)
return frame
def alpha_blend(frame_1, frame_2, mask):
alpha = mask / 255.0
blended = cv2.convertScaleAbs(frame_1 * (1 - alpha) + frame_2 * alpha)
return blended
def focus_blur(frame, intensity=0.2):
frame = alpha_channel(frame)
frame_h, frame_w, frame_c = frame.shape
y = int(frame_h / 2)
x = int(frame_w / 2)
mask = nump.zeros((frame_h, frame_w, 4), dtype='uint8')
cv2.circle(mask, (x, y), int(y / 2), (255, 255, 255), -1, cv2.LINE_AA)
mask = cv2.GaussianBlur(mask, (21, 21), 11)
blured = cv2.GaussianBlur(frame, (21, 21), 11)
blended = alpha_blend(frame, blured, 255 - mask)
frame = cv2.cvtColor(blended, cv2.COLOR_BGRA2BGR)
return frame
def portrait(frame):
cv2.imshow('frame', frame)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
_, mask = cv2.threshold(gray, 120, 255, cv2.THRESH_BINARY)
mask = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGRA)
blured = cv2.GaussianBlur(frame, (21, 21), 11)
blended = alpha_blend(frame, blured, mask)
frame = cv2.cvtColor(blended, cv2.COLOR_BGRA2BGR)
return frame
def invert(frame):
return cv2.bitwise_not(frame)
print("hue saturation filter press: 1\n Sepia filter press: 2 \n color overlay filter press: 3 \n invert filter press: 4 \n Blur filter press: 5 \n Portrait filter press: 6")
d_filter = str(input())
while (True):
# frames
ret, frame = capture.read()
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2BGRA)
if d_filter == "1":
hue_sat = hue_saturation(frame.copy(), alpha=3, beta=3)
cv2.imshow('hue_sat', hue_sat)
elif d_filter == "2":
do_sepia = sepia(frame.copy(), intensity=.8)
cv2.imshow('do_sepia', do_sepia)
elif d_filter == "3":
do_color_overlay = color_overlay(frame.copy(), intensity=.8, green=231, red=123)
cv2.imshow('do_color_overlay', do_color_overlay)
elif d_filter == "4":
do_invert = invert(frame.copy())
cv2.imshow('do_invert', do_invert)
elif d_filter == "5":
blur_mask = focus_blur(frame.copy())
cv2.imshow('blur_mask', blur_mask)
elif d_filter == "6":
do_portrait = portrait(frame.copy())
cv2.imshow('do_portrait', do_portrait)
else:
print("wrong input")
break
if cv2.waitKey(20) & 0xFF == ord('q'):
break
capture.release()
cv2.destroyAllWindows()