카메라에서 비디오를 녹화하는 동안 TTL 펄스 입력 시간 절약

주권

Raspberry pi에서 Raspicam을 사용하여 비디오를 녹화하고 다음 스크립트를 사용하여 각 프레임에 대한 비디오 버퍼와 타임 스탬프를 저장합니다.

import io
import time
import datetime as dt
from picamera import PiCamera
from threading import Thread, Event
from queue import Queue, Empty
import sys, getopt
import argparse

WIDTH  = 640
HEIGHT = 480
FRAMERATE = 30
VIDEO_STABILIZATION = True
EXPOSURE_MODE = 'night'
BRIGHTNESS = 55
CONTRAST = 50
SHARPNESS = 50
SATURATION = 30
AWB_MODE = 'off'
AWB_GAINS = 1.4

VIDEO_FILE_NAME = "cam3_output_" + str(dt.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")) + ".h264"
TIMESTAMP_FILE_NAME = "cam3_timestamp_" + str(dt.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")) + ".csv"
runningTimeHours, runningTimeMinutes, runningTimeSeconds = 0,0,0

class VideoOutput(Thread):
    def __init__(self, filename):
        super(VideoOutput, self).__init__()
        self._output = io.open(filename, 'wb', buffering=0)
        self._event = Event()
        self._queue = Queue()
        self.start()

    def write(self, buf):
        self._queue.put(buf)
        return len(buf)

    def run(self):
        while not self._event.wait(0):
            try:
                buf = self._queue.get(timeout=0.1)
            except Empty:
                pass
            else:
                self._output.write(buf)
                self._queue.task_done()

    def flush(self):
        self._queue.join()
        self._output.flush()

    def close(self):
        self._event.set()
        self.join()
        self._output.close()

    @property
    def name(self):
        return self._output.name


class TimestampOutput(object):
    def __init__(self, camera, video_filename, timestamp_filename):
        self.camera = camera
        self._video = VideoOutput(video_filename)
        self._timestampFile = timestamp_filename
        self._timestamps = []

    def write(self, buf):
        if self.camera.frame.complete and self.camera.frame.timestamp is not None:
            self._timestamps.append((
                self.camera.frame.timestamp,
                self.camera.dateTime,
                self.camera.clockRealTime
                ))
        return self._video.write(buf)

    def flush(self):
        with io.open(self._timestampFile, 'w') as f:
            f.write('GPU Times, time.time(), clock_realtime\n')
            for entry in self._timestamps:
                f.write('%d,%f,%f\n' % entry)

    def close(self):
        self._video.close()

parser = argparse.ArgumentParser()
parser.add_argument("-hr", "--hours", type=int, help="number of hours to record")
parser.add_argument("-m", "--minutes", type=int, help="number of minutes to record")
parser.add_argument("-s", "--seconds", type=int, help="number of seconds to record")
args = parser.parse_args()


runningTimeHours = float(args.hours)
runningTimeMinutes = float(args.minutes)
runningTimeSeconds = float(args.seconds)

totalRunningTime = runningTimeHours*60*60 + runningTimeMinutes*60 + runningTimeSeconds

with PiCamera(resolution=(WIDTH, HEIGHT), framerate=FRAMERATE) as camera:
    camera.brightness = BRIGHTNESS
    camera.contrast = CONTRAST
    camera.sharpness = SHARPNESS
    camera.video_stabilization = VIDEO_STABILIZATION
    camera.hflip = False
    camera.vflip = False

    #warm-up time to camera to set its initial settings
    time.sleep(2)

    camera.exposure_mode = EXPOSURE_MODE
    camera.awb_mode = AWB_MODE
    camera.awb_gains = AWB_GAINS

    #time to let camera change parameters according to exposure and AWB
    time.sleep(2)

    #switch off the exposure since the camera has been set now 
    camera.exposure_mode = 'off'

    output = TimestampOutput(camera, VIDEO_FILE_NAME, TIMESTAMP_FILE_NAME)
    try:
        camera.start_preview()
        # Construct an instance of our custom output splitter with a filename  and a connected socket
        print('Starting Recording')
        camera.start_recording(output, format='h264')
        print('Started Recording')
        camera.wait_recording(totalRunningTime)
        camera.stop_recording()
        camera.stop_preview()
        print('Recording Stopped')
    except KeyboardInterrupt:
        print('Closing Output File')
        sys.exit(2)
    finally:
        output.close()
        print('Output File Closed')

이 레코딩이 진행되는 동안 동시에 TTL 펄스를 GPIO 핀 4로 보냅니다. 이제 수신 된 각 TTL HIGH 입력에 대해 해당 시간 값을 파일에 저장할 수 있도록 위 스크립트에 코드 블록을 추가하고 싶습니다.

카메라 실행 스크립트없이 다음과 같은 것 :

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
pinTTL = 4

GPIO.setup(pinTTL, GPIO.IN)

while True:
    count = 0
    inputState = GPIO.input(pinTTL)
    if inputState == True:
        print 'HIGH', time.time()

GPIO.cleanup()

핀 상태를 HIGH로 설정하는 위의 스크립트는 time.time () 값을 절약합니다.

기본적으로 언급 된 2 개의 스크립트를 통합하고 싶습니다. 비디오 버퍼를 저장하는 것과 같은 방식으로 TTL 입력에 따라 time.time () 값을 저장하기 위해 다른 스레드를 만들려고 시도했지만 작동하지 못했습니다.

도와 주셔서 감사합니다.

주권

아래 스크립트는 나를 위해 작동합니다. add_event_callback은 자동으로 GPIO 이벤트 변경 사항을 처리하기위한 별도의 스레드를 생성한다. 이를 통해 모든 함수를 별도의 스레드로 호출하고 TTL 타임 스탬프를 동시에 기록 할 수 있습니다.

#import the necessary modules
import io
import time
import datetime as dt
from picamera import PiCamera
from threading import Thread, Event
from queue import Queue, Empty
import sys, getopt
import argparse
import RPi.GPIO as GPIO

#camera parameter setting
WIDTH  = 640
HEIGHT = 480
FRAMERATE = 30
VIDEO_STABILIZATION = True
EXPOSURE_MODE = 'night'
BRIGHTNESS = 55
CONTRAST = 50
SHARPNESS = 50
SATURATION = 30
AWB_MODE = 'off'
AWB_GAINS = 1.4

#video, timestamps and ttl file name
VIDEO_FILE_NAME = "cam4_output_" + str(dt.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")) + ".h264"
TIMESTAMP_FILE_NAME = "cam4_timestamp_" + str(dt.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")) + ".csv"
TTL_FILE_NAME = "cam4_ttl_" + str(dt.datetime.now().strftime("%Y-%m-%d_%H-%M-%S")) + ".csv"

#running time variable intialization
runningTimeHours, runningTimeMinutes, runningTimeSeconds = 0,0,0

#set raspberry pi board layout to BCM
GPIO.setmode(GPIO.BCM)
#pin number to receive TTL input
pinTTL = 4
#set the pin as input pin
GPIO.setup(pinTTL, GPIO.IN)
#add event detection script to GPIO pin
GPIO.add_event_detect(pinTTL, GPIO.BOTH)

#video output thread to save video file
class VideoOutput(Thread):
    def __init__(self, filename):
        super(VideoOutput, self).__init__()
        self._output = io.open(filename, 'wb', buffering=0)
        self._event = Event()
        self._queue = Queue()
        self.start()

    def write(self, buf):
        self._queue.put(buf)
        return len(buf)

    def run(self):
        while not self._event.wait(0):
            try:
                buf = self._queue.get(timeout=0.1)
            except Empty:
                pass
            else:
                self._output.write(buf)
                self._queue.task_done()

    def flush(self):
        self._queue.join()
        self._output.flush()

    def close(self):
        self._event.set()
        self.join()
        self._output.close()

    @property
    def name(self):
        return self._output.name

#timestamp output object to save timestamps according to pi and TTL inputs received and write to file
class TimestampOutput(object):
    def __init__(self, camera, video_filename, timestamp_filename, ttl_filename):
        self.camera = camera
        self._video = VideoOutput(video_filename)
        self._timestampFile = timestamp_filename
        self._ttlFile = ttl_filename
        self._timestamps = []
        self._ttlTimestamps = []

    def ttlTimestampsWrite(self, input_pin):
        try:
            inputState = GPIO.input(input_pin)
            self._ttlTimestamps.append((inputState, self.camera.frame.timestamp, self.camera.dateTime, self.camera.clockRealTime))
            print(self.camera.frame.timestamp)
        except Exception as e:
            print(str(e))
            pass

    def write(self, buf):
        if self.camera.frame.complete and self.camera.frame.timestamp is not None:
            self._timestamps.append((
                self.camera.frame.timestamp,
                self.camera.dateTime,
                self.camera.clockRealTime
                ))
        return self._video.write(buf)

    def flush(self):
        with io.open(self._timestampFile, 'w') as f:
            f.write('GPU Times, time.time(), clock_realtime\n')
            for entry in self._timestamps:
                f.write('%d,%f,%f\n' % entry)
        with io.open(self._ttlFile, 'w') as f:
            f.write('Input State, GPU Times, time.time(), clock_realtime\n')
            for entry in self._ttlTimestamps:
                f.write('%f,%f,%f,%f\n' % entry)

    def close(self):
        self._video.close()

parser = argparse.ArgumentParser()
parser.add_argument("-hr", "--hours", type=int, help="number of hours to record")
parser.add_argument("-m", "--minutes", type=int, help="number of minutes to record")
parser.add_argument("-s", "--seconds", type=int, help="number of seconds to record")
args = parser.parse_args()

runningTimeHours = float(args.hours)
runningTimeMinutes = float(args.minutes)
runningTimeSeconds = float(args.seconds)

totalRunningTime = runningTimeHours*60*60 + runningTimeMinutes*60 + runningTimeSeconds

with PiCamera(resolution=(WIDTH, HEIGHT), framerate=FRAMERATE) as camera:
    camera.brightness = BRIGHTNESS
    camera.contrast = CONTRAST
    camera.sharpness = SHARPNESS
    camera.video_stabilization = VIDEO_STABILIZATION
    camera.hflip = False
    camera.vflip = False

    #warm-up time to camera to set its initial settings
    time.sleep(2)

    camera.exposure_mode = EXPOSURE_MODE
    camera.awb_mode = AWB_MODE
    camera.awb_gains = AWB_GAINS

    #time to let camera change parameters according to exposure and AWB
    time.sleep(2)

    #switch off the exposure since the camera has been set now
    camera.exposure_mode = 'off'

    output = TimestampOutput(camera, VIDEO_FILE_NAME, TIMESTAMP_FILE_NAME, TTL_FILE_NAME)
    GPIO.add_event_callback(pinTTL, output.ttlTimestampsWrite)
    try:
        camera.start_preview()
        # Construct an instance of our custom output splitter with a filename  and a connected socket
        print('Starting Recording')
        camera.start_recording(output, format='h264')
        print('Started Recording')
        camera.wait_recording(totalRunningTime)
        camera.stop_recording()
        camera.stop_preview()
        print('Recording Stopped')
    except KeyboardInterrupt:
        print('Closing Output File')
        sys.exit(2)
    except:
        output.close()
        print('exception! output file closed')
    finally:
        output.close()
        print('Output File Closed')

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Kinect 카메라를 통해 비디오와 오디오를 동시에 녹화하는 방법

분류에서Dev

Android에서 비디오를 녹화하는 동안 텍스트를 삽입하는 방법은 무엇입니까?

분류에서Dev

일광 절약 시간에 대한 시간 업데이트, 시스템 시계를 UTC 시간으로 설정, 온라인 서버와 동기화 유지

분류에서Dev

일광 절약 시간에 대한 시간 업데이트, 시스템 시계를 UTC 시간으로 설정, 온라인 서버와 동기화 유지

분류에서Dev

Xamarin.Android에서 전면 카메라의 비디오를 녹화하는 방법은 무엇입니까?

분류에서Dev

일광 절약 시간 제로 시간을 변경하는 동안 DateTime 오류

분류에서Dev

WP8에서 비디오를 녹화하는 동안 카메라의 해상도를 변경하는 방법

분류에서Dev

입력 및 출력 오디오를 동시에 녹음하는 방법은 무엇입니까?

분류에서Dev

미디어 플레이어를 사용하여 비디오를 녹화하는 동안 일부 장치에서 실패 -19 시작

분류에서Dev

Raspberry PI에서 2 개의 동일한 카메라로 동시 비디오 녹화

분류에서Dev

아니요 '디스크 공간을 절약하려면이 드라이브를 압축하십시오.'

분류에서Dev

Alsa Pulse Audio에서 오디오 장치 펄스를 열 수 없음 (해당 파일 또는 디렉터리 없음) 펄스 : 입력 / 출력 오류

분류에서Dev

URL에서 비디오를 스트리밍하는 동안 오디오 또는 비디오 만 캡처하는 방법은 무엇입니까?

분류에서Dev

작은 화면에서 스크롤하는 동안 내 navbar가 약간 오른쪽으로 이동하는 이유는 무엇입니까?

분류에서Dev

명령 줄에서 특정 시간 동안 특정 시간에 오디오 스트림 녹음 시작

분류에서Dev

Swift 3.0에서 비디오를 녹화하는 동안 Flash가 작동하지 않습니다.

분류에서Dev

momentjs를 사용하여 UTC에서 동부 일광 절약 시간으로 현재 오프셋을 얻는 방법은 무엇입니까?

분류에서Dev

cwac-camera에서 비디오 녹화를 위해 카메라 매개 변수를 조정하는 방법은 무엇입니까?

분류에서Dev

qml의 카메라가 비디오 녹화를 지원하지 않는 이유는 무엇입니까?

분류에서Dev

디스크를 비우는 동안 쓰기 오류를 무시하는 방법은 무엇입니까?

분류에서Dev

HD 비디오를 여러 시간 동안 일시 중지하면 하드 디스크가 손상됩니까?

분류에서Dev

ffmpeg를 사용하여 녹화하는 동안 비디오에서 프레임 추출

분류에서Dev

카메라로 녹화 된 비디오를 회전하는 방법은 무엇입니까?

분류에서Dev

pytz 시간대에 일광 절약 시간 동안 잘못된 오프셋이 있습니다.

분류에서Dev

텍스트를 입력하는 동안 노틸러스 3.6에서 검색을 비활성화하는 방법!

분류에서Dev

커널을 컴파일하는 동안 시간 절약

분류에서Dev

VM에서 디스크 공간 절약

분류에서Dev

비디오 스트림이 제약 조건에서로드되면 Android에서 내 카메라를 게시하는 상대 레이아웃보기를 숨 깁니다.

분류에서Dev

실시간으로 카메라의 비디오를 캡처하는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    Kinect 카메라를 통해 비디오와 오디오를 동시에 녹화하는 방법

  2. 2

    Android에서 비디오를 녹화하는 동안 텍스트를 삽입하는 방법은 무엇입니까?

  3. 3

    일광 절약 시간에 대한 시간 업데이트, 시스템 시계를 UTC 시간으로 설정, 온라인 서버와 동기화 유지

  4. 4

    일광 절약 시간에 대한 시간 업데이트, 시스템 시계를 UTC 시간으로 설정, 온라인 서버와 동기화 유지

  5. 5

    Xamarin.Android에서 전면 카메라의 비디오를 녹화하는 방법은 무엇입니까?

  6. 6

    일광 절약 시간 제로 시간을 변경하는 동안 DateTime 오류

  7. 7

    WP8에서 비디오를 녹화하는 동안 카메라의 해상도를 변경하는 방법

  8. 8

    입력 및 출력 오디오를 동시에 녹음하는 방법은 무엇입니까?

  9. 9

    미디어 플레이어를 사용하여 비디오를 녹화하는 동안 일부 장치에서 실패 -19 시작

  10. 10

    Raspberry PI에서 2 개의 동일한 카메라로 동시 비디오 녹화

  11. 11

    아니요 '디스크 공간을 절약하려면이 드라이브를 압축하십시오.'

  12. 12

    Alsa Pulse Audio에서 오디오 장치 펄스를 열 수 없음 (해당 파일 또는 디렉터리 없음) 펄스 : 입력 / 출력 오류

  13. 13

    URL에서 비디오를 스트리밍하는 동안 오디오 또는 비디오 만 캡처하는 방법은 무엇입니까?

  14. 14

    작은 화면에서 스크롤하는 동안 내 navbar가 약간 오른쪽으로 이동하는 이유는 무엇입니까?

  15. 15

    명령 줄에서 특정 시간 동안 특정 시간에 오디오 스트림 녹음 시작

  16. 16

    Swift 3.0에서 비디오를 녹화하는 동안 Flash가 작동하지 않습니다.

  17. 17

    momentjs를 사용하여 UTC에서 동부 일광 절약 시간으로 현재 오프셋을 얻는 방법은 무엇입니까?

  18. 18

    cwac-camera에서 비디오 녹화를 위해 카메라 매개 변수를 조정하는 방법은 무엇입니까?

  19. 19

    qml의 카메라가 비디오 녹화를 지원하지 않는 이유는 무엇입니까?

  20. 20

    디스크를 비우는 동안 쓰기 오류를 무시하는 방법은 무엇입니까?

  21. 21

    HD 비디오를 여러 시간 동안 일시 중지하면 하드 디스크가 손상됩니까?

  22. 22

    ffmpeg를 사용하여 녹화하는 동안 비디오에서 프레임 추출

  23. 23

    카메라로 녹화 된 비디오를 회전하는 방법은 무엇입니까?

  24. 24

    pytz 시간대에 일광 절약 시간 동안 잘못된 오프셋이 있습니다.

  25. 25

    텍스트를 입력하는 동안 노틸러스 3.6에서 검색을 비활성화하는 방법!

  26. 26

    커널을 컴파일하는 동안 시간 절약

  27. 27

    VM에서 디스크 공간 절약

  28. 28

    비디오 스트림이 제약 조건에서로드되면 Android에서 내 카메라를 게시하는 상대 레이아웃보기를 숨 깁니다.

  29. 29

    실시간으로 카메라의 비디오를 캡처하는 방법은 무엇입니까?

뜨겁다태그

보관