Skip to content

Commit 15e8764

Browse files
committed
fix #67
1 parent 2a11095 commit 15e8764

File tree

12 files changed

+119
-343
lines changed

12 files changed

+119
-343
lines changed

.x.swp renamed to .sudo.swp

12 KB
Binary file not shown.

camera.py

Lines changed: 41 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
PHOTO_THUMB_SIZE = (240,180)
4747
VIDEO_ELAPSE_MAX = 900
4848

49-
class Camera(Thread):
49+
class Camera(object):
5050

5151
_instance = None
5252
_img_template = image.Image.load("coderdojo-logo.png")
@@ -56,19 +56,23 @@ class Camera(Thread):
5656
def get_instance(cls):
5757
if cls._instance is None:
5858
cls._instance = Camera()
59-
cls._instance.start()
59+
#cls._instance.start()
6060
return cls._instance
6161

6262
def __init__(self):
6363
logging.info("starting camera")
64-
cam_props = {"width":640, "height":512, "cv_image_factor":config.Config.get().get("cv_image_factor", 4), "exposure_mode": config.Config.get().get("camera_exposure_mode"), "jpeg_quality": int(config.Config.get().get("camera_jpeg_quality", 20))}
64+
cam_props = {"width":640, "height":512,
65+
"cv_image_factor": config.Config.get().get("cv_image_factor"),
66+
"exposure_mode": config.Config.get().get("camera_exposure_mode"),
67+
"framerate": config.Config.get().get("camera_framerate"),
68+
"bitrate": config.Config.get().get("camera_jpeg_bitrate"),
69+
"jpeg_quality": int(config.Config.get().get("camera_jpeg_quality"))}
6570
self._camera = camera.Camera(props=cam_props)
6671
self.recording = False
6772
self.video_start_time = time.time() + 8640000
68-
self._run = True
6973
self._image_time = 0
7074
self._cv_image_factor = int(config.Config.get().get("cv_image_factor", 4))
71-
self._image_lock = Lock()
75+
#self._image_lock = Lock()
7276
self._image_refresh_timeout = float(config.Config.get().get("camera_refresh_timeout", 0.1))
7377
self._color_object_size_min = int(config.Config.get().get("camera_color_object_size_min", 80)) / (self._cv_image_factor * self._cv_image_factor)
7478
self._color_object_size_max = int(config.Config.get().get("camera_color_object_size_max", 32000)) / (self._cv_image_factor * self._cv_image_factor)
@@ -89,45 +93,16 @@ def __init__(self):
8993
if cnn_model != "":
9094
self._cnn_classifiers[cnn_model] = CNNManager.get_instance().load_model(cnn_model)
9195
self._cnn_classifier_default = self._cnn_classifiers[cnn_model]
92-
96+
97+
self._camera.grab_start()
98+
9399
super(Camera, self).__init__()
94100

95-
def run(self):
96-
try:
97-
self._camera.grab_start()
98-
while self._run:
99-
sleep_time = self._image_refresh_timeout - (time.time() - self._image_time)
100-
if sleep_time <= 0:
101-
ts = time.time()
102-
#print "run.1"
103-
self._image_lock.acquire()
104-
self._camera.grab_one()
105-
self._image_lock.release()
106-
#print "run.2: " + str(time.time()-ts)
107-
108-
#self.save_image(image.Image(self._camera.get_image_bgr()).filter_color((124,50,74)).to_jpeg())
109-
self.save_image(self._camera.get_image_jpeg())
110-
#print "run.3: " + str(time.time()-ts)
111-
else:
112-
time.sleep(sleep_time)
113-
114-
if self.recording and time.time() - self.video_start_time > VIDEO_ELAPSE_MAX:
115-
self.video_stop()
116-
117-
self._camera.grab_stop()
118-
except:
119-
logging.error("Unexpected error:" + str(sys.exc_info()[0]))
120-
raise
121-
122-
def get_image(self, maxage = MAX_IMAGE_AGE):
101+
def get_image(self):
123102
return image.Image(self._camera.get_image_bgr())
124103

125-
def save_image(self, image_jpeg):
126-
#self._streamer.set_image(image_jpeg)
127-
self._image_time=time.time()
128-
129104
def get_image_jpeg(self):
130-
return copy.copy (self._camera.get_image_jpeg())
105+
return self._camera.get_image_jpeg()
131106

