Last active
March 28, 2025 13:54
-
-
Save Hermann-SW/e6049fe1a24fc2b5a53c654e0e9f6b9c to your computer and use it in GitHub Desktop.
tool for playing with Raspberry Pi Global Shutter Camera crop values
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# shellcheck disable=SC2154 | |
# (silence shellcheck wrt $cam1 environment variable) | |
if [[ $# -lt 4 ]]; then echo "Format: [narrow=1] [cam1=1] $0 width height framerate ms [us]"; exit; fi | |
if [[ "$(( $1 % 2 ))" -eq 1 ]]; then echo "width has to be even"; exit; fi | |
if [[ "$(( $2 % 2 ))" -eq 1 ]]; then echo "height has to be even"; exit; fi | |
export SHTR=""; if [[ $# -gt 4 ]]; then SHTR="--shutter"; fi | |
export workaround=""; if [[ "" != "$(grep '=bookworm' /etc/os-release)" ]]; then workaround="--no-raw"; fi | |
export d=10; if [[ "" != "$(grep "Revision.*: ...17.$" /proc/cpuinfo)" ]]; then if [[ "$cam1" == "" ]]; then d=10; else d=11; fi; fi | |
for((m=0; m<=5; ++m)) | |
do | |
media-ctl -d /dev/media$m --set-v4l2 "'imx296 $d-001a':0 [fmt:SBGGR10_1X10/${1}x${2} crop:($(( (1440 - $1) / 2 )),$(( (1088 - $2) / 2 )))/${1}x$2]" -v; [ $? -eq 0 ] && break | |
done | |
libcamera-hello --list-cameras ;echo | |
rm -f /dev/shm/tst.pts | |
if [[ "" != "$(grep "Revision.*: ...17.$" /proc/cpuinfo)" ]] | |
then | |
rpicam-vid "$workaround" ${cam1:+--camera 1} --width "$1" --height "$2" --denoise cdn_off --framerate "$3" -t "$4" "$SHTR" "$5" -o /dev/shm/tst${cam1:+1}.mp4 -n ;echo | |
~/venv/bin/python ~/rpicam-apps/utils/timestamp.py --plot ${narrow:+--narrow} /dev/shm/tst${cam1:+1}.mp4 | |
else | |
libcamera-vid "$workaround" --width "$1" --height "$2" --denoise cdn_off --framerate "$3" --save-pts /dev/shm/tst.pts -t "$4" "$SHTR" "$5" -o /dev/shm/tst.h264 -n ;echo | |
rm -f tstamps.csv && ptsanalyze /dev/shm/tst.pts | |
fi |
Two big news for using GScrop.
- running GScrop to set crop, and then directly rpicam-vid with
--codec yuv420
and same width+height allows to process frames on the fly (at 527fps for a simple example) while being captured:
https://forums.raspberrypi.com/viewtopic.php?p=2305225#p2305109 - much bigger frames can be captured @536fps than 224x96 — frameskipless capturing of 1456x96@536fps is possible (yes, full sensor width)! This is 50% reduced in size screenshot of mplayer playing video recorded with GScrop:
https://forums.raspberrypi.com/viewtopic.php?p=2305225#p2305205
- passing optional parameter 100 to GScrop allows to set shutter speed to 100µs:
GScrop 1456 96 536 2000 100
That allows to capture >40m/s inflight airsoft pistol pellet without too much distortion.
This can be seen in two of the 5 frames of below animated .gif (only left frame half, with 1.87ms between frames):
https://forums.raspberrypi.com/viewtopic.php?p=2305225&sid=c396d0ec32f4c37dfd1aa56aa2758dbd#p2305225
The animated .gif only has 256 colors, so makes the frames look uglier than real.
This is the left frame half of last of the 5 frames only as captured for comparison.
A bit dark because of 100µs shutter time, but everything but the >40m/s inflight pellet is sharp:
GScrop can also be used as simple tool to set crop and framerate for other processing.
This posting describes a processing pipeline with all the details:
https://forums.raspberrypi.com/viewtopic.php?p=2306078#p2306078
In short it does this:
- captures 224x96@536fps yuv420 video and pipes to next command
- determines dark/bright for each frame while it is streamed and writes to file "err"
- ffmpeg converts the yuv420 video to .mp4
Despite the quite concurrent processing, recorded framerate only dropped to 527fps from 536fps.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
@paprikodlak Please create a gist named "GScrop.py" and replace your comment above with a short description and link to that gist.
Then it can be found via this gist, but is separate.