Conversion of Gstreamer launch to OpenCV pipeline for camera OV9281

Hi,
I’m trying to convert a gst-launch command to opencv pipeline.
Using the following gst-launch , I am able to launch the camera,

gst-launch-1.0 v4l2src device="/dev/video0" ! “video/x-raw,width=1280,height=800,format=(string)GRAY8” ! videoconvert ! videoscale ! “video/x-raw,width=640,height=400” ! xvimagesink sync=false

Now I need to convert this into Opencv Pipeline. I tried but I always get the following error:

[ WARN:0] global /home/nvidia/host/build_opencv/nv_opencv/modules/videoio/src/cap_gstreamer.cpp (711) open OpenCV | GStreamer warning: Error opening bin: could not parse caps “video/x-raw, , format=(string)GRAY8”
[ WARN:0] global /home/nvidia/host/build_opencv/nv_opencv/modules/videoio/src/cap_gstreamer.cpp (480) isPipelinePlaying OpenCV | GStreamer warning: GStreamer: pipeline have not been created
libpng warning: Image width is zero in IHDR
libpng warning: Image height is zero in IHDR
libpng error: Invalid IHDR data

This is the pipeline I’m trying to run. I know openCV requires BGR format so,

camSet=‘v4l2src device="/dev/video0" ! “video/x-raw,width=1280,height=800,format=(string)GRAY8” ! videoconvert ! “video/x-raw,width=640,height=400,format=BGRx” ! videoconvert ! video/x-raw, format=BGR ! appsink’

cam = cv2.VideoCapture(camSet, cv2.CAP_GSTREAMER)
_, frame = cam.read()
cv2.imwrite(‘test’ +’.png’, frame)

cam.release()

Can anyone assist me with this?

The pipeline string should not have further quoting than start and end. Extra quoting is only required with gst-launch from shell when parenthesis are used.

The image scaling with CPU is not done by videoconvert but by videoscale. So your pipeline would be:

camSet='v4l2src device=/dev/video0 ! video/x-raw,width=1280,height=800,format=GRAY8 ! videoscale ! video/x-raw, width=640, height=400 ! videoconvert ! video/x-raw, format=BGR ! appsink'

You may also use HW scaling and conversion with nvvidconv on Jetson:

camSet='v4l2src device=/dev/video0 ! video/x-raw,width=1280,height=800,format=GRAY8 ! nvvidconv ! video/x-raw(memory:NVMM), format=I420, width=640, height=400 ! nvvidconv ! video/x-raw, format=BGRx ! videoconvert ! video/x-raw, format=BGR ! appsink'
1 Like

I resolved it, forgot to update the question.
I used

camSet = ‘v4l2src device=/dev/video0 ! video/x-raw,width=1280,height=800,format=(string)GRAY8 ! videoconvert ! videoscale ! video/x-raw,width=640,height=400,format=BGR ! appsink’

It gives a warning message though but it works. Thanks for your help. Much appreciated.

Glad to see you’ve moved forward.

Your current pipeline converts many pixels into BGR before scaling into lower resolution. You may save some CPU load scaling first and converting with a lower number of pixels.
You would save even more CPU load with my second pipeline leveraging HW scaling and conversion.

1 Like

I see. I’d definitely try that tomorrow and let you know. Thanks