GStreamer Pan Tilt Zoom and Rotate Element - iMX6 Pipelines

From RidgeRun Developer Wiki


Previous: PC Pipelines Index Next: iMX8 Pipelines





Problems running the pipelines shown on this page? Please see our GStreamer Debugging guide for help.


GStreamer pipelines

The following pipelines will send the resulting video stream via UDP to another computer where it can be displayed.

On receiver computer

HOST='xx.xxx.xx.x'
PORT=5004
gst-launch-1.0 udpsrc address=$HOST port=$PORT ! tsparse ! tsdemux ! h264parse ! avdec_h264 ! videoconvert ! identity silent=false ! autovideosink -v

On board

Same input and output resolution with zoom level 1:

CAPTURE_CAPS='video/x-raw,width=640,height=480,framerate=30/1'
IN_CAPS='video/x-raw,format=RGBA,width=640,height=480,framerate=30/1'
OUT_CAPS='video/x-raw,width=640,height=480'
PORT=5004
HOST=<IP address>
gst-launch-1.0 videotestsrc is-live=true num-buffers=-1 ! $IN_CAPS ! imxg2dvideotransform ! $IN_CAPS ! ptzr ! $OUT_CAPS ! imxipuvideotransform input-crop=false ! $OUT_CAPS ! imxvpuenc_h264 bitrate=4000 gop-size=15 idr-interval=15 ! mpegtsmux alignment=7 ! udpsink port=$PORT host=$HOST

You can change the zoom level by changing "zoom-level".

Magnification (zoom level > 1):

CAPTURE_CAPS='video/x-raw,width=640,height=480,framerate=30/1'
IN_CAPS='video/x-raw,format=RGBA,width=640,height=480,framerate=30/1'
OUT_CAPS='video/x-raw,width=640,height=480'
PORT=5004
HOST=<IP address>

gst-launch-1.0 videotestsrc is-live=true num-buffers=-1 ! $IN_CAPS ! imxg2dvideotransform ! $IN_CAPS ! ptzr zoom-level=2 ! $OUT_CAPS ! imxipuvideotransform input-crop=false ! $OUT_CAPS ! imxvpuenc_h264 bitrate=4000 gop-size=15 idr-interval=15 ! mpegtsmux alignment=7 ! udpsink port=$PORT host=$HOST

You can perform translations relative to the center of the input image by setting the "pan-level" and "tilt-level" properties or perform translations relative to the current position with "pan-delta" and "tilt-delta". The element supports input and output of any resolution and aspect ratio.

Translate right (-1 < pan level < 0):

CAPTURE_CAPS='video/x-raw,width=640,height=480,framerate=30/1'
IN_CAPS='video/x-raw,format=RGBA,width=640,height=480,framerate=30/1'
OUT_CAPS='video/x-raw,width=320,height=240'
PORT=5004
HOST=<IP address>

gst-launch-1.0 videotestsrc is-live=true num-buffers=-1 ! $IN_CAPS ! imxg2dvideotransform ! $IN_CAPS ! ptzr pan-level=-1 ! $OUT_CAPS ! imxipuvideotransform input-crop=false ! $OUT_CAPS ! imxvpuenc_h264 bitrate=4000 gop-size=15 idr-interval=15 ! mpegtsmux alignment=7 ! udpsink port=$PORT host=$HOST

Translate left (0 < pan level < 1):

CAPTURE_CAPS='video/x-raw,width=640,height=480,framerate=30/1'
IN_CAPS='video/x-raw,format=RGBA,width=640,height=480,framerate=30/1'
OUT_CAPS='video/x-raw,width=320,height=240'
PORT=5004
HOST=<IP address>

gst-launch-1.0 videotestsrc is-live=true num-buffers=-1 ! $IN_CAPS ! imxg2dvideotransform ! $IN_CAPS ! ptzr pan-level=1 ! $OUT_CAPS ! imxipuvideotransform input-crop=false ! $OUT_CAPS ! imxvpuenc_h264 bitrate=4000 gop-size=15 idr-interval=15 ! mpegtsmux alignment=7 ! udpsink port=$PORT host=$HOST

Translate down (-1 < tilt level < 0):

CAPTURE_CAPS='video/x-raw,width=640,height=480,framerate=30/1'
IN_CAPS='video/x-raw,format=RGBA,width=640,height=480,framerate=30/1'
OUT_CAPS='video/x-raw,width=320,height=240'
PORT=5004
HOST=<IP address>

gst-launch-1.0 videotestsrc is-live=true num-buffers=-1 ! $IN_CAPS ! imxg2dvideotransform ! $IN_CAPS ! ptzr tilt-level=-1 ! $OUT_CAPS ! imxipuvideotransform input-crop=false ! $OUT_CAPS ! imxvpuenc_h264 bitrate=4000 gop-size=15 idr-interval=15 ! mpegtsmux alignment=7 ! udpsink port=$PORT host=$HOST

Translate up (0 < tilt level < 1):

CAPTURE_CAPS='video/x-raw,width=640,height=480,framerate=30/1'
IN_CAPS='video/x-raw,format=RGBA,width=640,height=480,framerate=30/1'
OUT_CAPS='video/x-raw,width=320,height=240'
PORT=5004
HOST=<IP address>

gst-launch-1.0 videotestsrc is-live=true num-buffers=-1 ! $IN_CAPS ! imxg2dvideotransform ! $IN_CAPS ! ptzr tilt-level=1 ! $OUT_CAPS ! imxipuvideotransform input-crop=false ! $OUT_CAPS ! imxvpuenc_h264 bitrate=4000 gop-size=15 idr-interval=15 ! mpegtsmux alignment=7 ! udpsink port=$PORT host=$HOST

The property "normalize-translation" (true by default) lets you switch the translation normalization ON and OFF. When translation normalization is true the minimum and maximum translation values are mapped to -1 and 1. On the other hand, when it is set to false, the pan and tilt levels reflect pixels on the input image.

Turn off translation normalization:

CAPTURE_CAPS='video/x-raw,width=640,height=480,framerate=30/1'
IN_CAPS='video/x-raw,format=RGBA,width=640,height=480,framerate=30/1'
OUT_CAPS='video/x-raw,width=320,height=240'
PORT=5004
HOST=<IP address>

gst-launch-1.0 videotestsrc is-live=true num-buffers=-1 ! $IN_CAPS ! imxg2dvideotransform ! $IN_CAPS ! ptzr normalize-translation=false ! $OUT_CAPS ! imxipuvideotransform input-crop=false ! $OUT_CAPS ! imxvpuenc_h264 bitrate=4000 gop-size=15 idr-interval=15 ! mpegtsmux alignment=7 ! udpsink port=$PORT host=$HOST

The property "output-reference" (true by default) lets you change the coordinate system used as reference for translations. This is specially useful after performing a rotation. If you want to move over the input image axis, it must be changed to false.

Set input coordinate system as reference for translations:

CAPTURE_CAPS='video/x-raw,width=640,height=480,framerate=30/1'
IN_CAPS='video/x-raw,format=RGBA,width=640,height=480,framerate=30/1'
OUT_CAPS='video/x-raw,width=320,height=240'
PORT=5004
HOST=<IP address>

gst-launch-1.0 videotestsrc is-live=true num-buffers=-1 ! $IN_CAPS ! imxg2dvideotransform ! $IN_CAPS ! ptzr output-reference=false ! $OUT_CAPS ! imxipuvideotransform input-crop=false ! $OUT_CAPS ! imxvpuenc_h264 bitrate=4000 gop-size=15 idr-interval=15 ! mpegtsmux alignment=7 ! udpsink port=$PORT host=$HOST

To rotate the input modify the "rotate-level" property (degrees). You can also perform rotation relative to the current angle with "rotate-delta":

Rotate counter-clockwise (rotate level < 0):

CAPTURE_CAPS='video/x-raw,width=640,height=480,framerate=30/1'
IN_CAPS='video/x-raw,format=RGBA,width=640,height=480,framerate=30/1'
OUT_CAPS='video/x-raw,width=320,height=240'
PORT=5004
HOST=<IP address>

gst-launch-1.0 videotestsrc is-live=true num-buffers=-1 ! $IN_CAPS ! imxg2dvideotransform ! $IN_CAPS ! ptzr rotate-level=-100 ! $OUT_CAPS ! imxipuvideotransform input-crop=false ! $OUT_CAPS ! imxvpuenc_h264 bitrate=4000 gop-size=15 idr-interval=15 ! mpegtsmux alignment=7 ! udpsink port=$PORT host=$HOST

Rotate clockwise (rotate level > 0):

CAPTURE_CAPS='video/x-raw,width=640,height=480,framerate=30/1'
IN_CAPS='video/x-raw,format=RGBA,width=640,height=480,framerate=30/1'
OUT_CAPS='video/x-raw,width=320,height=240'
PORT=5004
HOST=<IP address>

gst-launch-1.0 videotestsrc is-live=true num-buffers=-1 ! $IN_CAPS ! imxg2dvideotransform ! $IN_CAPS ! ptzr rotate-level=100 ! $OUT_CAPS ! imxipuvideotransform input-crop=false ! $OUT_CAPS ! imxvpuenc_h264 bitrate=4000 gop-size=15 idr-interval=15 ! mpegtsmux alignment=7 ! udpsink port=$PORT host=$HOST

Gstd pipelines

Run the element with gstd to change parameters dynamically:

CAPTURE_CAPS='video/x-raw,width=640,height=480,framerate=30/1'
IN_CAPS='video/x-raw,format=RGBA,width=640,height=480,framerate=30/1'
OUT_CAPS='video/x-raw,width=320,height=240'
PORT=5004
HOST=<IP address>
gstd&
gstd-client pipeline_create p0 videotestsrc is-live=true num-buffers=-1 ! $IN_CAPS ! imxg2dvideotransform ! $IN_CAPS ! ptzr name=ptzr0 ! $OUT_CAPS ! imxipuvideotransform input-crop=false ! $OUT_CAPS ! imxvpuenc_h264 bitrate=4000 gop-size=15 idr-interval=15 ! mpegtsmux alignment=7 ! udpsink port=$PORT host=$HOST
gstd-client pipeline_play p0

Change propierties:

gstd-client element_set p0 "ptzr0 zoom-level 0.0" 
gstd-client element_set p0 "ptzr0 zoom-level 2.0" 
gstd-client element_set p0 "ptzr0 zoom-level 1.0" 
gstd-client element_set p0 "ptzr0 tilt-level -1.0" 
gstd-client element_set p0 "ptzr0 tilt-level 1.0" 
gstd-client element_set p0 "ptzr0 tilt-level 0.0" 
gstd-client element_set p0 "ptzr0 pan-level -1.0" 
gstd-client element_set p0 "ptzr0 pan-level 1.0" 
gstd-client element_set p0 "ptzr0 pan-level 0.0" 
gstd-client element_set p0 "ptzr0 tilt-delta -1.0" 
gstd-client element_set p0 "ptzr0 tilt-delta 1.0" 
gstd-client element_set p0 "ptzr0 tilt-delta 0.0" 
gstd-client element_set p0 "ptzr0 pan-delta -1.0" 
gstd-client element_set p0 "ptzr0 pan-delta 1.0" 
gstd-client element_set p0 "ptzr0 pan-delta 0.0" 
gstd-client element_set p0 "ptzr0 rotate-level -90.0" 
gstd-client element_set p0 "ptzr0 rotate-level 90.0" 
gstd-client element_set p0 "ptzr0 rotate-level 0.0" 
gstd-client element_set p0 "ptzr0 rotate-delta -90.0" 
gstd-client element_set p0 "ptzr0 rotate-delta 90.0" 
gstd-client element_set p0 "ptzr0 rotate-delta 0.0" 
gstd-client element_set p0 "ptzr0 normalize-translation false" 
gstd-client element_set p0 "ptzr0 normalize-translation true" 
gstd-client element_set p0 "ptzr0 output-reference false" 
gstd-client element_set p0 "ptzr0 output-reference true"

Stop the pipeline:

gstd-client pipeline_stop p0
gstd-client pipeline_delete p0


Previous: PC Pipelines Index Next: iMX8 Pipelines