-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathframegen.py
64 lines (47 loc) · 1.55 KB
/
framegen.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
import cv2
def get_mapping():
"""Get mapping to convert from pixel to ascii art"""
mapping = {}
char_set = '.' * 18 + 'M' * 8
for i in range(26):
for j in range(10):
mapping[i * 10 + j] = char_set[i]
return mapping
def frame_to_ascii(frame, mapping):
chars = []
for i in frame:
temp = []
for j in i:
temp.append(mapping[j])
chars.append(temp)
return '\r\n'.join([''.join(line) for line in chars])
class AsciiFrameGenerator:
def __init__(self, file_name):
self.mapping = get_mapping()
self.cap = cv2.VideoCapture(file_name)
# default size, will ideally be overwritten when client requests pty
self._size = (80, 24)
@property
def fps(self):
return self.cap.get(cv2.CAP_PROP_FPS)
@property
def size(self):
return self._size
@size.setter
def size(self, arg):
self._size = (arg[0], arg[1])
@property
def frame_count(self):
return int(self.cap.get(cv2.CAP_PROP_FRAME_COUNT))
def __iter__(self):
return self
def __next__(self):
_, frame = self.cap.read()
if frame is None:
# reset to beginning
self.cap.set(cv2.CAP_PROP_POS_FRAMES, -1)
return self.__next__()
frame = cv2.resize(frame, self.size, interpolation=cv2.INTER_AREA) # resize
frame = cv2.GaussianBlur(frame, (5, 5), 0) # smoothen
frame = cv2.Canny(frame, 127, 31) # edge detection
return frame_to_ascii(frame, self.mapping)