def run(self): last_time = time.time() while not self.shutdown.is_set(): # now = time.time() # if now - last_time > 5: # print('camera> grabbing reference') # ret, img = self.cap.read() # log('camera> convert to jpg') # encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), jpeg_quality] # _, encimg = cv2.imencode('.jpg', img, encode_param) # log('camera> save to disk') # save_to_disk(encimg, 'references', '.jpg') # last_time = now # run through the buffer to stay up to date ret = self.cap.grab() # watch for button presses if self.shutter.is_set(): self.shutter.clear() self.capture() log('camera> received shutdown')
def __init__(self): super().__init__() fourcc = 'MJPG' width = 1920 * 2 height = 1080 * 2 fps = 5 log('camera> waiting for availability') cap = wait_for_format(fourcc, width, height, fps) log('camera> camera is available') log('camera> loading face extractor') self.face_extractor = FaceExtractor() log('camera> loaded face extractor') self.cap = cap self.shutdown = threading.Event() self.shutter = threading.Event() self.start()
size = np.asarray(img.shape[:2]) min_side = min(size) corner = (size - min_side) // 2 return img[corner[0]:corner[0] + min_side, corner[1]:corner[1] + min_side] if __name__ == '__main__': from test_fps import progress, capture fourcc = 'MJPG' width = 1920 * 2 height = 1080 * 2 fps = 5 log('waiting for availability') cap = wait_for_format(fourcc, width, height, fps) log('camera is available') log('loading eye extractor and blink detector') eye_extractor = EyeExtractor() blink_detector = BlinkDetector() log('loaded') threshold = 0.1 hysteresis = Hysteresis() try: for i, img in enumerate(progress(capture(cap))): sub = inner_square_crop(img)
def wait_for_format(fourcc, width, height, fps, port=0): while True: log(f'camera> connecting to port {port}: {fourcc} {width} x {height} @ {fps}fps' ) camera = cv2.VideoCapture(port) camera.set(cv2.CAP_PROP_FOURCC, cv2.VideoWriter_fourcc(*fourcc)) camera.set(cv2.CAP_PROP_FRAME_WIDTH, width) camera.set(cv2.CAP_PROP_FRAME_HEIGHT, height) camera.set(cv2.CAP_PROP_FPS, fps) camera.set(cv2.CAP_PROP_AUTOFOCUS, 0) camera.set(cv2.CAP_PROP_FOCUS, 0) if not camera.isOpened(): log('camera> port not opening') else: log('camera> port open') status, img = camera.read() if status: current_width = camera.get(3) current_height = camera.get(4) log(f'camera> reading at {current_width} x {current_height}') if current_width >= width and current_height >= height: log('camera> resolution met') return camera else: log('camera> resolution not met') else: log('camera> not reading') log('camera> releasing camera') camera.release() log('camera> wait_for_format sleeping') time.sleep(10)
def capture(self): encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), jpeg_quality] log('camera> capture') ret, img = self.cap.read() log('camera> extracting face') try: sub = self.face_extractor(img) except: log('camera> error extracting face, saving image to disk') _, encimg = cv2.imencode('.jpg', img, encode_param) save_to_disk(encimg, 'error', '.jpg') return log('camera> convert to jpg for post') _, encimg = cv2.imencode('.jpg', sub, encode_param) save_to_disk(encimg, 'faces', '.jpg') # send to endpoint data = encimg.tobytes() headers = {'Content-type': 'image/jpeg'} try: log('camera> post jpg') response = requests.post(gce_url, data=data, headers=headers) log('camera> response') data = response.json()['coordinates'] log(f'camera> gce response {len(data)} points') response = requests.post(plotter_url, json={'path': data}) except ConnectionError: log('camera> connection error') except JSONDecodeError: log('camera> JSON response error') log(response.raw) log('camera> convert to jpg and save to disk') _, encimg = cv2.imencode('.jpg', img, encode_param) save_to_disk(encimg, 'images', '.jpg')
def join(self): log('camera> sending shutdown') self.shutdown.set() super().join()
import os from simplejson.errors import JSONDecodeError import requests from flask import Flask from waitress import serve from flushed import log from face_extractor import FaceExtractor from wait_for_format import wait_for_format gce_url = 'http://bsp-ams.kylemcdonald.net:8080' plotter_url = 'http://localhost:8080/draw' jpeg_quality = 90 log('using endpoint', gce_url) def save_to_disk(data, directory, extension): now = datetime.datetime.now() os.makedirs(directory, exist_ok=True) fn = now.replace(microsecond=0).isoformat() + extension fn = fn.replace(':', '-') fn = os.path.join(directory, fn) with open(fn, 'wb') as f: f.write(data) class Camera(threading.Thread): def __init__(self): super().__init__()