fireblade
fireblade

Reputation: 39

Video4Linux Y12 Pixel Format for use with OpenCV issues

I have a AMG88xx infrared camera attached to a raspberry PI 4 i am using the linux video-i2c driver the driver appears to work correctly

v4l2-ctl -d /dev/video0 --all
    Driver Info:
        Driver name      : video-i2c
        Card type        : I2C 1-104 Transport Video
        Bus info         : I2C:1-104
        Driver version   : 4.19.102
        Capabilities     : 0x85200001
                Video Capture
                Read/Write
                Streaming
                Extended Pix Format
                Device Capabilities
        Device Caps      : 0x05200001
                Video Capture
                Read/Write
                Streaming
                Extended Pix Format
    Priority: 2
    Video input : 0 (Camera: ok)
    Format Video Capture:
        Width/Height      : 8/8
        Pixel Format      : 'Y12 ' (12-bit Greyscale)
        Field             : None
        Bytes per Line    : 16
        Size Image        : 128
        Colorspace        : Raw
        Transfer Function : Default (maps to None)
        YCbCr/HSV Encoding: Default (maps to ITU-R 601)
        Quantization      : Default (maps to Full Range)
        Flags             :
    Streaming Parameters Video Capture:
        Capabilities     : timeperframe
        Frames per second: 10.000 (10/1)
        Read buffers     : 1

However the output pixel format (Y12) appears to be unsupported by openCV

>>> import cv2
>>> capture = cv2.VideoCapture(0)
VIDEOIO ERROR: V4L2: Pixel format of incoming image is unsupported by OpenCV
VIDEOIO ERROR: V4L: can't open camera by index 0

Do I need to build OpenCV with additional support? or somehow convert the pixelformat?

Upvotes: 0

Views: 1543

Answers (2)

fireblade
fireblade

Reputation: 39

Issue was related to missing pixel format in OpenCV (see Issue #16620) fixed by #16626

found by compareing video4linux pixelformats with those supported by openCV in modules/videoio/src/cap_v4l.cpp

Upvotes: 0

Mark Setchell
Mark Setchell

Reputation: 207465

You don't need OpenCV and cv2.VideoCapture() to read that camera. It is just a relatively slow I2C device that you can read directly or using the Adafruit library as in this example.

By all means, you could read it as above and then convert from 12-bit to an 8-bit or 16-bit Numpy array and then process with OpenCV afterwards, but it is not necessary.

Alternatively, you could embed a subprocess call to ffmpeg like I did in the second part of this answer.

Upvotes: 1

Related Questions