So I've been wanting to make a timelapse while using my resin printer. There are some known ways to do this this this: https://www.hackster.io/ryanjgill2/msla-smooth-time-lapse-199d87
or by using a DLSR camera and a photoresistor via a 2.5mm jack to remote trigger.
My wife is very guarding of her DLSR so that is out of the question.
I am by all means not a coder, I know how to setup configs for printers, and I want to believe that I can understand some lines, but I'll just stick to what I do best, mechanical design engineering and modelling!
So back to the Hackster model.
I have a Pi already connected to the printer as I run it off OctoPrint.
Though included timelapse in OctoPrint won't work as I can only call on a given time interval the result is lacking.
The Hackster model runs of a PiCamera, I do not have such and I think 90 € is a high price for what it does, so I must rely on my C920HD USB camera.
Looking at the code made by Ryan:
from gpiozero import Button
from picamera import PiCamera
from signal import pause
import time
camera = PiCamera()
camera.resolution = '3280x2464'
currentTime = int
def capture():
currentTime = int(round(time.time() * 1000))
image_path = '/mnt/usb/photos/image_%s.jpg' % currentTime
camera.capture(image_path)
print('Image captured: %d' % currentTime)
button = Button(14)
button.when_pressed = capture
pause()
I can conclude that I need to edit some of it.
I already know that my C920 can be used via fswebcam
or ffmpeg
and I know the resolution, though I do not know what is actually needed to be defined here?
Either way the full command to take a picture could/would look like this using fswebcam
:
fswebcam -r 1920x1080 --no-banner /images/image1.jpg
I also know that I can use os.system
to handle this.
So with the little to no knowledge I actually hold, I came up with this, but I'm obviously here because it didn't work.
import time
import os
from gpiozero import Button
from signal import pause
currentTime = int
timelapse = os.system('fswebcam -r 1920x1080 -S 3 --jpeg 50 --save /mnt/usb/photos/image_%s.jpg' % currentTime)
def capture():
currentTime = int(round(time.time() * 1000))
image_path = '/mnt/usb/photos/image_%s.jpg' % currentTime
camera.capture(image_path)
print('Image captured: %d' % currentTime)
while True:
os.system('fswebcam -r 1920x1080 -S 3 --jpeg 50 --save /mnt/usb/photos/image_%s.jpg' % currentTime)
button = Button(14)
button.when_pressed = timelapse
pause()
And I would like to create a folder for every new timelapse I run, for the ease of it.
After shooting the pictures I would use:
ffmpeg -framerate 120 -pattern_type glob -i "photos/*.jpg" -s:v 1920x1080 -c:v libx264 -crf 20 -pix_fmt yuv420p timelapse.mp4
But as of writing this, it just occurred to me that I'm trying to use both fswebcam
and ffmpeg
combined.
Have I screwed up completely?
I can clarify the GPIO etc. if this needs but assuming that the lot here has an idea of what's going on.
There's certainly nothing wrong with using appropriate tools for different parts of the job -
fswebcam
is great for grabbing images from the USB web cam, andffmpeg
is great a converting media from one sort to another.There are some other options for accessing a USB webcam through Python, but those are somewhat more involved.
If you're happy stringing commands together as you've done there, then the following should work: