123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- """ Common function for camera based method """
- from fractions import Fraction
- import json
- import logging
- import os
- import time
- import threading
- import cv2
- import numpy as np
- from settings.config import settings
- logger = logging.getLogger(__name__)
- class VideoCaptureThread:
- def __init__(self, output_path, video_source=0, sync_device=None):
- super(VideoCaptureThread, self).__init__()
- self.video_source = video_source
- self.cap = cv2.VideoCapture(self.video_source)
-
- self.sync_device = sync_device
-
- self.output_path = output_path
- frame_size = (int(self.cap.get(cv2.CAP_PROP_FRAME_WIDTH)),
- int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
- self.out = cv2.VideoWriter(output_path, cv2.VideoWriter_fourcc(*'avc1'), 20.0, frame_size)
- self.videothread = threading.Thread(target=self.run)
- self.videothread.start()
- def run(self):
- logger.info("Camera starting")
- self.capture_video()
-
- def capture_video(self):
- while not self.cap.isOpened():
- pass # Wait for the capture to be initialized
-
- # synchronize
- if self.sync_device is not None:
- self.sync_device.send_trigger(0xff) # 255 for video ready
- while True:
- ret, frame = self.cap.read()
- # TODO: online analysis (500ms step, asychronize)
- if not ret:
- logger.error("Error: Couldn't read frame. Exit.")
- break
- self.out.write(frame)
- def close(self):
- logger.info("Camera ended")
- self.cap.release()
- self.out.release()
- self.videothread.join()
|