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] 삭제
몇 마디 만하겠습니다