Пример #1
0
    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')
Пример #2
0
    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()
Пример #3
0
    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)
Пример #4
0
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)
Пример #5
0
    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')
Пример #6
0
 def join(self):
     log('camera> sending shutdown')
     self.shutdown.set()
     super().join()
Пример #7
0
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__()