132107
def set_text(self, text):
133108
self._camera.set_overlay_text(str(text))
@@ -168,7 +143,7 @@ def photo_take(self):
168143
filename_thumb = PHOTO_PREFIX + str(photo_index) + PHOTO_THUMB_SUFFIX + self._camera.PHOTO_FILE_EXT;
169144
of = open(PHOTO_PATH + "/" + filename, "w+")
170145
oft = open(PHOTO_PATH + "/" + filename_thumb, "w+")
171-
im_str = self._camera.get_image_jpeg()
146+
im_str = self.get_image_jpeg()
172147
of.write(im_str)
173148
# thumb
174149
im_pil = PILImage.open(StringIO(im_str))
@@ -231,24 +206,20 @@ def delete_photo(self, filename):
231206
self.save_photo_metadata()
232207

233208
def exit(self):
234-
#self._streamer.server.shutdown()
235-
#self._streamer.server_thread.join()
236-
self._run = False
237-
self.join()
209+
#self.join()
210+
self.video_stop()
211+
self._camera.grab_stop()
238212

239213
def calibrate(self):
240214
img = self._camera.getImage()
241215
self._background = img.hueHistogram()[-1]
242216

243217
def get_average(self):
244-
self._image_lock.acquire()
245-
avg = self.get_image(0).get_average()
246-
self._image_lock.release()
218+
avg = self.get_image().get_average()
247219
return avg
248220

249221
def find_line(self):
250-
self._image_lock.acquire()
251-
img = self.get_image(0).binarize()
222+
img = self.get_image().binarize()
252223
slices = [0,0,0]
253224
blobs = [0,0,0]
254225
slices[0] = img.crop(0, int(self._camera.out_rgb_resolution[1]/1.2), self._camera.out_rgb_resolution[0], self._camera.out_rgb_resolution[1])
@@ -261,33 +232,32 @@ def find_line(self):
261232
coords[idx] = (blobs[idx][0].center[0] * 100) / self._camera.out_rgb_resolution[0]
262233
logging.info("line coord: " + str(idx) + " " + str(coords[idx])+ " area: " + str(blobs[idx][0].area()))
263234

264-
self._image_lock.release()
265235
return coords[0]
266236

267237
def find_signal(self):
268238
#print "signal"
269239
angle = None
270240
ts = time.time()
271-
self._image_lock.acquire()
272-
img = self.get_image(0)
241+
#self._image_lock.acquire()
242+
img = self.get_image()
273243
signals = img.find_template(self._img_template)
274244

275245
logging.info("signal: " + str(time.time() - ts))
276246
if len(signals):
277247
angle = signals[0].angle
278248

279-
self._image_lock.release()
249+
#self._image_lock.release()
280250

281251
return angle
282252

283253
def find_face(self):
284254
face_x = face_y = face_size = None
285-
self._image_lock.acquire()
286-
img = self.get_image(0)
255+
#self._image_lock.acquire()
256+
img = self.get_image()
287257
ts = time.time()
288258
faces = img.grayscale().find_faces()
289259
logging.info("face.detect: " + str(time.time() - ts))
290-
self._image_lock.release()
260+
#self._image_lock.release()
291261
if len(faces):
292262
# Get the largest face, face is a rectangle
293263
x, y, w, h = faces[0]
@@ -301,14 +271,13 @@ def find_face(self):
301271
return [face_x, face_y, face_size]
302272

303273
def path_ahead(self):
274+
304275
image_size = self._camera.out_rgb_resolution
305276
ts = time.time()
306-
self._image_lock.acquire()
307-
img = self.get_image(0)
277+
img = self.get_image()
308278

309279
size_y = img._data.shape[0]
310280
size_x = img._data.shape[1]
311-
312281
threshold = img.crop(0, size_y - (size_y/12), size_x, size_y)._data.mean() / 2
313282

314283
blobs = img.binarize(threshold).dilate().find_blobs(minsize=self._path_object_size_min, maxsize=self._path_object_size_max)
@@ -323,18 +292,18 @@ def path_ahead(self):
323292
coordY = 60 - ((y * 48) / (480 / self._cv_image_factor))
324293
logging.info("x: " + str(x) + " y: " + str(y) + " coordY: " + str(coordY))
325294

326-
self._image_lock.release()
295+
#self._image_lock.release()
327296
return coordY
328297

