forked from geerlingguy/pi-timelapse
-
Notifications
You must be signed in to change notification settings - Fork 0
/
timelapse.py
145 lines (112 loc) · 4.26 KB
/
timelapse.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
from picamera import PiCamera
import errno
import os
import sys
import threading
from datetime import datetime
from time import sleep
import yaml
import autofocus
config = yaml.safe_load(open(os.path.join(sys.path[0], "config.yml")))
image_number = 0
startHour = config['startHour']
startMinute = config['startMinute']
endHour = config['endHour']
endMinute = config['endMinute']
enableTimeframe = config['enableTimeframe']
def create_timestamped_dir(dir):
try:
os.makedirs(dir)
print("\nDirectory created: {}\n".format(dir))
except OSError as e:
if e.errno != errno.EEXIST:
raise
def set_camera_options(camera):
# Set camera resolution.
if config['resolution']:
camera.resolution = (
config['resolution']['width'],
config['resolution']['height']
)
# Set ISO.
if config['iso']:
camera.iso = config['iso']
# Set shutter speed.
if config['shutter_speed']:
camera.shutter_speed = config['shutter_speed']
# Sleep to allow the shutter speed to take effect correctly.
sleep(1)
camera.exposure_mode = 'off'
# Set white balance.
if config['white_balance']:
camera.awb_mode = 'off'
camera.awb_gains = (
config['white_balance']['red_gain'],
config['white_balance']['blue_gain']
)
# Set camera rotation
if config['rotation']:
camera.rotation = config['rotation']
return camera
def create_timelapse_media():
# Create an animated gif (Requires ImageMagick).
if config['create_gif']:
print ("\nCreating animated gif.\n")
os.system('convert -delay 10 -loop 0 ' + dir + '/image-*.jpg ' + dir + '/timelapse.gif')
# Create a video (Requires ffmpeg).
if config['create_video']:
print ("\nCreating video.\n")
os.system('ffmpeg -framerate 10 -i ' + dir + '/image-%05d.jpg -vf format=yuv420p ' + dir + '/timelapse.mp4')
def isLapseTimeHoursValid():
# Determine if current time is within range to take pictures
now = datetime.now().timetz()
def isStartTimeValid():
if startHour == now.hour:
return startMinute <= now.minute
else:
return startHour < now.hour
def isEndTimeValid():
if now.hour == endHour:
return now.minute <= endMinute
else:
return now.hour < endHour
return not enableTimeframe or (enableTimeframe and isStartTimeValid() and isEndTimeValid())
def capture_image():
try:
global image_number
# Set a timer to take another picture at the proper interval after this picture is taken
if (image_number < (config['total_images'])):
# Validate timeframe is valid
while not isLapseTimeHoursValid():
print ("Timelapse on hold at: {}".format(datetime.now()))
sleep(config['waitingPeriod'])
# Sleep and call "new" thread
threading.Timer(config['interval'], capture_image).start() # TODO: This generates new thread?
# Update counter
image_number += 1
now = datetime.now()
print("{} of {} at {}".format(image_number, config['total_images'], now.strftime("%Y-%m-%d %H:%M:%S")))
# Start up the camera.
camera = PiCamera()
set_camera_options(camera)
# Capture a picture.
camera.capture(dir + '/image-{0:05d}.jpg'.format(image_number))
camera.close()
else: # TODO: Fix the fact of possible multiple threads and move below code at the end of the file
print ("\nTime-lapse capture complete!\n")
# TODO: This doesn't pop user into the except block below :(.
create_timelapse_media()
sys.exit()
except (KeyboardInterrupt, SystemExit):
print ("\nTime-lapse capture terminated.\n")
# Create directory based on current timestamp.
dir = os.path.join(
sys.path[0],
'Timelapse-' + datetime.now().strftime('%Y%m%d_%H%M%S')
)
# Kick off the capture process.
print ("\nTime-lapse capture started!\n")
print ("\nResolution: {}x{}\n\n".format(config['resolution']['width'],config['resolution']['height']))
create_timestamped_dir(dir)
autofocus.autoadjustfocus()
capture_image()