Pi Camera
Start dit hoofdstuk met een nieuwe reservekopie van de Basisimage.
Voor het ogenblik wordt nog volop gewerkt aan een nieuwe python bibliotheek voor de Pi Camera. Meer info kan je vinden op: https://www.raspberrypi.com/documentation/accessories/camera.html.
Eén van de leukste accessoires van de Raspberry Pi is het kleine Pi Cameraboard, een kleine printplaat met camerasensor die via een lintkabel verbinding maakt met de Raspberry Pi.
De Pi Camera kan op verschillende manieren gebruikt worden, bijvoorbeeld als time-lapse fotocamera of als webcam. Hij kan echter ook als optische sensor dienen voor een robot die door de Pi wordt aangestuurd. Omdat de camera geen usb-aansluiting heeft en erg weinig energie verbruikt, is hij veelzijdiger in te zetten dan een standaard webcam.
De Pi Camera zelf is overigens geen simpel dingetje - de Pi Camera Module 2 met een 8-megapixel-sensor kan 1080p-videoopnames maken, de Pi Camera Module 3 (12 MP) kan zelfs 4K foto's nemen. De Pi Camera is ook beschikbaar zonder Infrarood filter, waardoor deze ook gevoelig is voor infrarood licht. Handig voor warmtemetingen, nachtopnames, gezichtsherkenning, bewaking, enz.
Camera aansluiten
De Pi Camera module is gevoelig voor statische elektriciteit, deze kan de elektronica beschadigen en de camera onbruikbaar maken. Voor je de Pi Camera aansluit of aanraakt, raak je eerst een geleidend materiaal aan dat niet van de aarde geïsoleerd is, bijvoorbeeld een metalen object zoals een radiator of waterkraan.
Om de camera op de Raspberry Pi aan te sluiten, moet je het slot tussen de audio-uitgang en de HDMI-poort opsporen en de sluiting openen. Steek de lintkabel van het cameraboard hierin met de blauwe strook aan de kant van de audio-uitgang. Zorg ervoor dat de aansluitingen van het lint goed in die van de Pi zitten.
Camera aansluiten op een Raspberry Pi 5
De Raspberry Pi 5 gebruikt kleinere CSI/DSI-connectoren dan de Raspberry Pi 4, dus je hebt een adapterkabel of een module nodig die ontworpen is voor de Raspberry Pi Zero (aangezien de Zero en Pi 5 dezelfde formaat connector gebruiken).
Om de camerakabel te monteren zet je de Raspberry Pi uit, trek je de klem heel voorzichtig omhoog, steek vervolgens de kabel er zo ver mogelijk in en druk tenslotte de klem weer omlaag.
Het belangrijkste is om ervoor te zorgen dat je de kabels op de juiste manier aansluit.
De kleine metalen tanden moeten naar de Ethernet-connector en PoE-pinnen gericht zijn (in de afbeelding hieronder is de clip nog niet vastgezet):