329298
def find_color(self, s_color):
330299
image_size = self._camera.out_rgb_resolution
331300
color = (int(s_color[1:3],16), int(s_color[3:5],16), int(s_color[5:7],16))
332301
code_data = None
333302
ts = time.time()
334-
self._image_lock.acquire()
335-
img = self.get_image(0)
303+
#self._image_lock.acquire()
304+
img = self.get_image()
336305
bw = img.filter_color(color)
337-
self._image_lock.release()
306+
#self._image_lock.release()
338307
objects = bw.find_blobs(minsize=self._color_object_size_min, maxsize=self._color_object_size_max)
339308
logging.debug("objects: " + str(objects))
340309
dist = -1
@@ -361,9 +330,9 @@ def find_color(self, s_color):
361330
def find_text(self, accept, back_color):
362331
text = None
363332
color = (int(back_color[1:3],16), int(back_color[3:5],16), int(back_color[5:7],16))
364-
self._image_lock.acquire()
365-
img = self.get_image(0)
366-
self._image_lock.release()
333+
#self._image_lock.acquire()
334+
img = self.get_image()
335+
#self._image_lock.release()
367336
image = img.find_rect(color=color)
368337
if image:
369338
logging.info("image: " + str(image))
@@ -373,9 +342,9 @@ def find_text(self, accept, back_color):
373342
return text
374343

375344
def find_code(self):
376-
self._image_lock.acquire()
377-
img = self.get_image(0)
378-
self._image_lock.release()
345+
#self._image_lock.acquire()
346+
img = self.get_image()
347+
#self._image_lock.release()
379348
return img.grayscale().find_code()
380349

381350
def cnn_classify(self, model_name=None):
@@ -388,9 +357,9 @@ def cnn_classify(self, model_name=None):
388357
else:
389358
classifier = self._cnn_classifier_default
390359

391-
self._image_lock.acquire()
392-
img = self.get_image(0)
393-
self._image_lock.release()
360+
#self._image_lock.acquire()
361+
img = self.get_image()
362+
#self._image_lock.release()
394363
classes = classifier.classify_image(img.mat())
395364
s_classes = sorted(classes.items(), key=lambda x: x[1], reverse=True)
396365
return s_classes

coderbot.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"move_tr_speed": "85", "move_fw_elapse": "1", "camera_color_object_size_min": "4000", "camera_path_object_size_min": "4000", "load_at_start": "", "move_tr_elapse": "0.5", "sound_stop": "$shutdown.mp3", "show_control_move_commands": "true", "prog_level": "adv", "prog_scrollbars": "true", "move_fw_speed": "100", "camera_color_object_size_max": "160000", "sound_shutter": "$shutter.mp3", "show_page_prefs": "true", "cv_image_factor": "2", "ctrl_hud_image": "", "button_func": "none", "ctrl_fw_elapse": "-1", "ctrl_tr_elapse": "-1", "move_power_angle_2": "60", "move_power_angle_3": "60", "move_power_angle_1": "45", "move_motor_trim": "1", "cnn_default_model": "apple_kiwi_fast", "show_page_program": "true", "sound_start": "$startup.mp3", "camera_exposure_mode": "auto", "ctrl_tr_speed": "80", "prog_move_mpu": "yes", "ctrl_fw_speed": "100", "camera_refresh_timeout": "0.1", "camera_jpeg_quality": "20", "prog_maxblocks": "-1", "move_motor_mode": "dc", "camera_path_object_size_max": "160000", "show_page_control": "true"}
1+
{"move_tr_speed": "85", "move_fw_elapse": "1", "camera_color_object_size_min": "4000", "camera_jpeg_bitrate": "2000000", "load_at_start": "", "move_tr_elapse": "0.5", "sound_stop": "$shutdown.mp3", "show_control_move_commands": "true", "prog_level": "adv", "prog_scrollbars": "true", "move_fw_speed": "100", "camera_color_object_size_max": "160000", "sound_shutter": "$shutter.mp3", "show_page_prefs": "true", "cv_image_factor": "2", "ctrl_hud_image": "", "button_func": "none", "ctrl_fw_elapse": "-1", "ctrl_tr_elapse": "-1", "move_power_angle_2": "60", "move_power_angle_3": "60", "camera_path_object_size_max": "160000", "move_motor_trim": "1", "camera_path_object_size_min": "4000", "cnn_default_model": "apple_kiwi_fast", "show_page_program": "true", "sound_start": "$startup.mp3", "camera_exposure_mode": "auto", "ctrl_tr_speed": "80", "prog_move_mpu": "yes", "ctrl_fw_speed": "100", "camera_jpeg_quality": "20", "prog_maxblocks": "-1", "camera_framerate": "30", "move_motor_mode": "dc", "move_power_angle_1": "45", "show_page_control": "true"}

coderbot.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,10 @@ def __init__(self, servo=False, motor_trim_factor=1.0):
8787
self._encoder_k_v_1 = 80
8888
self._encoder_sem = threading.Condition()
8989

90-
#self._ag = mpu.AccelGyro()
90+
try:
91+
self._ag = mpu.AccelGyro()
92+
except IOError:
93+
logging.info("MPU not available")
9194

9295
the_bot = None
9396

0 commit comments

Comments
 (0)