Skip to content

Instantly share code, notes, and snippets.

@Hermann-SW
Last active December 13, 2025 21:11
Show Gist options
  • Select an option

  • Save Hermann-SW/e6049fe1a24fc2b5a53c654e0e9f6b9c to your computer and use it in GitHub Desktop.

Select an option

Save Hermann-SW/e6049fe1a24fc2b5a53c654e0e9f6b9c to your computer and use it in GitHub Desktop.
tool for playing with Raspberry Pi Global Shutter Camera crop values
#!/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
@Hermann-SW
Copy link
Author

Hermann-SW commented Mar 28, 2025

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:

  1. captures 224x96@536fps yuv420 video and pipes to next command
  2. determines dark/bright for each frame while it is streamed and writes to file "err"
  3. ffmpeg converts the yuv420 video to .mp4

image

Despite the quite concurrent processing, recorded framerate only dropped to 527fps from 536fps.

@paprikodlak
Copy link

Dear all, especially @Hermann-SW,
I'm happy to report that we bought the new ArduCAM 1.58MP IMX296 Color Global Shutter Camera and it is a functional plug-n-play replacement for the RPi GS Cam, though I'm not able to provide direct quality comparison. In our application, we are quite space constrained and were using M12 lens anyway, so we are quite excited with this news.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment