Формат пикселей Video4Linux Y12 для использования с проблемами OpenCV

У меня есть инфракрасная камера AMG88xx, подключенная к Raspberry. PI 4 я использую Linux video-i2c драйвер работает правильно

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

Однако формат выходного пикселя (Y12), похоже, не поддерживается 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

Нужно ли мне собирать OpenCV с дополнительной поддержкой? или как-то преобразовать формат пикселя?


person fireblade    schedule 13.02.2020    source источник
comment
Не могли бы вы запустить камеру с помощью любого приложения, например cheese? Если да, что вы видите на экране?   -  person Yunus Temurlenk    schedule 13.02.2020
comment
я не работаю с рабочим столом, однако я могу получить вывод с камеры на выходной фреймбуфер hdmi через ffmpeg ffmpeg -f rawvideo -pixel_format gray12 -video_size "8x8" -i /dev/video0 -vf histeq,scale=200:200 -f fbdev -pix_fmt bgra /dev/fb0   -  person fireblade    schedule 16.02.2020


Ответы (2)


Вам не нужны OpenCV и cv2.VideoCapture() для чтения этой камеры. Это просто относительно медленное устройство I2C, которое вы можете читать напрямую или с помощью библиотеки Adafruit, как в этот пример.

Во что бы то ни стало, вы можете прочитать его, как указано выше, а затем преобразовать из 12-битного в 8-битный или 16-битный массив Numpy, а затем обработать его с помощью OpenCV, но это не обязательно.

В качестве альтернативы вы можете встроить вызов подпроцесса в ffmpeg, как я сделал во второй части этого ответа.

person Mark Setchell    schedule 13.02.2020
comment
В частности, вам нужны такие строки, как строки 7, 34 и 79 связанного кода. У меня нет этой конкретной камеры для тестирования, поэтому я не могу быть намного более полезным, чем это???? - person Mark Setchell; 13.02.2020
comment
у меня это уже работало, на самом деле это не ответ на вопрос, который я задал - person fireblade; 14.02.2020
comment
Возможно, это была идея упомянуть об этом! Что вы возражаете против такого решения? - person Mark Setchell; 14.02.2020
comment
Я добавил еще один вариант. - person Mark Setchell; 18.02.2020

Проблема была связана с отсутствующим форматом пикселей в OpenCV (см. Issue #16620), исправленным #16626

найдено путем сравнения форматов пикселей video4linux с форматами, поддерживаемыми openCV в modules/videoio/src/cap_v4l.cpp

person fireblade    schedule 28.02.2020