Raspberry Pi OS bijwerken
Voordat we de Raspberry Pi Camera gebruiken, moeten we zeker weten dat de firm- en software helemaal up-to-date zijn. Dat doen we met een snelle software-upgrade. Open hiervoor een terminal en typ het volgende:
pi@raspberrypi:~ $ sudo apt update && sudo apt upgrade -y
[sudo] wachtwoord voor pi:
Geraakt:1 http://deb.debian.org/debian trixie InRelease
Geraakt:2 http://deb.debian.org/debian trixie-updates InRelease
Geraakt:3 http://deb.debian.org/debian-security trixie-security InRelease
Geraakt:4 http://archive.raspberrypi.com/debian trixie InRelease
Alle pakketten zijn up-to-date.
Samenvatting:
Opwaarderen: 0, Installeren: 0, Verwijderen: 0, Niet opwaarderen: 0
Foto's nemen
Om foto's met de Raspberry Pi te nemen, hoef je alleen maar het volgende in te voeren:
pi@raspberrypi:~ $ rpicam-still -o Foto.jpg
[0:07:01.568611049] [2370] INFO Camera camera_manager.cpp:340 libcamera v0.7.1+rpt20260609
[0:07:01.581658203] [2373] INFO RPI pisp.cpp:720 libpisp version v1.6.0 29-06-2026 (16:17:40)
[0:07:01.595559489] [2373] INFO IPAProxy ipa_proxy.cpp:184 Using tuning file /usr/share/libcamera/ipa/rpi/pisp/ov5647.json
[0:07:01.606332157] [2373] INFO Camera camera_manager.cpp:223 Adding camera '/base/axi/pcie@1000120000/rp1/i2c@88000/ov5647@36' for pipeline handler rpi/pisp
[0:07:01.606366824] [2373] INFO RPI pisp.cpp:1181 Registered camera /base/axi/pcie@1000120000/rp1/i2c@88000/ov5647@36 to CFE device /dev/media0 and ISP device /dev/media1 using PiSP variant BCM2712_C0
WARNING: Capture will not make use of temporal denoise
Consider using the --zsl option for best results, for example:
rpicam-still --zsl -o Foto.jpg
Made X/EGL preview window
[0:07:02.075414628] [2373] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format Nc30
[0:07:02.075473295] [2373] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format Nc12
Mode selection for 1296:972:12:P
SGBRG10_CSI2P,640x480/0 - Score: 3296
SGBRG10_CSI2P,1296x972/0 - Score: 1000
SGBRG10_CSI2P,1920x1080/0 - Score: 1349.67
SGBRG10_CSI2P,2592x1944/0 - Score: 1567
Stream configuration adjusted
[0:07:02.075709314] [2370] INFO Camera camera.cpp:1216 configuring streams: (0) 1296x972-YUV420/sYCC (1) 1296x972-GBRG_PISP_COMP1/RAW
[0:07:02.075815203] [2373] INFO RPI pisp.cpp:1485 Sensor: /base/axi/pcie@1000120000/rp1/i2c@88000/ov5647@36 - Selected sensor format: 1296x972-SGBRG10_1X10/RAW - Selected CFE format: 1296x972-PC1g/RAW
[0:07:07.116059067] [2373] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format Nc30
[0:07:07.116096956] [2373] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format Nc12
Mode selection for 2592:1944:12:P
SGBRG10_CSI2P,640x480/0 - Score: 7832
SGBRG10_CSI2P,1296x972/0 - Score: 5536
SGBRG10_CSI2P,1920x1080/0 - Score: 4238.67
SGBRG10_CSI2P,2592x1944/0 - Score: 1000
Stream configuration adjusted
[0:07:07.116331827] [2370] INFO Camera camera.cpp:1216 configuring streams: (0) 2592x1944-YUV420/sYCC (1) 2592x1944-GBRG_PISP_COMP1/RAW
[0:07:07.117280274] [2373] INFO RPI pisp.cpp:1485 Sensor: /base/axi/pcie@1000120000/rp1/i2c@88000/ov5647@36 - Selected sensor format: 2592x1944-SGBRG10_1X10/RAW - Selected CFE format: 2592x1944-PC1g/RAW
Still capture image received
Je ziet dan gedurende vijf seconden een preview van het beeld van de camera, daarna wordt het laatste frame van het filmpje vastgelegd. Om de handleiding van een opdracht weer te geven, gebruik je de optie --help:
pi@raspberrypi:~ $ DISPLAY=:0 rpicam-still --help
Valid options are:
-h [ --help ] [=arg(=1)] (=0) Print this help message
--version [=arg(=1)] (=0) Displays the build version number
--list-cameras [=arg(=1)] (=0) Lists the available cameras attached to the system.
--camera arg (=0) Chooses the camera to use. To list the available indexes, use the
--list-cameras option.
-v [ --verbose ] [=arg(=2)] (=1) Set verbosity level. Level 0 is no output, 1 is default, 2 is verbose.
-c [ --config ] [=arg(=config.txt)] Read the options from a file. If no filename is specified, default to
config.txt. In case of duplicate options, the ones provided on the command line
will be used. Note that the config file must only contain the long form
options.
--info-text arg (=#%frame (%fps fps) exp %exp ag %ag dg %dg)
Sets the information string on the titlebar. Available values:
%frame (frame number)
%fps (framerate)
%exp (shutter speed)
%ag (analogue gain)
%dg (digital gain)
%rg (red colour gain)
%bg (blue colour gain)
%focus (focus FoM value)
%aelock (AE locked status)
%lp (lens position, if known)
%temp (sensor temperature, if available)
%afstate (AF state, if supported)
--width arg (=0) Set the output image width (0 = use default value)
--height arg (=0) Set the output image height (0 = use default value)
-t [ --timeout ] arg (=5sec) Time for which program runs. If no units are provided default to ms.
-o [ --output ] arg Set the output file name
--post-process-file arg Set the file name for configuring the post-processing
--post-process-libs arg Set a custom location for the post-processing library .so files
-n [ --nopreview ] [=arg(=1)] (=0) Do not show a preview window
-p [ --preview ] arg (=0,0,0,0) Set the preview window dimensions, given as x,y,width,height e.g. 0,0,640,480
-f [ --fullscreen ] [=arg(=1)] (=0) Use a fullscreen preview window
--qt-preview [=arg(=1)] (=0) Use Qt-based preview window (WARNING: causes heavy CPU load, fullscreen not
supported)
--preview-libs arg Set a custom location for the preview library .so files
--hflip [=arg(=1)] (=0) Request a horizontal flip transform
--vflip [=arg(=1)] (=0) Request a vertical flip transform
--rotation arg (=0) Request an image rotation, 0 or 180
--roi arg (=0,0,0,0) Set region of interest (digital zoom) e.g. 0.25,0.25,0.5,0.5
--shutter arg (=0) Set a fixed shutter speed. If no units are provided default to us
--analoggain arg (=0) Set a fixed gain value (synonym for 'gain' option)
--gain arg Set a fixed gain value
--metering arg (=centre) Set the metering mode (centre, spot, average, custom)
--exposure arg (=normal) Set the exposure mode (normal, sport)
--ev arg (=0) Set the EV exposure compensation, where 0 = no change
--awb arg (=auto) Set the AWB mode (auto, incandescent, tungsten, fluorescent, indoor, daylight,
cloudy, custom)
--awbgains arg (=0,0) Set explict red and blue gains (disable the automatic AWB algorithm)
--ccm arg Set an explicit colour correction matrix (NOTE: must also set explicit AWB
gains)
--flush [=arg(=1)] (=0) Flush output data as soon as possible
--wrap arg (=0) When writing multiple output files, reset the counter when it reaches this
number
--brightness arg (=0) Adjust the brightness of the output images, in the range -1.0 to 1.0
--contrast arg (=1) Adjust the contrast of the output image, where 1.0 = normal contrast
--saturation arg (=1) Adjust the colour saturation of the output, where 1.0 = normal and 0.0 =
greyscale
--sharpness arg (=1) Adjust the sharpness of the output image, where 1.0 = normal sharpening
--framerate arg (=-1) Set the fixed framerate for preview and video modes
--denoise arg (=auto) Sets the Denoise operating mode: auto, off, cdn_off, cdn_fast, cdn_hq
--viewfinder-width arg (=0) Width of viewfinder frames from the camera (distinct from the preview window
size
--viewfinder-height arg (=0) Height of viewfinder frames from the camera (distinct from the preview window
size)
--tuning-file arg (=-) Name of camera tuning file to use, omit this option for libcamera default
behaviour
--lores-width arg (=0) Width of low resolution frames (use 0 to omit low resolution stream)
--lores-height arg (=0) Height of low resolution frames (use 0 to omit low resolution stream)
--lores-par [=arg(=1)] (=0) Preserve the pixel aspect ratio of the low res image (where possible) by
applying a different crop on the stream.
--mode arg Camera mode as W:H:bit-depth:packing, where packing is P (packed) or U
(unpacked)
--viewfinder-mode arg Camera mode for preview as W:H:bit-depth:packing, where packing is P (packed)
or U (unpacked)
--buffer-count arg (=0) Number of in-flight requests (and buffers) configured for video, raw, and
still.
--viewfinder-buffer-count arg (=0) Number of in-flight requests (and buffers) configured for preview window.
--no-raw [=arg(=1)] (=0) Disable requesting of a RAW stream. Will override any manual mode reqest the
mode choice when setting framerate.
--autofocus-mode arg (=default) Control to set the mode of the AF (autofocus) algorithm.(manual, auto,
continuous)
--autofocus-range arg (=normal) Set the range of focus distances that is scanned.(normal, macro, full)
--autofocus-speed arg (=normal) Control that determines whether the AF algorithm is to move the lens as quickly
as possible or more steadily.(normal, fast)
--autofocus-window arg (=0,0,0,0) Sets AfMetering to AfMeteringWindows an set region used, e.g.
0.25,0.25,0.5,0.5
--lens-position arg Set the lens to a particular focus position, expressed as a reciprocal distance
(0 moves the lens to infinity), or "default" for the hyperfocal distance
--hdr [=arg(=auto)] (=off) Enable High Dynamic Range, where supported. Available values are "off", "auto",
"sensor" for sensor HDR (e.g. for Camera Module 3), "single-exp" for PiSP based
single exposure multiframe HDR
--metadata arg Save captured image metadata to a file or "-" for stdout
--metadata-format arg (=json) Format to save the metadata in, either txt or json (requires --metadata)
--flicker-period arg (=0s) Manual flicker correction period
Set to 10000us to cancel 50Hz flicker.
Set to 8333us to cancel 60Hz flicker.
-q [ --quality ] arg (=93) Set the JPEG quality parameter
-x [ --exif ] arg Add these extra EXIF tags to the output file
--timelapse arg (=0ms) Time interval between timelapse captures. If no units are provided default to
ms.
--framestart arg (=0) Initial frame counter value for timelapse captures
--datetime [=arg(=1)] (=0) Use date format for output file names
--timestamp [=arg(=1)] (=0) Use system timestamps for output file names
--restart arg (=0) Set JPEG restart interval
-k [ --keypress ] [=arg(=1)] (=0) Perform capture when ENTER pressed
-s [ --signal ] [=arg(=1)] (=0) Perform capture when signal received
--thumb arg (=320:240:70) Set thumbnail parameters as width:height:quality, or none
-e [ --encoding ] arg (=jpg) Set the desired output encoding, either jpg, png, rgb/rgb24, rgb48, bmp or
yuv420
-r [ --raw ] [=arg(=1)] (=0) Also save raw file in DNG format
--latest arg Create a symbolic link with this name to most recent saved file
--immediate [=arg(=1)] (=0) Perform first capture immediately, with no preview phase
--autofocus-on-capture [=arg(=1)] (=0)
Switch to AfModeAuto and trigger a scan just before capturing a still
--zsl [=arg(=1)] (=0) Use the capture mode for preview in order to reduce the shutter lag for the
final capture
Zo kom je bijvoorbeeld te weten dat je met de optie -v 0 minder meldingen krijgt, die eigenlijk bestemd zijn voor de ontwikkelaar of bij problemen:
pi@raspberrypi:~ $ rpicam-still -o Foto.jpg -v 0
WARNING: Capture will not make use of temporal denoise
Consider using the --zsl option for best results, for example:
rpicam-still --zsl -o Foto.jpg
Video opnemen
Om een filmpje op te nemen, gebruiken we een gelijkaardige opdracht, rpicam-vid, op de volgende manier:
pi@raspberrypi:~ $ rpicam-vid -o Video.h264 -v 0
[libx264 @ 0x55565e71c590] using cpu capabilities: ARMv8 NEON
[libx264 @ 0x55565e71c590] profile High, level 3.0, 4:2:0, 8-bit
Output #0, h264, to 'Video.h264':
Stream #0:0: Video: h264, yuv420p(tv, smpte170m/smpte170m/bt709), 640x480, q=2-31, 30 fps, 30 tbr, 1000k tbn
Side data:
cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A
[libx264 @ 0x55565e71c590] frame I:5 Avg QP:16.19 size: 44678
[libx264 @ 0x55565e71c590] frame P:69 Avg QP:17.44 size: 4092
[libx264 @ 0x55565e71c590] frame B:62 Avg QP:19.27 size: 847
[libx264 @ 0x55565e71c590] consecutive B-frames: 8.8% 91.2%
[libx264 @ 0x55565e71c590] mb I I16..4: 5.8% 27.1% 67.1%
[libx264 @ 0x55565e71c590] mb P I16..4: 0.9% 1.6% 0.4% P16..4: 43.3% 0.0% 0.0% 0.0% 0.0% skip:53.9%
[libx264 @ 0x55565e71c590] mb B I16..4: 0.1% 0.1% 0.0% B16..8: 6.3% 0.0% 0.0% direct:11.8% skip:81.8% L0:23.7% L1:67.4% BI: 8.9%
[libx264 @ 0x55565e71c590] 8x8 transform intra:35.0% inter:33.2%
[libx264 @ 0x55565e71c590] coded y,uvDC,uvAC intra: 74.1% 88.5% 78.8% inter: 7.8% 20.3% 3.4%
[libx264 @ 0x55565e71c590] i16 v,h,dc,p: 35% 18% 12% 35%
[libx264 @ 0x55565e71c590] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 21% 15% 22% 3% 11% 8% 8% 7% 5%
[libx264 @ 0x55565e71c590] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 24% 30% 11% 3% 8% 6% 5% 5% 8%
[libx264 @ 0x55565e71c590] i8c dc,h,v,p: 28% 29% 28% 16%
[libx264 @ 0x55565e71c590] kb/s:985.95
Standaard wordt daarmee ook vijf seconden aan video opgenomen. De video speel je af met:
pi@raspberrypi:~ $ ffplay -autoexit Video.h264
ffplay version 7.1.5-0+deb13u1+rpt1 Copyright (c) 2003-2026 the FFmpeg developers
built with gcc 14 (Debian 14.2.0-19)
configuration: --prefix=/usr --extra-version=0+deb13u1+rpt1 --toolchain=hardened --incdir=/usr/include/aarch64-linux-gnu --enable-gpl --disable-s
tripping --disable-libmfx --disable-mmal --disable-omx --enable-gnutls --enable-libaom --enable-libass --enable-libbs2b --enable-libcdio --enable-l
ibcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --
enable-libgsm --enable-libharfbuzz --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-librub
berband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-libtwolame --enable-libvidstab --enable
-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-openal --enable-opencl --e
nable-opengl --disable-sndio --disable-libvpl --libdir=/usr/lib/aarch64-linux-gnu --arch=arm64 --enable-neon --enable-v4l2-request --enable-libudev
--enable-epoxy --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-vout-drm --enable-chromaprint --enable-frei0r --enable-ladspa --en
able-libbluray --enable-libcaca --enable-libdvdnav --enable-libdvdread --enable-libjack --enable-libpulse --enable-librabbitmq --enable-librist --e
nable-libsrt --enable-libssh --enable-libsvtav1 --enable-libx264 --enable-libzmq --enable-libzvbi --enable-lv2 --enable-sand --enable-sdl2 --enable
-libplacebo --enable-librav1e --enable-pocketsphinx --enable-librsvg --enable-libjxl --enable-shared
libavutil 59. 39.100 / 59. 39.100
libavcodec 61. 19.101 / 61. 19.101
libavformat 61. 7.103 / 61. 7.103
libavdevice 61. 3.100 / 61. 3.100
libavfilter 10. 5.100 / 10. 5.100
libswscale 8. 3.100 / 8. 3.100
libswresample 5. 3.100 / 5. 3.100
libpostproc 58. 3.100 / 58. 3.100
Input #0, h264, from 'Video.h264': 0KB vq= 0KB sq= 0B
Duration: N/A, bitrate: N/A
Stream #0:0: Video: h264 (High), yuv420p(tv, smpte170m/smpte170m/bt709, progressive), 640x480, 25 fps, 1200k tbr, 1200k tbn
nan M-V: nan fd= 0 aq= 0KB vq= 0KB sq= 0B
De foto's en video's worden standaard in de thuismap van de Pi gebruiker opgeslagen.
Start in de grafische omgeving van de Pi de Bestandsbeheerder en dubbelklik op de foto om deze weer te geven.
De standaard mediaspeler (VLC), speelt de video Video.h264 zonder problemen af.
Voor sommige mediaspelers, moet je deze eerst converteren naar een MP4 bestand (mp4 bepaalt hoe de video in het bestand is opgenomen, h264 is de manier waarop is gecodeerd).
Video streamen
Je kunt de videobeelden ook streamen over een netwerk naar een programma op een ander apparaat. Start daarvoor de volgende opdracht:
pi@raspberrypi:~ $ rpicam-vid -t 0 --codec mjpeg --inline --listen -o tcp://0.0.0.0:8080 -v 0
Start VLC Media Player op en start in het menu Media de opdracht Netwerkstream openen...
Geef als netwerk-url tcp/mjpeg://raspberrypi:8080 op en klik op de knop Afspelen.
Vervang daarbij raspberrypy door de hostname of het IP adres van jouw eigen Raspberry Pi.
Indien je VLC op de Raspberry Pi zelf gebruikt, staat het afspeelvenster van VLC achter het venster met de voorvertoning van de camera.
Stop je het afspelen, dan wordt automatisch het streamen gestopt.
Je kunt dit ook testen in een tweede terminal met de opdracht:
pi@raspberrypi:~ $ ffplay tcp://raspberrypi:8080 -vf "setpts=N/30" -fflags nobuffer -flags low_delay -framedrop -hide_banner -loglevel error
NoIR
De NoIR Raspberry Pi camera's bevatten geen infrarood filter en zijn dus gevoelig voor infrarood. Handig voor het nemen van foto's in het donker (bewakingscamera), maar niet voor overdag.
Door echter aangepaste opties te gebruiken, kan je ook overdag redelijk goede (herkenbare) foto's nemen. Daar enkel specialisten in staat zijn dergelijke opties goed in te stellen, worden deze in het Raspberry Pi OS ter beschikking gesteld in bestanden. Deze tuning bestanden kan je per type camera terugvinden in:
- Voor modellen ouder dan de Raspberry Pi 5 in de map /usr/share/libcamera/ipa/rpi/vc4/.
- Vanaf de Raspberry Pi 5 in de map /usr/share/libcamera/ipa/rpi/pisp/.
Een voorbeeld: op een Raspberry Pi 3 hebben we een NoIR camera aangesloten. Om het type camera te achterhalen, voer je de volgende opdracht uit:
pi@raspberrypi:~ $ rpicam-still --list-cameras
Available cameras
-----------------
0 : imx219 [3280x2464 10-bit RGGB] (/base/soc/i2c0mux/i2c@1/imx219@10)
Modes: 'SRGGB10_CSI2P' : 640x480 [103.33 fps - (1000, 752)/1280x960 crop]
1640x1232 [41.85 fps - (0, 0)/3280x2464 crop]
1920x1080 [47.57 fps - (680, 692)/1920x1080 crop]
3280x2464 [21.19 fps - (0, 0)/3280x2464 crop]
'SRGGB8' : 640x480 [103.33 fps - (1000, 752)/1280x960 crop]
1640x1232 [41.85 fps - (0, 0)/3280x2464 crop]
1920x1080 [47.57 fps - (680, 692)/1920x1080 crop]
3280x2464 [21.19 fps - (0, 0)/3280x2464 crop]
Daaruit blijkt dat we met een imx219 camera werken. Op een Raspberry Pi 3 maak je met deze NoIR camera een foto overdag met:
pi@raspberrypi:~ $ rpicam-still -o NoIR.jpg --tuning-file /usr/share/libcamera/ipa/rpi/vc4/imx219_noir.json --nopreview
[0:04:22.785439950] [1799] INFO Camera camera_manager.cpp:340 libcamera v0.7.1+rpt20260609
[0:04:22.816492430] [1802] INFO RPI pipeline_base.cpp:1133 Using configuration file '/usr/share/libcamera/pipeline/rpi/vc4/rpi_apps.yaml'
[0:04:22.874792191] [1802] INFO IPAProxy ipa_proxy.cpp:184 Using tuning file /usr/share/libcamera/ipa/rpi/vc4/imx219_noir.json
[0:04:22.890030902] [1802] INFO Camera camera_manager.cpp:223 Adding camera '/base/soc/i2c0mux/i2c@1/imx219@10' for pipeline handler rpi/vc4
[0:04:22.890132726] [1802] INFO RPI vc4.cpp:445 Registered camera /base/soc/i2c0mux/i2c@1/imx219@10 to Unicam device /dev/media2 and ISP device /dev/media0
Mode selection for 1640:1232:12:P
SRGGB10_CSI2P,640x480/0 - Score: 4504.81
SRGGB10_CSI2P,1640x1232/0 - Score: 1000
SRGGB10_CSI2P,1920x1080/0 - Score: 1541.48
SRGGB10_CSI2P,3280x2464/0 - Score: 1718
SRGGB8,640x480/0 - Score: 5504.81
SRGGB8,1640x1232/0 - Score: 2000
SRGGB8,1920x1080/0 - Score: 2541.48
SRGGB8,3280x2464/0 - Score: 2718
[0:04:23.447570989] [1799] INFO Camera camera.cpp:1216 configuring streams: (0) 1640x1232-YUV420/sYCC (1) 1640x1232-SBGGR10_CSI2P/RAW
[0:04:23.448161360] [1802] INFO RPI vc4.cpp:620 Sensor: /base/soc/i2c0mux/i2c@1/imx219@10 - Selected sensor format: 1640x1232-SBGGR10_1X10/RAW - Selected unicam format: 1640x1232-pBAA/RAW
Mode selection for 3280:2464:12:P
SRGGB10_CSI2P,640x480/0 - Score: 10248.8
SRGGB10_CSI2P,1640x1232/0 - Score: 6744
SRGGB10_CSI2P,1920x1080/0 - Score: 6655.48
SRGGB10_CSI2P,3280x2464/0 - Score: 1000
SRGGB8,640x480/0 - Score: 11248.8
SRGGB8,1640x1232/0 - Score: 7744
SRGGB8,1920x1080/0 - Score: 7655.48
SRGGB8,3280x2464/0 - Score: 2000
[0:04:28.549246924] [1799] INFO Camera camera.cpp:1216 configuring streams: (0) 3280x2464-YUV420/sYCC (1) 3280x2464-SBGGR10_CSI2P/RAW
[0:04:28.550432232] [1802] INFO RPI vc4.cpp:620 Sensor: /base/soc/i2c0mux/i2c@1/imx219@10 - Selected sensor format: 3280x2464-SBGGR10_1X10/RAW - Selected unicam format: 3280x2464-pBAA/RAW
Still capture image received
De volgende foto is genomen met --tuning-file.
Onderstaande foto zonder --tuning-file.
IP Camera
Om een Raspberry Pi met Pi Camera om te bouwen naar een beveiligingscamera maken we gebruik van extra software. De software zorgt dat er een videostream wordt geproduceerd die je via een browser, beveiligingsinstallatie en/of domotica-controller kunt bekijken, beheren en analyseren. Hoewel dit kan met standaard Raspberry Pi software, gaan we nu een kant en klaar programma gebruiken. Wij gaan hier MediaMTX gebruiken, maar je kunt ook kiezen voor MistServer of go2rtc.
- Eerst downloaden we de software van de MediaMTX Github Release pagina.
Dit kan via een klassieke browser, maar wij doen het via terminal opdrachten.
Daarvoor vragen we eerst op welke de meest recente versie is:
pi@raspberrypi:~ $
Controleer of je wel degelijk een versienummer hebt ontvangen. Soms gebeurt het namelijk dat GitHub geen versienummer heeft verzonden, probeer het dan nog eens.latest=$(curl -s https://api.github.com/repos/bluenviron/mediamtx/releases/latest | grep -oP '"tag_name": "\K(.*)(?=")' | cut -d$'v' -f 2)pi@raspberrypi:~ $
Als je een versienummer hebt ontvangen, kan je de MediaMTX software downloaden:echo $latest
1.19.3pi@raspberrypi:~ $
Voor we de software uitpakken, maken we een map aan waarin we de software gaan installeren en gebruiken.wget https://github.com/bluenviron/mediamtx/releases/download/v${latest}/mediamtx_v${latest}_linux_arm64.tar.gz
--2026-07-29 18:53:27-- https://github.com/bluenviron/mediamtx/releases/download/v1.19.3/mediamtx_v1.19.3_linux_arm64.tar.gz
Herleiden van github.com (github.com)... 140.82.121.4
Verbinding maken met github.com (github.com)|140.82.121.4|:443... verbonden.
HTTP-verzoek is verzonden; wachten op antwoord... 302 Found
Locatie: https://release-assets.githubusercontent.com/github-production-release-asset/230660669/18388bfb-6d99-4d61-a6ad-fbe8247bdf8e?sp=r&sv=2018-11-09&sr=b&spr=http
s&se=2026-07-29T17%3A45%3A17Z&rscd=attachment%3B+filename%3Dmediamtx_v1.19.3_linux_arm64.tar.gz&rsct=application%2Foctet-stream&skoid=96c2d410-5711-43a1-aedd-ab1947a
a7ab0&sktid=398a6654-997b-47e9-b12b-9515b896b4de&skt=2026-07-29T16%3A44%3A23Z&ske=2026-07-29T17%3A45%3A17Z&sks=b&skv=2018-11-09&sig=bonOKHOVWbJ%2F7l2uuDVxvfKhIyLZz%2
BviB4dD6Z0EaTA%3D&jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmVsZWFzZS1hc3NldHMuZ2l0aHVidXNlcmNvbnRlbnQuY29tIiwia2V5Ijoia2V5MSIsIm
V4cCI6MTc4NTM0NTgwNywibmJmIjoxNzg1MzQ0MDA3LCJwYXRoIjoicmVsZWFzZWFzc2V0cHJvZHVjdGlvbi5ibG9iLmNvcmUud2luZG93cy5uZXQifQ.y93zl_gDrlSEfI8n7kwBqujh2kC8pBd1ALw7jEGY5RU&resp
onse-content-disposition=attachment%3B%20filename%3Dmediamtx_v1.19.3_linux_arm64.tar.gz&response-content-type=application%2Foctet-stream [volgen...]
--2026-07-29 18:53:27-- https://release-assets.githubusercontent.com/github-production-release-asset/230660669/18388bfb-6d99-4d61-a6ad-fbe8247bdf8e?sp=r&sv=2018-11-
09&sr=b&spr=https&se=2026-07-29T17%3A45%3A17Z&rscd=attachment%3B+filename%3Dmediamtx_v1.19.3_linux_arm64.tar.gz&rsct=application%2Foctet-stream&skoid=96c2d410-5711-4
3a1-aedd-ab1947aa7ab0&sktid=398a6654-997b-47e9-b12b-9515b896b4de&skt=2026-07-29T16%3A44%3A23Z&ske=2026-07-29T17%3A45%3A17Z&sks=b&skv=2018-11-09&sig=bonOKHOVWbJ%2F7l2
uuDVxvfKhIyLZz%2BviB4dD6Z0EaTA%3D&jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmVsZWFzZS1hc3NldHMuZ2l0aHVidXNlcmNvbnRlbnQuY29tIiwia2
V5Ijoia2V5MSIsImV4cCI6MTc4NTM0NTgwNywibmJmIjoxNzg1MzQ0MDA3LCJwYXRoIjoicmVsZWFzZWFzc2V0cHJvZHVjdGlvbi5ibG9iLmNvcmUud2luZG93cy5uZXQifQ.y93zl_gDrlSEfI8n7kwBqujh2kC8pBd1
ALw7jEGY5RU&response-content-disposition=attachment%3B%20filename%3Dmediamtx_v1.19.3_linux_arm64.tar.gz&response-content-type=application%2Foctet-stream
Herleiden van release-assets.githubusercontent.com (release-assets.githubusercontent.com)... 185.199.108.133, 185.199.109.133, 185.199.110.133, ...
Verbinding maken met release-assets.githubusercontent.com (release-assets.githubusercontent.com)|185.199.108.133|:443... verbonden.
HTTP-verzoek is verzonden; wachten op antwoord... 200 OK
Lengte: 28708539 (27M) [application/octet-stream]
Wordt opgeslagen als: ‘mediamtx_v1.19.3_linux_arm64.tar.gz’
mediamtx_v1.19.3_linux_arm64.tar.gz 100%[==================================================================================>] 27,38M 26,9MB/s in 1,0s
2026-07-29 18:53:28 (26,9 MB/s) - '‘mediamtx_v1.19.3_linux_arm64.tar.gz’' opgeslagen [28708539/28708539]pi@raspberrypi:~ $
En pakken we de software in de aangemaakte map uit:mkdir -p ~/mediamtxpi@raspberrypi:~ $
tar -xzf mediamtx_v${latest}_linux_arm64.tar.gz -C ~/mediamtx - Nu we de software geïnstalleerd hebben, kunnen we MediaMTX configureren voor de Pi Camera.
Open daarvoor met de nano teksteditor het configuratiebestand:
pi@raspberrypi:~ $
Ga op zoek naar instelling rtspTransports, bijvoorbeeld met de sneltoets Ctrl+w of Ctrl+f. Pas deze instelling als volgt aan:nano mediamtx/mediamtx.ymlrtsp: true
Let op het feit dat de regel met de oorspronkelijke instelling werd gedeactiveerd door er een
# Enabled RTSP transport protocols. The handshake is always performed with TCP.
#rtspTransports: [udp, multicast, tcp]
# Force RTSP over TCP for reliability and to avoid common H.264 decode errors caused by packet loss.
rtspTransports: [tcp]#voor te plaatsen (zo kunnen we desnoods nog naar de oorspronkelijke situatie terugkeren). Let ook op de toegevoegde Engelstalige regel met de reden van de aanpassing (hogere betrouwbaarheid).Ga vervolgens op zoek naar de instellingengroep paths: met de definities van de te streamen camera's. Om een Raspberry Pi camera te streamen, pas je de instellingen aan tot:
paths:
Let bij het intypen op het correct inspringen. Het oorspronkelijke MediaMTX configuratie bestand bevat een korte beschijving van alle instellingen. Zoek bijvoorbeeld naar het woord
# example:
# my_camera:
# source: rtsp://my_camera
cam:
source: rpiCamera
# sourceOnDemand Starts the camera only when a client connects.
sourceOnDemand: yes
rpiCameraWidth: 1280
rpiCameraHeight: 720
rpiCameraFPS: 30
rpiCameraBitrate: 2000000
# optional hardwareH264 Uses hardware accelerated H.264 encoding.
# rpiCameraCodec: hardwareH264
# rpiCameraIDRPeriod Controls how often keyframes are sent.
rpiCameraIDRPeriod: 30
# optional compatibility tweak:
# rpiCameraHardwareH264Profile: baseline
# Settings under path "all_others" are applied to all paths that
# do not match another entry.
all_others:raspberryom alle Raspberry Pi Camera instellingen te vinden. Ook online kan je documentatie voor de Raspberry Pi Cameras raadplegen. Alle andere configuratiemogelijkheden kan je vinden in de algemene online handleiding.Sla de aanpassingen op en verlaat de teksteditor nano met de sneltoets Ctrl+x, bevestig het opslaan met j gevolgd door Return.
- Tijd om de Raspberry Pi IP Camera te testen.
Daar de MediaMTX software alleen goed werkt als je de software start vanuit de installatiemap, gaan we deze eerst openen:
pi@raspberrypi:~ $
En starten we MediaMTX:cd mediamtx/pi@raspberrypi:~/mediamtx $
De MediaMTX software blijft werken (als server) waardoor we geen prompt meer krijgen om nieuwe opdrachten uit te voeren. Start een mediaspeler zoals VLC. Open in VLC het menu Media en start de opdracht Netwerkstream openen.... Gebruik als netwerk-url:./mediamtx
2026/08/03 14:41:00 INF MediaMTX v1.19.3, linux, arm64
2026/08/03 14:41:00 INF configuration loaded from /home/pi/mediamtx/mediamtx.yml
2026/08/03 14:41:00 INF [RTSP] started with listeners on :8554 (TCP/RTSP)
2026/08/03 14:41:00 INF [RTMP] started with listener on :1935 (TCP/RTMP)
2026/08/03 14:41:00 INF [HLS] started with listener on :8888 (TCP/HTTP)
2026/08/03 14:41:00 INF [WebRTC] started with listeners on :8889 (TCP/HTTP), :8189 (UDP/ICE)
2026/08/03 14:41:00 INF [SRT] started with listener on :8890 (UDP/SRT)
2026/08/03 14:41:00 INF [MoQ] started with listeners on :8892 (TCP/HTTP2), :8892 (UDP/HTTP3)rtsp://raspberrypi:8554/camen klik op de knop .
Of start in een tweede Terminal de opdracht:
pi@raspberrypi:~ $
ffplay -rtsp_transport tcp rtsp://raspberrypi:8554/cam
ffplay version 7.1.5-0+deb13u1+rpt1 Copyright (c) 2003-2026 the FFmpeg developers
built with gcc 14 (Debian 14.2.0-19)
configuration: --prefix=/usr --extra-version=0+deb13u1+rpt1 --toolchain=hardened --incdir=/usr/include/aarch64-lin
ux-gnu --enable-gpl --disable-stripping --disable-libmfx --disable-mmal --disable-omx --enable-gnutls --enable-libao
m --enable-libass --enable-libbs2b --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-
libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-
libharfbuzz --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enabl
e-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libtheora --enable-
libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2
--enable-libxvid --enable-libzimg --enable-openal --enable-opencl --enable-opengl --disable-sndio --disable-libvpl
--libdir=/usr/lib/aarch64-linux-gnu --arch=arm64 --enable-neon --enable-v4l2-request --enable-libudev --enable-epoxy
--enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-vout-drm --enable-chromaprint --enable-frei0r --en
able-ladspa --enable-libbluray --enable-libcaca --enable-libdvdnav --enable-libdvdread --enable-libjack --enable-lib
pulse --enable-librabbitmq --enable-librist --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libx264 --en
able-libzmq --enable-libzvbi --enable-lv2 --enable-sand --enable-sdl2 --enable-libplacebo --enable-librav1e --enable
-pocketsphinx --enable-librsvg --enable-libjxl --enable-shared
libavutil 59. 39.100 / 59. 39.100
libavcodec 61. 19.101 / 61. 19.101
libavformat 61. 7.103 / 61. 7.103
libavdevice 61. 3.100 / 61. 3.100
libavfilter 10. 5.100 / 10. 5.100
libswscale 8. 3.100 / 8. 3.100
libswresample 5. 3.100 / 5. 3.100
libpostproc 58. 3.100 / 58. 3.100
Input #0, rtsp, from 'rtsp://raspberrypi:8554/cam':q= 0B
Metadata:
title :
Duration: N/A, start: 0.151633, bitrate: N/A
Stream #0:0: Video: h264 (Constrained Baseline), yuv420p(progressive), 1280x720, 30 fps, 30 tbr, 90k tbn
[swscaler @ 0x7ffedc1d7000] No accelerated colorspace conversion found from yuv420p to bgr24.
[swscaler @ 0x7ffedc1f47b0] No accelerated colorspace conversion found from yuv420p to bgr24.
[swscaler @ 0x7ffedc211f60] No accelerated colorspace conversion found from yuv420p to bgr24.
[swscaler @ 0x7ffedc22f710] No accelerated colorspace conversion found from yuv420p to bgr24.
[swscaler @ 0x7ffedc24cec0] No accelerated colorspace conversion found from yuv420p to bgr24.
20.39 M-V: 0.020 fd= 0 aq= 0KB vq= 155KB sq= 0BSluit de afspeelvenster(s) en stop de MediaMTX server in de terminal met de sneltoets Ctrl+c.
2026/08/03 15:02:49 INF [RTSP] [conn 127.0.0.1:56060] opened
2026/08/03 15:02:49 INF [path cam] [RPI Camera source] started on demand
[0:13:11.195154385] [3273] INFO Camera camera_manager.cpp:326 libcamera v0.5.0+59-d83ff0a4-dirty (2026-06-28T08:22:18UTC)
[0:13:11.197156410] [3274] INFO RPI pisp.cpp:720 libpisp version v1.2.0 50426319aa1a-dirty 28-06-2026 (08:43:45)
[0:13:11.213201333] [3274] INFO RPI pisp.cpp:1179 Registered camera /base/axi/pcie@1000120000/rp1/i2c@88000/ov5647@36 to CFE device /dev/media2 and ISP device /dev/media0 using PiSP variant BCM2712_C0
[0:13:11.213600442] [3273] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format Nc30
[0:13:11.213634664] [3273] WARN V4L2 v4l2_pixelformat.cpp:346 Unsupported V4L2 pixel format Nc12
[0:13:11.213888218] [3273] INFO Camera camera.cpp:1205 configuring streams: (0) 1280x720-YUV420
[0:13:11.214064365] [3274] INFO RPI pisp.cpp:1483 Sensor: /base/axi/pcie@1000120000/rp1/i2c@88000/ov5647@36 - Selected sensor format: 1920x1080-SGBRG10_1X10 - Selected CFE format: 1920x1080-PC1g
using software H264 encoder
[OpenH264] this = 0x0x55563e2934b0, Warning:bEnableFrameSkip = 0,bitrate can't be controlled for RC_QUALITY_MODE,RC_BITRATE_MODE and RC_TIMESTAMP_MODE without enabling skip frame.
2026/08/03 15:02:49 INF [path cam] stream is available and online, 1 track (H264)
2026/08/03 15:02:49 INF [RTSP] [session 2a55e27e] created by 127.0.0.1:56060
2026/08/03 15:02:49 INF [RTSP] [session 2a55e27e] is reading from path 'cam', with TCP, 1 track (H264)
[OpenH264] this = 0x0x55563e2934b0, Warning:Actual input framerate 0.076859 is different from framerate in setting 30.000000, suggest to use other rate control modes
2026/08/03 15:03:33 INF [RTSP] [conn 127.0.0.1:56060] closed: EOF
2026/08/03 15:03:33 INF [RTSP] [session 2a55e27e] destroyed: torn down by 127.0.0.1:56060
^C2026/08/03 15:03:42 INF shutting down gracefully
2026/08/03 15:03:42 INF [SRT] closing
2026/08/03 15:03:42 INF [MoQ] closing
2026/08/03 15:03:42 INF [WebRTC] closing
2026/08/03 15:03:42 INF [HLS] closing
2026/08/03 15:03:42 INF [RTMP] closing
2026/08/03 15:03:42 INF [RTSP] closing
2026/08/03 15:03:42 INF [path cam] [RPI Camera source] stopped: path is closing
2026/08/03 15:03:42 INF waiting for running hooks - De uitvoer van de MediaMTX server geeft aan of er problemen zijn.
Waarschuwingen (
Warn) zijn informatief en zorgen meestal niet voor problemen. Fouten met een rode kleur los je best op. Bij zwakke WiFi-signalen kan je de bitrate of resolutie verlagen, een voorbeeld:rpiCameraWidth: 640
MediaMTX stuurt afhankelijk van de aanvraag de videostream op verschillende manieren door, naast de hierboven gebruikte rtsp stream, kan je in elke browser de WebRTC stream bekijken. Op de volgende afbeelding zie je het resultaat van de bovenstaande MediaMTX configuratie in de browser (let op de URL):
rpiCameraHeight: 480
rpiCameraFPS: 15
rpiCameraBitrate: 1000000
rpiCameraIDRPeriod: 15
MediaMTX verstuurd enkel een videostream als deze via een mediaspeler (en/of browser) wordt afgespeeld, wat als voordeel heeft dat de Raspberry Pi veel minder belast wordt als de videostream niet wordt afgespeeld.
- Als je basisauthenticatie wilt toevoegen, pas je het volgende aan in het mediamtx.yml bestand:
authMethod: internal
Test de aanpassing met VLC of de terminalopdracht:
# Internal authentication.
# Enabled users.
authInternalUsers:
# Default unprivileged user.
# Username. 'any' means any user, including anonymous ones.
# - user: any
# # Password. Not used in case of 'any' user.
# pass:
# # IPs or networks allowed to use this user. An empty list means any IP.
# ips: []
# # Permissions.
# permissions:
# # Available actions are: publish, read, playback, api, metrics, pprof.
# - action: publish
# # Paths can be set to further restrict access to a specific path.
# # An empty path means any path.
# # Regular expressions can be used by using a tilde as prefix.
# path:
# - action: read
# path:
# - action: playback
# path:
- user: pi
pass: geheimWachtwoord
permissions:
- action: readpi@raspberrypi:~ $
ffplay -rtsp_transport tcp rtsp://pi:geheimWachtwoord@raspberrypi:8554/cam - Nu MediaMTX werkt is het handig om deze bij het opstarten van de Raspberry Pi automatisch te starten met systemd.
Daarbij verplaatsen we het programma en de configuratie naar een systeemmap.
Deze maken we aan met:
pi@raspberrypi:~ $
En kopiëren het programma en de configuratie naar de MediaMTX systeemmap:sudo mkdir -p /opt/mediamtx
[sudo] wachtwoord voor pi:pi@raspberrypi:~ $
En zorgen dat het programma uitvoerbaar is:sudo cp ~/mediamtx/mediamtx ~/mediamtx/mediamtx.yml /opt/mediamtx/pi@raspberrypi:~ $
Om het systeem veiliger te maken, schermen we de MediaMTX server af van de rest van het systeem door een MediaMTX gebruiker aan te maken:sudo chmod +x /opt/mediamtx/mediamtxpi@raspberrypi:~ $
En zorgen we dat de MediaMTX systeemmap toegankelijk wordt voor de MediaMTX gebruiker:sudo useradd --system --no-create-home --shell /usr/sbin/nologin mediamtxpi@raspberrypi:~ $
Na deze voorbereidingen kunnen we het systemd opstartscript met de nano teksteditor aanmaken:sudo chown -R mediamtx:mediamtx /opt/mediamtx/pi@raspberrypi:~ $
Met de volgende inhoud:sudo nano /etc/systemd/system/mediamtx.service[Unit]
Na het opslaan van het script en het afsluiten van nano, brengen we het systeem op de hoogte van het nieuwe opstartscript:
Description=MediaMTX
Wants=network-online.target
After=network-online.target
[Service]
User=mediamtx
WorkingDirectory=/opt/mediamtx
ExecStart=/opt/mediamtx/mediamtx /opt/mediamtx/mediamtx.yml
Restart=on-failure
RestartSec=2
SupplementaryGroups=video
[Install]
WantedBy=multi-user.targetpi@raspberrypi:~ $
Kunnen we het opstartscript activeren en starten met:sudo systemctl daemon-reloadpi@raspberrypi:~ $
Controleer de status van de MediaMTX server (dienst):sudo systemctl enable --now mediamtx
Created symlink '/etc/systemd/system/multi-user.target.wants/mediamtx.service' → '/etc/systemd/system/mediamtx.service'.pi@raspberrypi:~ $
Om nu de meldingen van de MediaMTX server te volgen, gebruik je de volgende opdracht:sudo systemctl status mediamtx --no-pager
● mediamtx.service - MediaMTX
Loaded: loaded (/etc/systemd/system/mediamtx.service; enabled; preset: enabled)
Active: active (running) since Mon 2026-08-03 16:11:55 CEST; 16s ago
Invocation: 9b21cbacf8704746bfb90505c8b29daa
Main PID: 4350 (mediamtx)
Tasks: 8 (limit: 4805)
CPU: 44ms
CGroup: /system.slice/mediamtx.service
└─4350 /opt/mediamtx/mediamtx /opt/mediamtx/mediamtx.yml
aug 03 16:11:55 raspberrypi systemd[1]: Started mediamtx.service - MediaMTX.
aug 03 16:11:55 raspberrypi mediamtx[4350]: 2026/08/03 16:11:55 INF MediaMTX v1.19.3, linux, arm64
aug 03 16:11:55 raspberrypi mediamtx[4350]: 2026/08/03 16:11:55 INF configuration loaded from /opt/mediamtx/mediamtx.yml
aug 03 16:11:55 raspberrypi mediamtx[4350]: 2026/08/03 16:11:55 INF [RTSP] started with listeners on :8554 (TCP/RTSP)
aug 03 16:11:55 raspberrypi mediamtx[4350]: 2026/08/03 16:11:55 INF [RTMP] started with listener on :1935 (TCP/RTMP)
aug 03 16:11:55 raspberrypi mediamtx[4350]: 2026/08/03 16:11:55 INF [HLS] started with listener on :8888 (TCP/HTTP)
aug 03 16:11:55 raspberrypi mediamtx[4350]: 2026/08/03 16:11:55 INF [WebRTC] started with listeners on :8889 (TCP/HTTP), :8189 (UDP/ICE)
aug 03 16:11:55 raspberrypi mediamtx[4350]: 2026/08/03 16:11:55 INF [SRT] started with listener on :8890 (UDP/SRT)
aug 03 16:11:55 raspberrypi mediamtx[4350]: 2026/08/03 16:11:55 WAR [MoQ] certificate auto.key not found, generating it from scratch
aug 03 16:11:55 raspberrypi mediamtx[4350]: 2026/08/03 16:11:55 INF [MoQ] started with listeners on :8892 (TCP/HTTP2), :8892 (UDP/HTTP3)pi@raspberrypi:~ $
Deze opdracht breek je af met de Ctrl+c sneltoets. Daarbij blijft de MediaMTX server wel werken. Om de configuratie nu aan te passen, moet je nu wel het mediamtx.yml bestand in de nieuwe locatie aanpassen:sudo journalctl -u mediamtx -f
aug 03 16:11:55 raspberrypi systemd[1]: Started mediamtx.service - MediaMTX.
aug 03 16:11:55 raspberrypi mediamtx[4350]: 2026/08/03 16:11:55 INF MediaMTX v1.19.3, linux, arm64
aug 03 16:11:55 raspberrypi mediamtx[4350]: 2026/08/03 16:11:55 INF configuration loaded from /opt/mediamtx/mediamtx.yml
aug 03 16:11:55 raspberrypi mediamtx[4350]: 2026/08/03 16:11:55 INF [RTSP] started with listeners on :8554 (TCP/RTSP)
aug 03 16:11:55 raspberrypi mediamtx[4350]: 2026/08/03 16:11:55 INF [RTMP] started with listener on :1935 (TCP/RTMP)
aug 03 16:11:55 raspberrypi mediamtx[4350]: 2026/08/03 16:11:55 INF [HLS] started with listener on :8888 (TCP/HTTP)
aug 03 16:11:55 raspberrypi mediamtx[4350]: 2026/08/03 16:11:55 INF [WebRTC] started with listeners on :8889 (TCP/HTTP), :8189 (UDP/ICE)
aug 03 16:11:55 raspberrypi mediamtx[4350]: 2026/08/03 16:11:55 INF [SRT] started with listener on :8890 (UDP/SRT)
aug 03 16:11:55 raspberrypi mediamtx[4350]: 2026/08/03 16:11:55 WAR [MoQ] certificate auto.key not found, generating it from scratch
aug 03 16:11:55 raspberrypi mediamtx[4350]: 2026/08/03 16:11:55 INF [MoQ] started with listeners on :8892 (TCP/HTTP2), :8892 (UDP/HTTP3)
^Cpi@raspberrypi:~ $
Na een aanpassing, activeer je deze door de MadiaMTX server te herstarten:sudo nano /opt/mediamtx/mediamtx.ymlpi@raspberrypi:~ $
sudo systemctl restart mediamtx - Om het gedeelte Programmeren verder te volgen, moeten we de Raspberry Pi camera terug beschikbaar maken voor andere toepassingen.
Dit kan door het automatisch starten van de MediaMTX server te deactiveren en te stoppen:
pi@raspberrypi:~ $
sudo systemctl disable --now mediamtx
[sudo] wachtwoord voor pi:
Removed '/etc/systemd/system/multi-user.target.wants/mediamtx.service'.
Programmeren
Als je wat meer met de Pi Camera wilt doen, kan je gebruik maken van Bash scripts.
Voorvertoning
Zorg dat je grafisch op de Raspberry Pi kunt werken (VNC, RDP of fysiek aangesloten op toetsenbord, muis en scherm).
Daar we vroeger reeds met de teksteditor nano gewerkt hebben, gaan we deze ook gebruiken om te programmeren. M.a.w. via de terminal maken we het script (programmabestand) aan met de terminalopdracht:
pi@raspberrypi:~ $ nano camera.sh
Start via het Menu in de groep Programmeren de applicatie Geany.
Geany start steeds met de programmabestanden waaraan je werkte.
Bij de eerste start, krijg je automatisch een nieuw bestand.
Elk nieuw programma dat je schrijft, sla je eerst op via het menu Bestand en de opdracht Opslaan als....
Geef jouw programma de naam camera.sh.
Om een voorvertoning 10 seconden op het scherm te bekijken, typ de volgende programmacode:
#!/bin/bash
timeout=10
preview="0,50,640,360"
rpicam-hello -t $((timeout*1000)) -p $preview
De eerste regel is steeds een Shebang en deze bevat het programma die het script moet uitvoeren, in ons geval /bin/bash.
De variabele timeout zorgt dat de voorvertoning 10 seconden actief blijft.
De variable preview bepaalt waar het venster met de voorvertoning op het scherm zal verschijnen, tegen de linkerkant (0), 50 beeldpunten van boven, 640 beeldpunten breed en 360 beeldpunten hoog.
Variabelen zorgen ervoor dat de programmacode duidelijker is en eenvoudig kan aangepast worden.
Zo heeft de opdracht rpicam-hello de activiteitsduur in milliseconden nodig, we berekenen deze met $((timeout*1000)) waarbij alles wat tussen dubbele haken staat wordt berekend (* staat voor vermenigvuldigen).
Het $-teken zorgt dat de variabelen timeout en preview gebruikt worden en deze woorden niet als opdracht worden uitgevoerd.
Sla de programmacode op met de sneltoets Ctrl+x, daarna j, gevolgd door Return.
Om een script in Raspberry Pi OS (Linux) te kunnen starten, moet je het één keer uitvoerrechten geven. Je geeft het script uitvoerrechten door in de terminal de volgende opdracht uit te voeren:
pi@raspberrypi:~ $ chmod +x camera.sh
En start het programma met:
pi@raspberrypi:~ $ bash camera.sh
Of
pi@raspberrypi:~ $ ./camera.sh
De laatste opdracht werkt dankzij de Shebang waardoor het systeem het juiste programma gebruikt (/bin/bash) om het script uit te voeren. Let ook op ./ voor de bestandsnaam van het script. Dit is de voorstelling van de huidige map. De map waarin het script zich bevindt is in deze opdracht verplicht.
De positie van het venster is zo gekozen, dat de menubalk bereikbaar blijft.
Praktijk opdracht
Opgelet, de programmacode in de opgaven is niet volledig. Enkel de relevante code wordt getoond. M.a.w. indien jouw script niet werkt, controleer het dan grondig en pas het aan tot het werkt.
- Als het beeld ondersteboven staat, kan je het beeld draaien door een variabele toe te voegen en de opdracht aan te passen:
rotation=180
Test dit. Je kunt het beeld 180 graden roteren, of terug standaard zetten met 0.
rpicam-hello -p $preview --rotation $rotation - Afhankelijk van de snelheid waarmee de lichtsensoren van Pi Camera klaar zijn om een foto te nemen, kan je de wachttijd soms sterk inkorten:
output="Desktop/Foto.jpg"
De
rpicam-still --nopreview -o $outputoutputvariabele, samen met de-ooptie bij de rpicam-still opdracht zorgen dat de foto wordt opgeslagen op het bureaublad (Desktop map). De--nopreviewtoont geen voorvertoning waardoor de foto wordt aangemaakt vanaf het moment dat de sensor klaar is. De foto kan je openen door er dubbel op te klikken. - Om een foto met een bepaalde resolutie te nemen, gebruiken we de opties
--widthen--heighten bijpassende variabelen. Voor een foto met een resolutie van 1280x720 pas je het script aan:width=1280
height=720
rpicam-still -p $preview -o $output --width $width --height $height - Zonder de opties
--widthen--heightmaakt rpicam-still foto's met de maximale resolutie van de Pi Camera. Pas het script aan:output="Desktop/Max.jpg"
Open de pas aangemaakte foto en noteer de resolutie van jouw camera: .........x......... (zie zijbalk).
rpicam-still -p $preview -o $output - Pas het script nu zelf aan om een miniatuur afbeelding te maken met een resolutie van 64x64 en sla deze op het bureaublad op met de naam Min.jpg
- Wil je de foto in een niet verlieslatend formaat opslaan om deze later zonder kwaliteitsverlies te bewerken, sla je de foto op in het PNG formaat.
Pas daarvoor het script als volgt aan:
output="Desktop/Foto.png"
encoding="png"
rpicam-still -p $preview -o $output -e $encoding - Met een lus kan je vijf foto's na elkaar nemen:
for i in {1..5}
De variabele
do
output=$(printf "Desktop/Foto%0*d.jpg" 2 $i)
rpicam-still -p $preview -o $output
doneibevat het huidige lusnummer, van 1 tot en met 5, de foto's worden dus opgeslagen als Foto01.jpg, Foto02.jpg en zo verder. Deoutputvariabele wordt telkens aangemaakt op basis van het huidige lusnummer$ien moet steeds uit2cijfers bestaan. Daar zorgt%0*dvoor. Probeer dit uit. - Nu je foto's kunt nemen, is het tijd om te kijken hoe je video's maakt.
Terug willen we de resolutie beperken tot 1280x720, een compromis tussen kwaliteit en opslagruimte (eveneens de Youtube standaard resolutie):
width=1280
Test het programmma waarbij 10 seconden video wordt opgenomen. Test of je de opgenomen video kunt afspelen.
height=720
timeout=10
output="Desktop/Video.h264"
rpicam-vid -t $((timeout*1000)) -o $output --width $width --height $height - Om tekst aan een foto toe te voegen, gaan we de hulp inroepen van de beeldbewerker ImageMagick.
Installeer ImageMagick met de opdracht:
pi@raspberrypi:~ $
sudo apt install imagemagick
[sudo] wachtwoord voor pi:
Installeren:
imagemagick
Installeren van vereisten:
imagemagick-7.q16 libnetpbm11t64 netpbm
Voorgestelde pakketten:
imagemagick-7-doc | lpr gimp graphviz libwmf-bin radiance libraw-bin
autotrace | lprng gnuplot hp2xx mplayer texlive-base-bin
cups-bsd enscript grads html2ps povray transfig
Samenvatting:
Opwaarderen: 0, Installeren: 4, Verwijderen: 0, Niet opwaarderen: 0
Downloadgrootte: 2.999 kB
Benodigde ruimte: 26,8 MB / 6.376 MB beschikbaar
Doorgaan? [J/n]
Ophalen:1 http://deb.debian.org/debian-security trixie-security/main arm64 imagemagick-7.q16 arm64 8:7.1.1.43+dfsg1-1+deb13u11 [736 kB]
Ophalen:2 http://deb.debian.org/debian-security trixie-security/main arm64 imagemagick arm64 8:7.1.1.43+dfsg1-1+deb13u11 [29,4 kB]
Ophalen:3 http://deb.debian.org/debian trixie/main arm64 libnetpbm11t64 arm64 2:11.10.02-1 [178 kB]
Ophalen:4 http://deb.debian.org/debian trixie/main arm64 netpbm arm64 2:11.10.02-1 [2.057 kB]
2.999 kB opgehaald in 0s (16,1 MB/s)
Voorheen niet geselecteerd pakket imagemagick-7.q16 wordt geselecteerd.
(Database wordt ingelezen ... 142087 bestanden en mappen momenteel geïnstalleerd.)
Uitpakken van .../imagemagick-7.q16_8%3a7.1.1.43+dfsg1-1+deb13u11_arm64.deb wordt voorbereid...
Bezig met uitpakken van imagemagick-7.q16 (8:7.1.1.43+dfsg1-1+deb13u11) ...
...
Voorheen niet geselecteerd pakket netpbm wordt geselecteerd.
Uitpakken van .../netpbm_2%3a11.10.02-1_arm64.deb wordt voorbereid...
Bezig met uitpakken van netpbm (2:11.10.02-1) ...
Instellen van imagemagick-7.q16 (8:7.1.1.43+dfsg1-1+deb13u11) ...
update-alternatives: /usr/bin/compare-im7.q16 wordt gebruikt om in de automatische modus in /usr/bin/compare (compare) te voorzien
...
Instellen van libnetpbm11t64:arm64 (2:11.10.02-1) ...
Instellen van netpbm (2:11.10.02-1) ...
Instellen van imagemagick (8:7.1.1.43+dfsg1-1+deb13u11) ...
Bezig met afhandelen van triggers voor desktop-file-utils (0.28-1) ...
Bezig met afhandelen van triggers voor hicolor-icon-theme (0.18-2) ...
Bezig met afhandelen van triggers voor libc-bin (2.41-12+rpt1+deb13u3) ...
Bezig met afhandelen van triggers voor man-db (2.13.1-1) ...
Bezig met afhandelen van triggers voor mailcap (3.74) ... - We kunnen een foto nu voorzien van een tekst door deze na te bewerken met convert, een opdracht van het pakket ImageMagick.
Probeer het volgende:
output="Desktop/Tekst.jpg"
De tekst wordt in het midden bovenaan de foto geplaatst (
rpicam-still -p $preview -o $output
convert $output -gravity North -pointsize 90 -undercolor "rgba(0,0,0,0.5)" -fill yellow -annotate +0+0 ' Pi Camera ' $output-gravity North). De lettergrootte bedraagt 90 (-pointsize 90). Met een halfdoorzichtie zwarte achtergrond (-undercolor "rgba(0,0,0,0.5)"). En een opvallende gele tekstkleur (-fill yellow). De tekst op de foto wordt "Pi Camera" (-annotate +0+0 ' Pi Camera '. Je kunt zelf de mogelijkheden ontdekken in de handleiding op het internet. - Je kunt de helderheid instellen van -1.0 (minimale helderheid) tot 1.0 (maximale helderheid).
Standaard wordt 0 gebruikt.
Neem een foto met de volgende helderheid:
output="Desktop/Overbelicht.jpg"
brightness=0.5
rpicam-still -p $preview -o $output --brightness $brightness - Om een overzicht te krijgen van de helderheidsinstelling nemen we die op in een lus.
We maken dus een foto's met verschillende helderheidsinstellingen (telkens met 0.2 hogere helderheid) en plaatsen deze in de map PiCamera op het Bureaublad.
Daarna maken we van de foto's een film met ffmpeg waarbij de foto's in elkaar overvloeien om deze uiteindelijk af te spelen:
directory="Desktop/PiCamera"
mkdir -p $directory
filenr=0
for i in $(LC_ALL="en_US.UTF-8" seq -1 0.2 1)
do
output=$(printf "$directory/Foto%0*d.jpg" 3 $filenr)
filenr=$((filenr + 1))
rpicam-still --brightness $i -t 1000 -o $output --nopreview
done
duration=0 #duration in seconds
crossfadeDuration=1 #crossfade duration in seconds
width=640
height=360
videooutput="$directory/PiCamera.mp4"
ffmpeg -y -i $directory/Foto%3d.jpg -vf zoompan=d=$(((duration+crossfadeDuration)/crossfadeDuration)):s=${width}x$height:fps=$((1/crossfadeDuration)),framerate=25:interp_start=0:interp_end=255:scene=100 -c:v mpeg4 -maxrate 5M -q:v 2 $videooutput
ffplay -autoexit $videooutput - Probeer iets gelijkaardigs voor het contrast (regelbaar vanaf 0 = weinig contrast over 1 = standaard contrast en meer):
- Pas daarvoor de lus aan zodat deze telt van 0 tot 2 in stapjes van 0.2.
- Vervang in de rpicam-still opdracht de brightness optie door de contrast optie.
- Je kunt ook nabewerken met rpicam zelf.
Daarvoor gebruik je een configuratiebestand met de bewerkingen (en de volgorde waarin) die uitgevoerd moeten worden.
M.a.w. je kunt combineren.
De configuratie voor de nabewerking (postProcess) definiëren we eerst in een variabele die bestaat uit meerdere regels (Heredoc).
Zo'n variabele begint en eindigt steeds met hetzelfde stopwoord (in ons geval EOF).
Deze variabele schrijven we dan weg naar een tijdelijk bestand (postProcess.json) waardoor het beschikbaar wordt voor de opdracht rpicam-hello.
Onderstaand voorbeeld zorgt voor een negatief beeld:
negate=$(cat << EOF
{
"negate":
{
}
}
EOF
)
echo $negate > postProcess.json
rpicam-hello --post-process-file postProcess.json - Een complexere nabewerking, is DRC (Dynamic Range Compression)..
Om het verschil beter te kunnen beoordelen, maken we een twee foto's: één met HDR nabewerking en één zonder.
Daarna laten we beide foto's op het scherm weergeven om ze te vergelijken:
drc=$(cat << EOF
De
{
"hdr" :
{
"num_frames" : 1,
"lp_filter_strength" : 0.2,
"lp_filter_threshold" : [ 0, 10.0 , 2048, 205.0, 4095, 205.0 ],
"global_tonemap_points" :
[
{ "q": 0.1, "width": 0.05, "target": 0.15, "max_up": 1.5, "max_down": 0.7 },
{ "q": 0.5, "width": 0.05, "target": 0.5, "max_up": 1.5, "max_down": 0.7 },
{ "q": 0.8, "width": 0.05, "target": 0.8, "max_up": 1.5, "max_down": 0.7 }
],
"global_tonemap_strength" : 1.0,
"local_pos_strength" : [ 0, 6.0, 1024, 2.0, 4095, 2.0 ],
"local_neg_strength" : [ 0, 4.0, 1024, 1.5, 4095, 1.5 ],
"local_tonemap_strength" : 1.0,
"local_colour_scale" : 0.9
}
}
EOF
)
echo $drc > postProcess.json
pPoutput="Desktop/DRC.jpg"
output="Desktop/Foto.jpg"
vergelijk="Desktop/Vergelijk.jpg"
rpicam-still -o $pPoutput --post-process-file postProcess.json --nopreview
rpicam-still -o $output --nopreview
convert $pPoutput $output +append $vergelijk
eom $vergelijkconvertopdracht plaatst de twee foto's naast elkaar in één afbeelding. Deze wordt dan met behulp vaneom(Eye Of Mate) weergegeven. - HDR en DRC worden dikwijls verward en de termen worden regelmatig door elkaar gebruikt.
Maar wat is nu het verschil, we bepalen dit door de vorige nabewerking te vervangen door:
hdr=$(cat << EOF
Pas het script aan waar nodig en zorg ervoor dat ook de reeds aangemaakte DRC foto wordt weergeven.
{
"hdr" :
{
"num_frames" : 8,
"lp_filter_strength" : 0.2,
"lp_filter_threshold" : [ 0, 10.0 , 2048, 205.0, 4095, 205.0 ],
"global_tonemap_points" :
[
{ "q": 0.1, "width": 0.05, "target": 0.15, "max_up": 5.0, "max_down": 0.5 },
{ "q": 0.5, "width": 0.05, "target": 0.45, "max_up": 5.0, "max_down": 0.5 },
{ "q": 0.8, "width": 0.05, "target": 0.7, "max_up": 5.0, "max_down": 0.5 }
],
"global_tonemap_strength" : 1.0,
"local_pos_strength" : [ 0, 6.0, 1024, 2.0, 4095, 2.0 ],
"local_neg_strength" : [ 0, 4.0, 1024, 1.5, 4095, 1.5 ],
"local_tonemap_strength" : 1.0,
"local_colour_scale" : 0.8
}
}
EOF
)
echo $hdr > postProcess.json
pPoutput="Desktop/HDR.jpg" - Nog een leuke toepassing is bewegingsdetectie:
timeout=15
De instelling
motion=$(cat << EOF
{
"motion_detect" :
{
"roi_x" : 0.1,
"roi_y" : 0.1,
"roi_width" : 0.8,
"roi_height" : 0.8,
"difference_m" : 0.1,
"difference_c" : 10,
"region_threshold" : 0.005,
"frame_period" : 5,
"hskip" : 2,
"vskip" : 2,
"verbose" : 1
}
}
EOF
)
echo $motion > postProcess.json
rpicam-hello -t $((timeout*1000)) --lores-width 128 --lores-height 96 --post-process-file postProcess.json"verbose" : 1zorgt ervoor dat er in de terminal meldingen verschijnen. Daar bewegingsdetectie zeer intensief gebruik maakt van de rekenkracht van de processor gebruiken we lage resolutiebeelden (128x96). Lage resolutiebeelden volstaan om beweging te detecteren (vergelijk met dieren met een op beweging gespecialiseerd zicht). - Sommige foto-toepassingen vergen een aangepaste sluitertijd (exposure).
Zo kan je enkel snelle bewegingen, zoals in de sport, enkel goed fotograferen met een korte sluitertijd.
Nachtbeelden van statische scenes hebben een lange sluitertijd nodig.
De witbalans (hoeveelheid opgevangen licht) wordt daarbij automatisch gecorrigeerd.
Er zijn 3 vooringestelde sluitertijden:
normal,sportenlong. Om deze sluitertijden te beoordelen, gebruiken we terug een lus, maar deze keer met termen:vergelijk="Desktop/Vergelijk.jpg"
De
prefix="Desktop/expo_"
exposures=("normal" "sport" "long")
for exposure in ${exposures[@]};
do
output="$prefix$exposure.jpg"
rpicam-still -o $output --exposure $exposure --nopreview
convert $output -gravity North -pointsize 90 -undercolor "rgba(0,0,0,0.5)" -fill yellow -annotate +0+0 $exposure $output
done
convert $prefix*.jpg +append $vergelijk
eom $vergelijkconvertopdracht verzameld alle jpg afbeeldingen waarvan de naam begint metDesktop/expo_($prefix*.jpg) om deze samen naast elkaar inVergelijk.jpgop te slaan. - Programmeer zelf een lus om de verschillende voorgeprogrammeerde witbalansen te beoordelen.
De beschikbare
--awbrpicam opties zijn:auto,incandescent,tungsten,fluorescent,indoor,daylight,cloudy. - Alle mogelijkheden van de rpicam vind je terug in de documentatie op internet.
- Schakel de Raspberry Pi uit.
- Gebruik het experimenteerbord en draadverbindingen om een drukknop op de Pi aan te sluiten.
De 0,1µF condensator dient enkel om de schakelaar te ontstoren (dender) en is optioneel:
- Start de Raspberry Pi terug.
- Gpio (General Purpose In/Out) is de dubbele rij aansluitingen op de Raspberry Pi waarop je verschillende in- en uitvoerapparaten kunt aansluiten.
In ons geval een drukknop (invoerapparaat).
Een GPIO pin kan twee toestanden hebben: 0 (low) indien deze dezelfde spanning heeft als massa (ground) of 1 (high) als er een spanning van +3,3 volt t.o.v de massa op staat.
Aangezien we de drukknop gebruiken om de pin kort te sluiten naar massa, geven we GPIO pin standaard een spanning van 3,3 volt (Pull Up).
We configureren GPIO 8 als ingang met een spanning van 3,3 volt met de opdracht
pinctrl set 8 ip pu. De toestand van de GPIO 8 lees je in met de opdrachtpinctrl get 8. Het script bevat commentaarregels (beginnen met #) met uitleg:#!/bin/bash
preview="0,50,640,360"
width=1280
height=720
output="Desktop/Afdrukken.jpg"
# Drukknop is aangesloten op GPIO 8 en massa
buttonPin=8
# Gebruikte GPIO pin wordt als ingang gebruikt en krijgt standaard 3,3 volt toegewezen (Pull Up)
pinctrl set $buttonPin ip pu
# Start de voorvertoning met instructies in de titelbalk.
helloInfo="Druk op de knop om een foto te maken"
(rpicam-hello -t 0 -p $preview --width $width --height $height --info-text "$helloInfo") &
# Start van de oneindige lus
while true; do
# Lees de toestand van de gebruikte GPIO pin in
button=$(pinctrl get $buttonPin)
if [[ $button == *"lo"* ]]; then # Drukknop ingedrukt dan
# Stop de voorvertoning
killall rpicam-hello
# Neem de foto met instructies in de titelbalk.
fotoInfo="De foto wordt voorbereid... en aangemaakt..."
rpicam-still -o $output -p $preview --width $width --height $height --info-text "$fotoInfo"
# Verlaat de oneindige lus
break
fi
done - Wil je zelf op de foto staan, dan moet er na het afdrukken 3 seconden wachttijd ingesteld worden.
Dit kan door voor het nemen van de foto de opdracht
sleep 3te plaatsen. Zorg er wel voor dat de voorvertoning tijdens de 3 seconden blijft staan, anders sta je misschien niet op de foto! - Door afzonderlijke foto's van licht aangepaste situaties in een video op te nemen, maak je een stop motion animatie.
Pas de programmacode aan zodat bij elke druk op de drukknop een nieuwe foto wordt gemaakt:
#!/bin/bash
De
preview="0,50,640,360"
width=1280
height=720
# Bash instellen om te reageren op een toetsaanslag
# Let op: dit werkt alleen als het terminalvenster waarin het script gestart is actief is, m.a.w op de voorgrond staat.
if [ -t 0 ]; then
SAVED_STTY="`stty --save`"
stty -echo -icanon -icrnl time 0 min 0
fi
keypress=''
# Alle foto's komen terecht in deze reeds aangemaakte map
directory="Desktop/PiCamera"
# Maak de doelmap leeg
rm $directory/*
# Drukknop is aangesloten op GPIO 8 en massa
buttonPin=8
# Gebruikte GPIO wordt als ingang gebruikt en krijgt standaard 3,3 volt toegewezen (Pull Up)
pinctrl set $buttonPin ip pu
# Zet de foto teller op 0
count=0
fotoInfo="De foto wordt voorbereid... en aangemaakt..."
# Start de voorvertoning
helloInfo="Druk op de knop om een foto te maken"
(rpicam-hello -t 0 -p $preview --width $width --height $height --info-text "$helloInfo") &
# Bij het indrukken van een toets wordt de lus onderbroken
while [ "x$keypress" = "x" ]; do
# Lees de toestand van de gebruikte GPIO pin in
button=$(pinctrl get $buttonPin)
if [[ $button == *"lo"* ]]; then # Drukknop ingedrukt
# Stel de bestandnaam van de foto samen
output=$(printf "$directory/Foto%0*d.jpg" 3 $count)
# Stop de voorvertoning
killall rpicam-hello
# Neem de foto
rpicam-still -o $output -p --nopreview --width $width --height $height --info-text "$fotoInfo" --immediate
echo "De terminal blijft 5 seconden actief om de opnames te stoppen met een druk op een toets en de Stop Motion video aan te maken."
sleep 5
# Herstel de voorvertoning
(rpicam-hello -t 0 -p $preview --width $width --height $height --info-text "$helloInfo") &
# Verhoog de foto teller
count=$((count + 1))
fi
# Controleer of er een toets werd ingedrukt
keypress=$(cat -v)
done
# Stop de voorvertoning
killall rpicam-hello
# Bash terug herstellen om tekst in te kunnen typen
if [ -t 0 ]; then stty "$SAVED_STTY"; fi
# De bestandnaam van de aan te maken video
videooutput="$directory/PiCamera.mp4"
# Maak de Stop motion video aan
ffmpeg -r 10 -i $directory/Foto%03d.jpg $videooutput
# Speel de Stop motion video af
ffplay -autoexit $videooutputwhilelus stopt enkel bij het drukken op een toets. Dit werkt echter alleen als het script toetsenbordinformatie kan ontvangen (focus). Dus het Terminal-venster moet actief zijn (focus geven) om het script met een toets te stoppen.Foto%0*d.jpg" 3 $countzal elke foto opslaan met de naam Foto gevolgd door 3 cijfers met voorloopnullen: 001, 002, 003, enz. Daardoor kunnen ze eenvoudig in de juiste volgorde in de video opgenomen worden. Maak ten minste 25 foto's voor een korte stop motion video met allerhande materiaal (gebruik je fantasie). Wie thuis nog LEGO of ander oud speelgoed heeft, kan ook daarmee artistiek aan de slag. Je kunt de beeldfrequentie aanpassen via-r 10(hier 10 beelden per seconde). - Sluit een USB webcam aan en zoek uit hoe je die met de opdracht fswebcam kunt gebruiken.
Ziehier wat extra informatie:
- Eerst installeren we fswebcam:
pi@raspberrypi:~ $
sudo apt install fswebcam
[sudo] wachtwoord voor pi:
Installeren:
fswebcam
Samenvatting:
Opwaarderen: 0, Installeren: 1, Verwijderen: 0, Niet opwaarderen: 0
Downloadgrootte: 48,4 kB
Benodigde ruimte: 160 kB / 6.325 MB beschikbaar
Ophalen:1 http://deb.debian.org/debian trixie/main arm64 fswebcam arm64 20140113-2+b1 [48,4 kB]
48,4 kB opgehaald in 0s (993 kB/s)
Voorheen niet geselecteerd pakket fswebcam wordt geselecteerd.
(Database wordt ingelezen ... 142934 bestanden en mappen momenteel geïnstalleerd.)
Uitpakken van .../fswebcam_20140113-2+b1_arm64.deb wordt voorbereid...
Bezig met uitpakken van fswebcam (20140113-2+b1) ...
Instellen van fswebcam (20140113-2+b1) ...
Bezig met afhandelen van triggers voor man-db (2.13.1-1) ... - Daarna moeten we de gebruiker (hier pi) toegang geven tot het videosysteem:
pi@raspberrypi:~ $
Dit controleren we met de volgende opdracht:sudo usermod -a -G video pipi@raspberrypi:~ $
Om zeker te zijn dat de mogelijkheden van de gebruiker uitgebreid werden, herstart je de Raspberry Pi.groups
pi adm dialout cdrom sudo audio video plugdev games users netdev lpadmin gpio i2c spi render input - Controleer of de webcam door Raspberry Pi OS werd herkend:
pi@raspberrypi:~ $
Hieruit blijkt dat de webcam via de apparaatbestanden /dev/video8, /dev/video9 en /dev/media4 bereikbaar is. Elk apparaatbestand heeft echter zijn eigen functie, zo zal één apparaat instaan voor de beelden en een ander voor de webcam microfoon geluiden en één voor de bediening (instellingen). Dit ga je proefondervindelijk moeten vaststellen.v4l2-ctl --list-devicespispbe (platform:1000880000.pisp_be): /dev/video20 /dev/video21 /dev/video22 /dev/video23 /dev/video24 /dev/video25 /dev/video26 /dev/video27 /dev/video28 /dev/video29 /dev/video30 /dev/video31 /dev/video32 /dev/video33 /dev/video34 /dev/video35 /dev/video36 /dev/video37 /dev/media0 /dev/media1 rp1-cfe (platform:1f00128000.csi): /dev/video0 /dev/video1 /dev/video2 /dev/video3 /dev/video4 /dev/video5 /dev/video6 /dev/video7 /dev/media2 rpivid (platform:rpivid): /dev/video19 /dev/media3 USB 2.0 Camera: HD 720P Webcam (usb-xhci-hcd.0-2): /dev/video8 /dev/video9 /dev/media4 - Met de volgende opdracht maak je een foto met de webcam:
pi@raspberrypi:~ $
Daarbij zorgt de optiefswebcam --skip 5 -r 1280x720 --device /dev/video8 image.jpg
--- Opening /dev/video8...
Trying source module v4l2...
/dev/video8 opened.
No input was specified, using the first.
--- Capturing frame...
Skipping 5 frames...
Capturing 1 frames...
Captured 6 frames in 0.18 seconds. (33 fps)
--- Processing captured image...
Writing JPEG image to 'image.jpg'.--skip 5dat pas de zesde foto wordt opgeslagen. Dit geeft de tijd aan de webcam om de sensor klaar te maken voor een goede foto. Je kunt deze waarde aanpassen om betere resultaten te bekomen.
De optie-r 1280x720stelt de resolutie in op 1280x720.
Het te gebruiken apparaatbestand stel je in met de optie--device /dev/video8. Pas het apparaatbestand proefondervindelijk aan tot het werkt.
Bij het testen bleek met mijn USB webcam dat pas bij de tweede poging een goed belichte foto werd genomen, m.a.w. wees geduldig. - Zorg dat een eerder gemaakt script werkt met de USB webcam.
- Eerst installeren we fswebcam:
- Misschien heb je tijdens deze les inspiratie gekregen om zelf een eigen toepassing te schrijven. Niemand houdt je tegen.
- Wie een kant en klare toepassing wil, kan eens kijken naar RaspiCam.
