Извлечение кадров JPG из потока веб-камеры MJPG с использованием OpenCV - PullRequest
1 голос
/ 07 апреля 2019

Я работаю над Ubuntu 18.04 с Python 2.7 и OpenCV 3.2. Мое приложение является внешним интерфейсом видео-конвейера и влечет за собой извлечение видеокадров из веб-камеры, возможно обрезание и / или вращение их (90, 180, 270 градусов), а затем распространение их на один или несколько других фрагментов кода для дальнейшего обработка. Вся система пытается максимизировать эффективность на каждом этапе, например, улучшать опции для добавления функциональности позже (вычисление мощности и пропускной способности).

Функционально у меня работает интерфейс, но я хочу повысить его эффективность, обрабатывая кадры JPEG, извлеченные из потока MJPEG камеры. Это позволило бы эффективно обрезать и вращать без потерь в области JPEG, например, использование jpegtran-cffi и распределение сжатых кадров, которые меньше соответствующих декодированных. JPEG декодирование будет иметь место, если / когда / где необходимо, с общим ожидаемым усилением. В качестве дополнительного преимущества этот подход позволяет эффективно сохранять видео с веб-камеры без потери качества изображения из-за декодирования + перекодирования.

Проблема, с которой я сталкиваюсь, заключается в том, что класс VideoCapture в OpenCV, по-видимому, не разрешает доступ к потоку MJPEG:

import cv2

cam = cv2.VideoCapture()
cam.open(0)
if not cam.isOpened():
    print("Cannot open camera")
else:
    enabled = True
    while enabled:
        enabled, frame = cam.read()
        # do stuff

Здесь frame всегда в компонентном (т.е. декодированном) формате. Я смотрел на использование cam.grab() + cam.retrieve() вместо cam.read() с тем же результатом (в соответствии с документацией OpenCV). Я также попытался cam.set(cv2.CAP_PROP_CONVERT_RGB, False), но это только преобразовывает декодированное видео в RGB (если оно в другом компонентном формате) и не препятствует декодированию. Кстати, я проверил, что камера использует кодек MJPEG (через cam.get(cv2.CAP_PROP_FOURCC)).

Итак, мои вопросы: я что-то упустил или этот подход не сработает? Если последнее, есть ли альтернатива?

Последний момент: приложение должно иметь возможность управлять веб-камерой в пределах своих возможностей; например, размер кадра, частота кадров, экспозиция, усиление, ... Это хорошо поддерживается cv2.VideoCapture.

Спасибо!

===

Продолжение: в отсутствие решения, которое я искал, я добавил явную кодировку JPEG:

jpeg_frame = cv2.imencode('.jpg', frame, [int(cv2.IMWRITE_JPEG_QUALITY), _JPEG_QUALITY])[1]

с _JPEG_QUALITY, установленным на 90 (из 100). Хотя это добавляет вычислительные возможности и снижает качество изображения, оба в принципе избыточны, это позволяет мне экспериментировать с компромиссами. --KvZ

...