/
camera.py
109 lines (87 loc) · 3.64 KB
/
camera.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
import cv2
from servo import Servo
from multiprocessing import Queue
class Camera(object):
_instance = None
def __new__(cls, *args, **kwargs):
if not isinstance(cls._instance, cls):
cls._instance = object.__new__(cls, *args, **kwargs)
return cls._instance
def __init__(self, config, logger):
controller = open(config.fetch('servo_controller'), 'w')
self.tilt = Servo(
config.fetch('tilt_gpio'),
controller,
(int(config.fetch('tilt_max')), int(config.fetch('tilt_min'))))
self.tilt.cur_pos = config.fetch('tilt_start')
self.pan = Servo(
config.fetch('pan_gpio'),
controller,
(int(config.fetch('pan_max')), int(config.fetch('pan_min'))))
self.pan.cur_pos = config.fetch('pan_start')
self.tilt_q_cur_pos = Queue()
self.tilt_q_des_pos = Queue()
self.tilt_q_speed = Queue()
self.pan_q_cur_pos = Queue()
self.pan_q_des_pos = Queue()
self.pan_q_speed = Queue()
self.cam = cv2.VideoCapture(int(config.fetch('camera_id')))
self.cam.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, float(config.fetch('frame_width')))
self.cam.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, float(config.fetch('frame_height')))
self.config = config
self.logger = logger
def get_frame(self):
return self.cam.read()[1]
def get_frames(self, count):
frames = []
for i in range(count):
frames.append(self.get_frame())
return frames
def up(self, distance, speed):
cur_pos = int(self.tilt.cur_pos)
desired_pos = cur_pos - int(distance)
self.logger.info('[UP] {0} -> {1}'.format(cur_pos, desired_pos))
self.tilt.move(desired_pos)
self.tilt.cur_pos = desired_pos
return
if not self.tilt_q_cur_pos.empty():
cur_pos = self.tilt_q_cur_pos.get()
desired_pos = self.tilt.assure_max(int(cur_pos) - int(distance))
self.tilt_q_des_pos.put(desired_pos)
self.tilt_q_speed.put(speed)
def down(self, distance, speed):
cur_pos = int(self.tilt.cur_pos)
desired_pos = cur_pos + int(distance)
self.logger.info('[DOWN] {0} -> {1}'.format(cur_pos, desired_pos))
self.tilt.move(desired_pos)
self.tilt.cur_pos = desired_pos
return
if not self.tilt_q_cur_pos.empty():
cur_pos = self.tilt_q_cur_pos.get()
desired_pos = self.tilt.assure_min(int(cur_pos) + int(distance))
self.tilt_q_des_pos.put(desired_pos)
self.tilt_q_speed.put(speed)
def left(self, distance, speed):
cur_pos = int(self.pan.cur_pos)
desired_pos = cur_pos - int(distance)
self.logger.info('[LEFT] {0} -> {1}'.format(cur_pos, desired_pos))
self.pan.move(desired_pos)
self.pan.cur_pos = int(desired_pos)
return
if not self.pan_q_cur_pos.empty():
cur_pos = self.pan_q_cur_pos.get()
desired_pos = self.pan.assure_max(int(cur_pos) - int(distance))
self.pan_q_des_pos.put(desired_pos)
self.pan_q_speed.put(speed)
def right(self, distance, speed):
cur_pos = int(self.pan.cur_pos)
desired_pos = cur_pos + int(distance)
self.logger.info('[RIGHT] {0} -> {1}'.format(cur_pos, desired_pos))
self.pan.move(desired_pos)
self.pan.cur_pos = desired_pos
return
if not self.pan_q_cur_pos.empty():
cur_pos = self.pan_q_cur_pos.get()
desired_pos = self.pan.assure_min(int(cur_pos) + int(distance))
self.pan_q_des_pos.put(desired_pos)
self.pan_q_speed.put(speed)